我有两个数组如下:
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()
答案 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