2012-11-22 46 views
2

我有兩個numpy的矩陣(或稀疏當量),如:的elementwise在Python(numpy的)平均點積

>>> A = numpy.array([[1,0,2],[3,0,0],[4,5,0],[0,2,2]]) 
>>> A 
array([[1, 0, 2], 
     [3, 0, 0], 
     [4, 5, 0], 
     [0, 2, 2]]) 
>>> B = numpy.array([[2,3],[3,4],[5,0]]) 
>>> B 
array([[2, 3], 
     [3, 4], 
     [5, 0]]) 

>>> C = mean_dot_product(A, B) 
>>> C 
array([[6 , 3], 
     [6 , 9], 
     [11.5, 16], 
     [8 , 8]]) 

其中C[i, j] = sum(A[i,k] * B[k,j])/count_nonzero(A[i,k] * B[k,j])

有瓶坯在numpy的這種操作的快捷方式?

非理想的解決方案是:

>>> maskA = A > 0 
>>> maskB = B > 0 

>>> maskA.dtype=numpy.uint8 
>>> maskB.dtype=numpy.uint8 

>>> D = replace_zeros_with_ones(numpy.dot(maskA,maskB)) 

>>> C = numpy.dot(A,B)/D 

任何人都有一個更好的算法?另外,如果A或B是稀疏矩陣,使它們變得密集(用零代替零)會使內存佔用暴增!

回答

1

爲什麼你需要replace_zeros_with_ones?我刪除這一行並運行你的代碼,並得到正確的結果。

可以只由一個行,如果所有的數字都沒有negtaive做到這一點:

np.dot(A, B)/np.dot(np.sign(A), np.sign(B)) 
+0

'默認numpy.sign'產生簽訂'int64'陣(0,+ 1,-1),要使用該函數得到相同的結果,你應該使用'numpy.sign(A,dtype = numpy.uint8)'。然後你必須用0代替零,以避免0/0(在我的例子中'np.dot(np.sign(A),np.sign(B))'中不存在零) – dvdios