2016-11-21 61 views
0

我想將一列從一個稀疏柱狀矩陣放入另一個(空)稀疏柱狀矩陣。 玩具代碼:將列放入空的稀疏矩陣

import numpy as np 
import scipy.sparse 
row = np.array([0, 2, 0, 1, 2]) 
col = np.array([0, 0, 2, 2, 2]) 
data = np.array([1, 2, 4, 5, 6]) 
M=scipy.sparse.csc_matrix((data, (row, col)), shape=(3, 3)) 
E=scipy.sparse.csc_matrix((3, 3)) #empty 3x3 sparse matrix 

E[:,1]=M[:,0] 

但是我得到警告:

SparseEfficiencyWarning:更改csc_matrix的稀疏結構>昂貴。 lil_matrix更高效。

這個警告讓我害怕在這個過程中矩陣轉換爲另一種格式,然後回到csc,這是不高效的。任何人都可以證實這一點,並有解決方案

回答

0

警告告訴您,在csc(或csr)格式矩陣中設置新值的過程很複雜。這些格式不適用於這種簡單的更改。 lil格式旨在使這種更改變得快速簡單,特別是對一行進行更改。請注意,coo格式甚至不實現這種索引。

它不是轉換爲lil,但它可能實際上是一個更快的方法。我們必須做一些時間測試。

In [679]: %%timeit E=sparse.csr_matrix((3,3)) 
    ...: E[:,1] = M[:,0] 
    ...: 
/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) 
1000 loops, best of 3: 845 µs per loop 
In [680]: %%timeit E=sparse.csr_matrix((3,3)) 
    ...: E1=E.tolil() 
    ...: E1[:,1] = M[:,0] 
    ...: E=E1.tocsc() 
    ...: 
The slowest run took 4.22 times longer than the fastest. This could mean that an intermediate result is being cached. 
1000 loops, best of 3: 1.42 ms per loop 

In [682]: %%timeit E=sparse.lil_matrix((3,3)) 
    ...: E[:,1] = M[:,0] 
    ...: 
1000 loops, best of 3: 804 µs per loop 
In [683]: %%timeit E=sparse.lil_matrix((3,3));M1=M.tolil() 
    ...: E[:,1] = M1[:,0] 
    ...: 
    ...: 
1000 loops, best of 3: 470 µs per loop 

In [688]: timeit M1=M.tolil() 
The slowest run took 4.10 times longer than the fastest. This could mean that an intermediate result is being cached. 
1000 loops, best of 3: 248 µs per loop 

注意,這樣做有lil(兩側)的分配比與csc做快2倍。但是轉換到/從lil需要時間。

警告與否,您正在做的是最快的 - 一次性操作。但是,如果您需要重複執行此操作,請嘗試找到更好的方法。

=================

設置行v列並沒有太大的差別。

In [835]: %%timeit E=sparse.csc_matrix((3,3)) 
    ...: E[:,1]=M[:,0] 
    SparseEfficiencyWarning) 
1000 loops, best of 3: 1.89 ms per loop 

In [836]: %%timeit E=sparse.csc_matrix((3,3)) 
    ...: E[1,:]=M[0,:]  
    SparseEfficiencyWarning) 
1000 loops, best of 3: 1.91 ms per loop 
+0

感謝您的回答,但通常csc格式應該是最佳的這種列切片操作不是? 我不明白爲什麼它會改變這個特定操作的內部稀疏結構 –

+1

如果它改變了非標準的數量,它會改變稀疏性。這不是'csc' v'csr'問題。在我的計時中,是否複製了一行或一列是沒有關係的。但隨意做你自己的時間。 – hpaulj