當我複製你的腳步,我得到
In [131]: alpha[0,:]=beta
/usr/lib/python3/dist-packages/scipy/sparse/compressed.py:730:
SparseEfficiencyWarning: Changing the sparsity structure of a
csr_matrix is expensive. lil_matrix is more efficient.
SparseEfficiencyWarning)
所以這是,你正在做,開發商考慮不明智的東西第一個指標。
我們可以深入研究csr
__setitem__
的代碼,但我的猜測是它會將您的beta
轉換爲密集的,然後進行分配。並且不會自動執行eliminate_zeros
步驟(在作業期間或之後)。
通常爲什麼人們會做a[...]=...
?通常是建立稀疏矩陣。清零非零值是可能的,但不足以將其視爲特殊情況。
由於各種原因,在稀疏矩陣中可能有0個值。您甚至可以直接將0插入alpha.data
。這就是爲什麼有'清理'方法,如eliminate_zeros
和prune
。即使nonzero
施加一個!=0
面具
# convert to COOrdinate format
A = self.tocoo()
nz_mask = A.data != 0
return (A.row[nz_mask],A.col[nz_mask])
在正常稀疏實際上,你建立coo
或其他格式的數據,然後轉換爲csr
進行計算。矩陣乘法是它的強項。這構造了一個新的稀疏矩陣。修改csr
是可能的,但不鼓勵。
====================
alpha.__setitem__??
(在IPython中)顯示
def __setitem__(self, index, x):
# Process arrays from IndexMixin
i, j = self._unpack_index(index)
i, j = self._index_to_arrays(i, j)
if isspmatrix(x):
x = x.toarray()
....
self._set_many(i, j, x.ravel())
所以,是的,它的RHS轉換成在做任務之前密集陣列。
你的標題是錯誤的 - 它仍然是一個稀疏矩陣;它只是沒有清理。 – hpaulj