2016-06-22 89 views
0

我有兩個陣列,如下:計數匹配值

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個點擊,因爲b的第一行和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

爲什麼您刪除此問題的前一個版本,而不是簡單地更新它? – Prune

+0

更新了問題。我刪除,因爲我不知道是否有人把它關閉會得到知名度或不 – Baktaawar

回答

1

你的關鍵的問題是檢查的「非零」值是相等的:你需要一個這裏,不==

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

這就產生了期望的結果。

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 
+0

謝謝你的作品。我也試過這個,如果我使用任何() sum = 0 (範圍爲b.shape [0]): e = np.array(np.nonzero(b [x ,:]! = 0)) f = np.array(np.nonzero(c [:,x]!= 0)) print e print f sum + = np.sum(e.any()== f.any )) 總和 – Baktaawar

+0

我有一個除了這個。如果在數組c中計數(1 /索引位置),而不是隻計數1那裏存在非零相同的索引位置匹配。因此,基本上只要在兩個數組之間的相同索引位置存在非零值匹配的情況下,就可以在發生匹配的位置添加1 /索引位置 – Baktaawar

+0

生成具有所需布爾值的向量;你應該能夠弄清楚如何在矢量上對索引** N **求和1/** N + 1 **。 – Prune