我有一個生成器,生成長度相同的單維numpy.array
。我想有一個包含這些數據的稀疏矩陣。行按照我希望在最終矩陣中具有的順序生成。 csr
matrix優於lil
矩陣,但我認爲後者在我描述的場景中更容易構建。高效地使用python生成器創建scipy.lil_matrix
假設row_gen
是一個產生numpy.array
行的生成器,下面的代碼按預期工作。
def row_gen():
yield numpy.array([1, 2, 3])
yield numpy.array([1, 0, 1])
yield numpy.array([1, 0, 0])
matrix = scipy.sparse.lil_matrix(list(row_gen()))
因爲該列表將基本上毀了發電機的任何好處,我想下面有相同的最終結果。但是它會引發以下異常運行時
def row_gen():
yield numpy.array([1, 2, 3])
yield numpy.array([1, 0, 1])
yield numpy.array([1, 0, 0])
matrix = scipy.sparse.lil_matrix(row_gen())
:更具體地講,我不能在內存中保存整個密集矩陣(或所有的矩陣行的列表)
TypeError: no supported conversion for types: (dtype('O'),)
我也注意到了跟蹤包括以下內容:
File "/usr/local/lib/python2.7/site-packages/scipy/sparse/lil.py", line 122, in __init__
A = csr_matrix(A, dtype=dtype).tolil()
這讓我想到了用scipy.sparse.lil_matrix
最終將建立一個csr
矩陣,然後纔將其轉換成一個lil
矩陣。在這種情況下,我寧願創建csr
矩陣開始。
回顧一下,我的問題是:什麼是從python生成器或numpy單維數組創建scipy.sparse
矩陣的最有效方法?
謝謝,但是你提出的兩種方法都假設我已經掌握了矩陣的形狀。事實並非如此,由於lil是專門爲增加行數而構建的,因此我正在尋找一種在構建時有效增加其大小的方法。 – NirIzr
什麼是未知數 - 行數或列數?或兩者?收集數組的'coo'三重奏不需要知道最終的大小,但是'稀疏'矩陣不是爲增量增長而設計的(也不是稀疏數組)。 – hpaulj