単純なベクトル行列の乗算では、密行列の代わりにscipy.sparse行列を使用すると、異なる結果/出力形式が得られます。私は、次の予想される出力を得るベクトル行列積について疎と密行列間のベクトル行列積の差
import numpy as np
from scipy import sparse
mat = np.array([[1, 1, 0, 0, 0], [0, 2, 2, 0, 0], [0, 0, 3, 3, 0], [0, 0, 0, 4, 4]])
vec = np.arange(1, 5)
:私は、次の密行列とベクトルを使用する例として
vec.dot(mat) # array([ 1, 5, 13, 25, 16])
mat.T.dot(vec) # array([ 1, 5, 13, 25, 16])
mat.T.dot(vec.T) # array([ 1, 5, 13, 25, 16])
を私がベクトルならば、それは役割を果たしていないことを受け入れます転置されているか否か。私は疎行列mat_sparse
によってマトリックスmat
を交換する場合には、私は入手転置行列のトリックを使用して、すなわち[1x mat_sparse, 2x mat_sparse, ...]
mat_sparse = sparse.lil_matrix(mat)
vec.dot(mat_sparse) # array([ <4x5 sparse matrix of type '<type 'numpy.int64'>' with 8 stored elements in LInked List format>, ...], dtype=object)
、結果として、各ベクトル成分を乗じ疎行列を含むスパース4×5の行列のアレイを得ます期待される結果:
mat_sparse.T.dot(vec4.T) # array([ 1, 5, 13, 25, 16])
誰かがこの動作が期待される理由を説明できますか?行列mat
(実際には2次元配列)をnp.matrix(mat
のインスタンスに置き換えても、結果は変更されません。
配列を行列で置き換えるとき、つまり 'mat2 = np.matrix(np。配列([[1,1,0,0,0]、[0,2,2,0,0]、[0,0,3,3,0]、[0,0,0,4,4] ])) '私は' matrix([[1,5、13、25、16]]) 'を得る。だから私はスパース行列を使用するときにスパース行列を得ることを期待しますが、代わりにスパース行列の配列を取得します。 私は約50000 x 50000のスパース行列を使うので、 'todense()'を使うことはできません。 – murban