计算相同索引位置处的两个数组之间的匹配并且具有非零值

时间:2016-06-22 23:20:57

标签: python numpy

我有两个数组如下:

b = array([[1, 0, 1],
           [0, 0, 1]])

c = array([[ 0.5 ,  0.  ],
           [ 0.34,  1.  ],
           [ 0.  ,  1.  ]])

如何根据相同的索引值计算两个数组的匹配值,并且数组的元素值不应为零。这里匹配的值是基于元素的索引而不是确切的值。

例如。在上面的矩阵中,我的两个数组是b行和c的相应列。如果你看到,c中的0.5 c [0,0]与b的1(b [0,0])匹配。该值不匹配,但由于它们是非零值并且存在于相应数组中的相同位置(均出现在第0个索引处),因此应对其进行计数。如果任一数组位置的值为零,则不会计算它。

对于上面的矩阵,我应该得到2次点击,因为c的第一行和c的第一列只有一个值有共同的非零元素:b [0,0]或c [0,0]。类似地,第二行b与第二列c:b [1,2]或c [2,1]

匹配

我尝试了下面的代码,但是它给出了3而不是2.因为它也计算了这两个位置都有0作为值并且它也匹配的情况。我想在两个数组中的相同位置处使用非零值。

sum=0
for x in range(b.shape[0]):
    sum+=np.sum((b[x,:]==0) == (c[:,x]==0))

然后我尝试了这个:这将首先获得两个数组的非零索引然后进行比较。但它给出了一个错误。

sum=0
for x in range(b.shape[0]):
    sum+= np.sum((np.nonzero(b[x,:]!=0)) == (np.nonzero(c[:,x]!=0)))


ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

1 个答案:

答案 0 :(得分:2)

你的关键问题是检查"非零"值相等:此处需要,而不是 ==

    sum += np.sum((b[x,:]!=0) & (c[:,x]!=0))

这会产生 2 的理想结果。

import numpy as np

b = np.array([[1, 0, 1],
           [0, 0, 1]])

c = np.array([[ 0.5 ,  0.  ],
           [ 0.34,  1.  ],
           [ 0.  ,  1.  ]])

sum=0
for x in range(b.shape[0]):
    print "row/col", x
    print b[x,:]!=0
    print c[:,x]!=0
    sum+=np.sum((b[x,:]!=0) & (c[:,x]!=0))

print sum