データレイアウトは珍しいものです。ここに私の最初の刺し傷があります。
In [565]: M = sparse.lil_matrix((2,4), dtype=int)
In [566]: M
Out[566]:
<2x4 sparse matrix of type '<class 'numpy.int32'>'
with 0 stored elements in LInked List format>
In [567]: for i,row in enumerate(alist):
...: for col in row:
...: M[i, col[0]] = col[1]
...:
In [568]: M
Out[568]:
<2x4 sparse matrix of type '<class 'numpy.int32'>'
with 3 stored elements in LInked List format>
In [569]: M.A
Out[569]:
array([[ 0, 10, 0, -3],
[ 0, 0, 12, 0]])
はい、反復です。そのためにはlil
が最適です。
または入力の共通coo
スタイルを使用して:つまり
、で始まる:
別のオプションが空白
lil
マトリックスを作成し、直接その属性を記入することです
In [580]: data,col,row = [],[],[]
In [581]: for i, rr in enumerate(alist):
...: for cc in rr:
...: row.append(i)
...: col.append(cc[0])
...: data.append(cc[1])
...:
In [582]: data,col,row
Out[582]: ([10, -3, 12], [1, 3, 2], [0, 0, 1])
In [583]: M1=sparse.coo_matrix((data,(row,col)),shape=(2,4))
In [584]: M1
Out[584]:
<2x4 sparse matrix of type '<class 'numpy.int32'>'
with 3 stored elements in COOrdinate format>
In [585]: M1.A
Out[585]:
array([[ 0, 10, 0, -3],
[ 0, 0, 12, 0]])
In [591]: m.data
Out[591]: array([[], []], dtype=object)
In [592]: m.rows
Out[592]: array([[], []], dtype=object)
と変更してください。
In [587]: M.data
Out[587]: array([[10, -3], [12]], dtype=object)
In [588]: M.rows
Out[588]: array([[1, 3], [2]], dtype=object)
alist
構造では2段階の繰り返しが必要です。あなたがcsr
indptr
を理解することの難しさを述べた別のコメントで
In [593]: for i, rr in enumerate(alist):
...: for cc in rr:
...: m.rows[i].append(cc[0])
...: m.data[i].append(cc[1])
In [594]: m
Out[594]:
<2x4 sparse matrix of type '<class 'numpy.int32'>'
with 3 stored elements in LInked List format>
In [595]: m.A
Out[595]:
array([[ 0, 10, 0, -3],
[ 0, 0, 12, 0]])
。これを取得する最も簡単な方法は、次のいずれかの形式を変換することです:
In [597]: Mr=M.tocsr()
In [598]: Mr.indptr
Out[598]: array([0, 2, 3], dtype=int32)
In [599]: Mr.data
Out[599]: array([10, -3, 12])
In [600]: Mr.indices
Out[600]: array([1, 3, 2], dtype=int32)
このような明確で役立つ詳細な回答 - ありがとうございます!COO形式のコンストラクタは最も自然なようですが、いくつかのジェネレータを用意してメモリと時間効率の良い入力パイプラインを実現することができます。私はscipyの人々が人々がそれらを見つける方法でこれのようないくつかの例を追加することを願っています。これは私のデータが入ってきたフォーマットであり、[Sparse array - Wikipedia](https://en.wikipedia.org/wiki/Sparse_array)で議論されているように、これらの異なるスパースフォーマットをサポートするシステムの数があれば、より多くの人々がそれらを使ってデータを交換すると思う。 – nealmcb
私はまず、有限要素問題のためにMATLABで疎行列を扱った。 'coo'形式の入力は唯一のオプションですが、内部的には' csc'(少なくとも '.mat'ファイルに保存される形式)でデータを保存します。疎な数学の大部分は、線形代数問題のために開発されました。 'scipy'はいくつかのフォーマットを追加します(Wiki記事のリンクに注意してください)。現在では、大規模なデータ問題、疎なフィーチャ行列、機械学習、言語学などから、疎な行列の関心が集まっています。 'scikit learn'は、例えばコンパイルされたスパース行列ユーティリティをいくつか追加します。 – hpaulj