我有两个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代替零)会使内存占用成为可能!
答案 0 :(得分:1)
为什么需要replace_zeros_with_ones
?我删除了这一行并运行您的代码并获得正确的结果。
如果所有数字都不是负数,则只能通过一行执行此操作:
np.dot(A, B)/np.dot(np.sign(A), np.sign(B))