2016-06-07 214 views
0
alpha = csr_matrix((1000,1000),dtype=np.float32) 
beta = csr_matrix((1,1000),dtype=np.float32) 
alpha[0,:] = beta 

啓動後,alpha和beta應該是沒有元素存儲在其中的稀疏矩陣。但在將beta分配給alpha的第一行之後,alpha變爲非稀疏,並且在alpha中存儲了1000個零。我知道我可以使用elimination_zeros()將alpha變回稀疏矩陣,但有沒有更好的方法來做到這一點?Scipy稀疏矩陣在賦值後變成緻密矩陣

+0

你的標題是錯誤的 - 它仍然是一個稀疏矩陣;它只是沒有清理。 – hpaulj

回答

1

當我複製你的腳步,我得到

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_zerosprune。即使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轉換成在做任務之前密集陣列。