ので
In [114]: data=[4,1,2,2,1,1,4,3,2]
In [115]: col=[0,1,1,2,2,3,4,4,4]
In [116]: row=[2,0,4,0,3,5,0,2,3]
In [117]: M=sparse.csr_matrix((data,(col,row)))
In [118]: M
Out[118]:
<5x6 sparse matrix of type '<type 'numpy.int32'>'
with 9 stored elements in Compressed Sparse Row format>
In [119]: M.A
Out[119]:
array([[0, 0, 4, 0, 0, 0],
[1, 0, 0, 0, 2, 0],
[2, 0, 0, 1, 0, 0],
[0, 0, 0, 0, 0, 1],
[4, 0, 3, 2, 0, 0]])
In [121]: center=np.array([[0,1,2,2,4,1],[3,4,1,2,4,0]])
それでは、どのように距離を計算した(あまりにも悪いあなたは、私がコピー-N-ペーストができ、入力を与えていない)のは、あなたの行列を作成してみましょうか? M.A
が(5,6)であり、center
が(2,6)である。これら2つの配列で何をしているのかは明らかではありません。
「生の」スパース値へのアクセスに関しては、coo
形式が最もわかりやすいです。それは私がマトリックス
In [131]: M.tocoo().data
Out[131]: array([4, 1, 2, 2, 1, 1, 4, 3, 2])
In [132]: M.tocoo().col
Out[132]: array([2, 0, 4, 0, 3, 5, 0, 2, 3])
In [133]: M.tocoo().row
Out[133]: array([0, 1, 1, 2, 2, 3, 4, 4, 4])
csr
格納data
、indices
とindptr
アレイで同じ情報を作成するために使用される同一の行、列、データのものです。しかし、最後の2からのi,j
の値を引き出すために数学をする必要があります。csr
これらの配列をうまく利用する乗算ルーチンです。
一般に、加算/減算よりもcsr
行列を乗算する方が良いです。
さらに詳しい説明が必要です。私たちが行う必要がある何
spatial.distance.cdist(center,M.A, 'euclidean')
Out[156]:
array([[ 5.09901951, 3.87298335, 5.19615242, 5. , 5.91607978],
[ 7.34846923, 5.38516481, 5.91607978, 6.8556546 , 6.08276253]])
この機能を研究し、その入力を理解しています。私たちはドキュメントを超えてコードを見なければならないかもしれません。
このコードを見ると、xB
が2dの配列であり、同じ数の列がxA
であることを確認する手順があります。その後euclidian
のためには、いくつかのCコードのラッパーのように見えます
_distance_wrap.cdist_euclidean_wrap(_convert_to_double(XA),
_convert_to_double(XB), dm)
を呼び出します。私はそれを疎な行列にする方法を想像することはできません。
行を反復処理できます。 dist
をM[[0],:].A
と呼ぶのは、速度を除いてM.A[[0],:]
と同じです。スパース行列の行を反復することは、それぞれの反復で新しいスパース行列を構築する必要があるため、それほど遅くはありません。 csr
およびlil
は、行の反復処理で2番目に高速です。私は時間のテストをスキップします今のところ
def foo(a,b,n):
# make a dense array from data,row
res = np.zeros((1,n))
res[0,b]=a
return res
In [190]: Ml=M.tolil()
In [191]: Ml.data
Out[191]: array([[4], [1, 2], [2, 1], [1], [4, 3, 2]], dtype=object)
In [192]: Ml.rows
Out[192]: array([[2], [0, 4], [0, 3], [5], [0, 2, 3]], dtype=object)
In [193]: rowgen=(foo(a,b,6) for a,b in zip(Ml.data,Ml.rows))
In [194]: np.concatenate([spatial.distance.cdist(center,row, 'euclidean') for row in rowgen],axis=1)
Out[194]:
array([[ 5.09901951, 3.87298335, 5.19615242, 5. , 5.91607978],
[ 7.34846923, 5.38516481, 5.91607978, 6.8556546 , 6.08276253]])
:直接lil
形式の属性に反復 -
はここで速いかもしれない何か。
? – Alexander
@Alexander私は編集しました。私は 'scipy.spatial.distance.cdist(center、data_csr、 'euclidean')'を使用します。 –
上記の距離を計算するために結果を複製することはできません。マトリックスからデータを抽出する方法については、この記事を参照してください。これは私が持っている限りです。 http://stackoverflow.com/questions/36587702/convert-sparse-matrix-csc-matrix-to-pandas-dataframe/36587845#36587845 – Alexander