2013-02-02 99 views
3

我需要創建一個包含numpy數組值的矩陣。根據一系列索引值應該分佈在矩陣行上。從numpy數組創建一個稀疏矩陣

像這樣:

>>> values 
array([ 0.73620381, 0.61843002, 0.33604769, 0.72344274, 0.48943796]) 
>>> inds 
array([0, 1, 2, 3, 2]) 
>>> m = np.zeros((4, 5)) 
>>> for i, (index, value) in enumerate(zip(inds, values)): 
     m[index, i] = value 
>>> m 
array([[ 0.73620381, 0.  , 0.  , 0.  , 0.  ], 
     [ 0.  , 0.61843002, 0.  , 0.  , 0.  ], 
     [ 0.  , 0.  , 0.33604769, 0.  , 0.48943796], 
     [ 0.  , 0.  , 0.  , 0.72344274, 0.  ]]) 

我想知道是否有做一個量化的方式,即,沒有環。有什麼建議麼?

回答

3

這裏是你如何能與fancy indexing做到這一點:

>>> values 
array([ 0.73620381, 0.61843002, 0.33604769, 0.72344274, 0.48943796]) 
>>> inds 
array([0, 1, 2, 3, 2]) 
>>> mshape = (4,5) 
>>> m = np.zeros(mshape) 
>>> m[inds,np.arange(mshape[1])] = values 
>>> m 
array([[ 0.73620381, 0.  , 0.  , 0.  , 0.  ], 
     [ 0.  , 0.61843002, 0.  , 0.  , 0.  ], 
     [ 0.  , 0.  , 0.33604769, 0.  , 0.48943796], 
     [ 0.  , 0.  , 0.  , 0.72344274, 0.  ]]) 
+4

[看起來在他的命令歷史記錄上看到,爲什麼這並沒有爲他工作,因爲這是他嘗試的第一件事..意識到他是個白癡..刪除他的答案和upvotes這一點。 IOW,一個典型的下午。] – DSM

+0

@DSM,我們都去過那裏。 FWIW,你的numpy/scipy答案永遠是恆星。 –

0

valuesinds陣列可以作爲輸入到scipy.sparse構造函數(在Matlab類似於稀疏)。

from scipy import sparse 
values = np.array([ 0.73620381, 0.61843002, 0.33604769, 0.72344274, 0.48943796]) 
inds=np.array([0,1,2,3,2]) 
index = np.arange(5) 
m=sparse.csc_matrix((values,(inds,index)),shape=(4,5)) 
m.todense() # produces a matrix or 
m.toarray()