检查数组元素是否相等

时间:2016-05-16 18:12:20

标签: python numpy

在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来做这个。

4 个答案:

答案 0 :(得分:4)

您可以使用np.searchsorted获取b的第一列元素与a的第一列元素对应的位置,然后使用它获取相应的第二列元素进行划分最后得到c。因此,假设ab为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的内容,以更好地支持索引操作。