在python中我该怎么做:
说我有:
a = [[1, 5], [2,6], [3,3], [4,2]]
b= [[3, 1], [4,2], [1,8], [2,4]]
现在我想在第一列值匹配时使用第二列值进行操作。
E.G。
a有一个条目[ 1 ,5],现在通过b查看哦它有一个值[ 1 ,8],现在我要划分5 / 8并将该值存储到say array c中。接下来将匹配[ 2 ,6]和[ 2 ,4]并获取c:6/4中的下一个值。
这样:
c = [5/8, 6/4, 3/1, 2/2]
鉴于上述例子。我希望这是有道理的。想用numpy和python来做这个。
答案 0 :(得分:4)
您可以使用np.searchsorted
获取b
的第一列元素与a
的第一列元素对应的位置,然后使用它获取相应的第二列元素进行划分最后得到c
。因此,假设a
和b
为NumPy数组,向量化实现将为 -
a0 = a[:,0]
c = np.true_divide(a[:,1],b[np.searchsorted(a0,b[:,0],sorter=a0.argsort()),1])
当a
的第一列元素未必排序时,上面列出的方法适用于一般情况。但是,如果它们的排序方式与列出的示例案例类似,那么您可以简单地忽略sorter
输入参数并使用简化的解决方案,如此 -
c = np.true_divide(a[:,1],b[np.searchsorted(a0,b[:,0]),1])
示例运行 -
In [35]: a
Out[35]:
array([[1, 5],
[2, 6],
[3, 3],
[4, 2]])
In [36]: b
Out[36]:
array([[3, 1],
[4, 2],
[1, 8],
[2, 4]])
In [37]: a0 = a[:,0]
In [38]: np.true_divide(a[:,1],b[np.searchsorted(a0,b[:,0],sorter=a0.argsort()),1])
Out[38]: array([ 0.625, 1.5 , 3. , 1. ])
答案 1 :(得分:4)
鉴于评论部分中的所有假设,这将起作用:
from operator import itemgetter
from __future__ import division
a = [[1, 5], [2,6], [3,3], [4,2]]
b = [[3, 1], [4,2], [1,8], [2,4]]
result = [x / y for (_, x), (_, y) in zip(a, sorted(b, key=itemgetter(0)))]
假设:列表具有相同的长度,第一个位置的元素对于每个列表是唯一的,第一个列表按第一个元素排序,a
中第一个位置出现的每个元素也出现在第一个位置b
。
答案 2 :(得分:1)
您可以使用嵌套循环的简单O(n^2)
方式:
c = []
for x in a:
for y in b:
if x[0] == y[0]:
c.append(x[1]/y[1])
break
当列表很小时,上述内容非常有用。对于大型列表,请考虑基于字典的方法,其中复杂性为O(n),代价是额外的空间。
答案 3 :(得分:0)
我谦卑地建议您使用错误的数据结构。请注意,如果您的数组列具有介于1和N之间的唯一值(索引列),则只需重新排序其他列即可对相同数据进行编码。一旦您重新订购了数据,您不仅可以删除"索引"列,但现在更容易操作剩余的数据。让我演示一下:
import numpy as np
N = 5
a = np.array([[1, 5], [2,6], [3,3], [4,2]])
b = np.array([[3, 1], [4,2], [1,8], [2,4]])
a_trans = np.ones(N)
a_trans[a[:, 0]] = a[:, 1]
b_trans = np.ones(N)
b_trans[b[:, 0]] = b[:, 1]
c = a_trans / b_trans
print c
根据问题的性质,您有时可以从头开始使用隐式索引,但有时显式索引可能非常有用。如果您需要显式索引,请考虑使用类似pandas.DataFrame
的内容,以更好地支持索引操作。