2

次のような 2 つの 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 が疎行列の場合、それらを密にする (0 を 1 に置き換える) と、メモリ占有量が爆発的に増加します。

4

1 に答える 1

1

なぜあなたが必要なのreplace_zeros_with_onesですか?この行を削除してコードを実行すると、正しい結果が得られます。

すべての数値が負でない場合は、1 行だけでこれを行うことができます。

np.dot(A, B)/np.dot(np.sign(A), np.sign(B))
于 2012-11-22T23:15:44.213 に答える