web-dev-qa-db-ja.com

Scipyスパース行列の乗算

私はnumpy配列を使用した行列乗算のこの例を持っています:

import numpy as np
m = np.array([[1,2,3],[4,5,6],[7,8,9]])
c = np.array([0,1,2])
m * c
array([[ 0,  2,  6],
       [ 0,  5, 12],
       [ 0,  8, 18]])

Mがscipy sparse CSR matrixの場合、どうすれば同じことができますか?これにより、寸法が一致しなくなります。

sp.sparse.csr_matrix(m)*sp.sparse.csr_matrix(c)
8

csr_matrixmultiplyメソッドを呼び出して、ポイントごとの乗算を行うことができます。

sparse.csr_matrix(m).multiply(sparse.csr_matrix(c)).todense()

# matrix([[ 0,  2,  6],
#         [ 0,  5, 12],
#         [ 0,  8, 18]], dtype=int64)
11
Elliot

mcが数の多い配列の場合、m * cは「行列乗算」ではありません。もしそうなら、あなたは間違いをしているのかもしれません。行列の乗算を取得するには、numpyのmatrixやscipy.sparse行列クラスなどの行列クラスを使用します。

失敗の原因は、マトリックスの観点からcが1x3マトリックスであることです。

c = np.matrix([0, 1, 2]) 
c.shape    # (1,3)

c = sp.csc_matrix([0, 1, 2])
c.shape    # (1,3)

cとの行列乗算が必要な場合は、転置を使用する必要があります。

c = np.matrix([0, 1, 2]).transpose()
c.shape    # (3,1)

m = np.matrix([[1,2,3],[4,5,6],[7,8,9]])
m.shape    # (3,3)

m * c
# matrix([[ 8],
#         [17],
#         [26]])
0
kingaj