2015-03-25 55 views
0

如何從這樣對角線向量構造稀疏矩陣稀疏陣列: 可以說我的矩陣是具有維數N = 6平方和我有以下矢量創建從對角線份

vec = np.array([[1], [1,2]]) 

和我想把在對角線

offset = np.array([2,3]) 

但VEC [0]應墊[0,2],並開始VEC [1]應墊開始[1,4]

我知道scipy.spars這些部件e.diags()但我不認爲有一種方法可以指定非零元素存在的對角線的一部分。

這只是一個例子來說明問題。實際上,我處理的是非常大的數組,我不想爲無用的零浪費內存。

回答

0

這是你想要的矩陣嗎?

In [200]: sparse.dia_matrix(([[0,0,1,0,0,0],[0,0,0,0,1,2]],[2,3]),(6,6)).A 
Out[200]: 
array([[0, 0, 1, 0, 0, 0], 
     [0, 0, 0, 0, 1, 0], 
     [0, 0, 0, 0, 0, 2], 
     [0, 0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0, 0]]) 

是的,規範包括零,這可能會在較大的情況下令人討厭。

spdiags只包裝dia_matrix,可以選擇將結果轉換爲另一種格式。在你的例子中,一個7元素稀疏轉換爲3.

sparse.diags接受一個粗糙的值列表,但它們仍然需要匹配對角線的長度。並在內部將它們轉換爲dia_matrix所需的矩形陣列。

S3=sparse.diags([[1,0,0,0],[0,1,2]],[2,3],(6,6)) 

所以,如果你真的需要吝嗇約零點你需要去coo路線。

例如:

In [363]: starts = [[0,2],[1,4]] 
In [364]: data = np.concatenate(vec) 
In [365]: rows=np.concatenate([range(s[0],s[0]+len(v)) for s,v in zip(starts, vec)]) 
In [366]: cols=np.concatenate([range(s[1],s[1]+len(v)) for s,v in zip(starts, vec)]) 
In [367]: sparse.coo_matrix((data,(rows,cols)),(6,6)).A 
Out[367]: 
array([[0, 0, 1, 0, 0, 0], 
     [0, 0, 0, 0, 1, 0], 
     [0, 0, 0, 0, 0, 2], 
     [0, 0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0, 0]])