稀疏矩陣我有我用幾個對角線構建稀疏矩陣:充滿行和對角線
A = diags([np.arange(100), np.arange(99), np.arange(99)], offsets=[0, -1, 1])
然而,這稀疏矩陣也有那些在最後一排的一個載體。有沒有什麼方法可以將它存儲在稀疏矩陣中,還是我的構造效率低下,我應該使用密集矩陣?
稀疏矩陣我有我用幾個對角線構建稀疏矩陣:充滿行和對角線
A = diags([np.arange(100), np.arange(99), np.arange(99)], offsets=[0, -1, 1])
然而,這稀疏矩陣也有那些在最後一排的一個載體。有沒有什麼方法可以將它存儲在稀疏矩陣中,還是我的構造效率低下,我應該使用密集矩陣?
sparse.diags
確實讓稀疏矩陣具有特殊diagonal
格式:
In [591]: A = sparse.diags([np.arange(100), np.arange(99), np.arange(99)], offse
...: ts=[0, -1, 1])
In [592]: A
Out[592]:
<100x100 sparse matrix of type '<class 'numpy.float64'>'
with 298 stored elements (3 diagonals) in DIAgonal format>
In [593]: A.A
Out[593]:
array([[ 0., 0., 0., ..., 0., 0., 0.],
[ 0., 1., 1., ..., 0., 0., 0.],
[ 0., 1., 2., ..., 0., 0., 0.],
...,
[ 0., 0., 0., ..., 97., 97., 0.],
[ 0., 0., 0., ..., 97., 98., 98.],
[ 0., 0., 0., ..., 0., 98., 99.]])
但存儲不是顯著比其他稀疏格式更高效。其他格式必須存儲相同的298值。他們只會對它們進行不同的索引
我們可以用不同的方式設置最後一行。
我們不能直接用稀疏格式索引最後一行。
In [594]: A[-1,:]
...
TypeError: 'dia_matrix' object is not subscriptable
但我們可以將其轉換爲csr
格式,並設置其行值:
In [595]: A.tocsr()[-1,:]
Out[595]:
<1x100 sparse matrix of type '<class 'numpy.float64'>'
with 2 stored elements in Compressed Sparse Row format>
In [596]: Ac = A.tocsr()
In [597]: Ac[-1,:]=1
/usr/local/lib/python3.5/dist-packages/scipy/sparse/compressed.py:730: SparseEfficiencyWarning: Changing the sparsity structure of a csr_matrix is expensive.
In [598]: Ac
Out[598]:
<100x100 sparse matrix of type '<class 'numpy.float64'>'
with 393 stored elements in Compressed Sparse Row format>
In [599]: Ac.A
Out[599]:
array([[ 0., 0., 0., ..., 0., 0., 0.],
[ 0., 1., 1., ..., 0., 0., 0.],
[ 0., 1., 2., ..., 0., 0., 0.],
...,
[ 0., 0., 0., ..., 97., 97., 0.],
[ 0., 0., 0., ..., 97., 98., 98.],
[ 1., 1., 1., ..., 1., 1., 1.]])
在這裏,我就不會擔心稀疏警告;對於動作迭代完成的情況,這意味着更多。我可以用tolil()
代替。請記住,csr
格式可用於計算。當組合矩陣塊時使用coo
格式。
我剛剛檢查了sparse.dia_matrix
的代碼。對於您的陣列A.data
是(3,100)陣列。它「擺脫」了你粗糙的投入。 A.offsets
是一個3元素數組。
A.tocoo()
將值存儲在3(295,)數組中(刪除定義中的0)。 A A.tocsr()
存儲2(295)陣列加上(101,)indptr
陣列。所以dia
格式更加緊湊,但只要您可以使用格式即可。
要追加的那些行,而應使用sparse.vstack
(vstack
使用coo
格式來構造新的矩陣):
In [619]: B = sparse.vstack((A,np.ones((1,100))))
In [620]: B
Out[620]:
<101x100 sparse matrix of type '<class 'numpy.float64'>'
with 395 stored elements in COOrdinate format>
出於好奇,我試圖vstack
與dia
輸出 - 它不喜歡它,因爲平方數dia
數據會過大。
lil
格式
In [621]: B = sparse.vstack((A,np.ones((1,100))),format='dia')
/usr/local/lib/python3.5/dist-packages/scipy/sparse/coo.py:359: SparseEfficiencyWarning: Constructing a DIA matrix with 102 diagonals is inefficient
分配不產生任何警告:
In [624]: Al = A.tolil()
In [625]: Al[-1,:]=1
In [626]: Al
Out[626]:
<100x100 sparse matrix of type '<class 'numpy.float64'>'
with 393 stored elements in LInked List format>
這也被轉換成csr
大多數計算。
是什麼讓你覺得你不能存儲它? –
@PeterWood @PeterWood我可以想象,稀疏矩陣對於包含行,列或對角線信息進行了優化,一旦開始彼此交叉,從稀疏存儲獲得的內存變得可以忽略不計 - 因此不會被「scipy」支持。 – FooBar
稀疏數組中最後一行真的有必要嗎?你可以插入你乘以的矢量的總和到最後一個條目中。 –