比较两个numpy数组

时间:2015-06-03 05:10:13

标签: python arrays numpy

我有两个numpy 2d阵列(比如A& B,有时大小相等或有时不相等)。我需要比较两个数组的第一列,并找到两个数组中出现的元素的索引。

下面显示的代码为我提供了解决方案,只要两个数组的大小不同,并且B中的所有元素都不存在。

C=np.squeeze(A[np.array(np.where(np.in1d(A[:,0],B[:,1]))).T],axis=None)

但是,只要A的所有元素都存在于B中,它就是不正确的。

有人可以建议解决方案吗?

2 个答案:

答案 0 :(得分:1)

如果A和B如下:

A=np.random.randint(0,5,(10,8))
B=np.random.randint(3,7,(10,8))
>>> A
array([[4, 4, 2, 1, 4, 3, 1, 2],
       [1, 1, 1, 2, 0, 3, 0, 4],
       [4, 3, 1, 1, 2, 1, 1, 3],
       [3, 4, 3, 0, 3, 4, 2, 0],
       [4, 1, 3, 0, 1, 4, 1, 2],
       [1, 1, 1, 2, 2, 2, 0, 2],
       [4, 3, 4, 2, 3, 2, 3, 2],
       [4, 1, 4, 0, 3, 1, 2, 3],
       [3, 2, 3, 2, 4, 4, 4, 2],
       [0, 1, 4, 0, 2, 2, 1, 4]])
>>> B
array([[4, 3, 5, 6, 4, 6, 3, 5],
       [6, 3, 4, 4, 4, 6, 5, 4],
       [5, 4, 5, 5, 5, 6, 3, 3],
       [3, 5, 6, 5, 5, 5, 3, 6],
       [5, 6, 5, 3, 5, 5, 5, 3],
       [3, 3, 5, 3, 5, 6, 6, 3],
       [6, 6, 6, 4, 6, 3, 4, 6],
       [4, 4, 3, 5, 6, 6, 3, 3],
       [5, 3, 4, 5, 3, 5, 5, 6],
       [4, 3, 3, 6, 6, 4, 3, 4]])

您可以使用intersect1d查找

中的值
np.intersect1d(A,B)
array([3, 4])

然后argwhere查找值的索引,例如A的第0列:

[np.argwhere(x==A[:,0]) for x in np.intersect1d(A,B)] 

返回

[array([[3],
   [8]]), array([[0],
   [2],
   [4],
   [6],
   [7]])]

答案 1 :(得分:0)

import numpy as np

A=np.array([[4, 4, 2, 1, 4, 3, 1, 2],
       [1, 1, 1, 2, 0, 3, 0],
       [4, 3, 1, 1, 2, 1, 1],
       [3, 4, 3, 0, 3, 4, 2],
       [4, 1, 3, 0, 1, 4, 1],
       [1, 1, 1, 2, 2, 2, 0],
       [4, 3, 4, 2, 3, 2, 3],
       [4, 1, 4, 0, 3, 1, 2],
       [3, 2, 3, 2, 4, 4, 4],
       [0, 1, 4, 0, 2, 2, 1]])

B=np.array([[4, 3, 5, 6, 4, 6, 3, 5],
       [6, 3, 4, 4, 4, 6, 5, 4],
       [5, 4, 5, 5, 5, 6, 3, 3],
       [3, 5, 6, 5, 5, 5, 3, 6],
       [5, 6, 5, 3, 5, 5, 5, 3],
       [3, 3, 5, 3, 5, 6, 6, 3],
       [6, 6, 6, 4, 6, 3, 4, 6],
       [4, 4, 3, 5, 6, 6, 3, 3],
       [5, 3, 4, 5, 3, 5, 5, 6],
       [4, 3, 3, 6, 6, 4, 3, 4]])

matched = A.T[0][A.T[0] == B.T[0]]

>> [4,3,4]