2012-03-24 47 views
5

這個問題有兩個部分(也許一個解決方案):從一個稀疏矩陣容易矢量的採樣從稀疏矩陣,並且從所述樣品創建一個新的矩陣(蟒)

樣品載體:是否有從稀疏矩陣中抽取矢量的簡單方法? 當我嘗試使用random.sample對行進行採樣時,我得到一個TypeError:稀疏矩陣長度不明確。

from random import sample 
import numpy as np 
from scipy.sparse import lil_matrix 
K = 2 
m = [[1,2],[0,4],[5,0],[0,8]] 
sample(m,K) #works OK 
mm = np.array(m) 
sample(m,K) #works OK 
sm = lil_matrix(m) 
sample(sm,K) #throws exception TypeError: sparse matrix length is ambiguous. 

我目前的解決方案是從矩陣的行數來樣,然後用GETROW(),,類似:

indxSampls = sample(range(sm.shape[0]), k) 
sampledRows = [] 
for i in indxSampls: 
    sampledRows+=[sm.getrow(i)] 

任何其他有效的/優雅的想法?密集的矩陣大小爲1000x30000並可能更大。

從稀疏矢量的列表構建一個稀疏矩陣:現在想象一下,我有取樣矢量sampledRows的名單,我怎能將它轉換爲不使其緻密稀疏矩陣,將其轉換成列表,然後convet名單它以lil_matrix?

回答

3

嘗試

sm[np.random.sample(sm.shape[0], K, replace=False), :] 

這讓你出只用行的K下的LIL格式矩陣(由random.sample確定的順序)。我不確定它是否超快,但它不會比手動訪問您現在正在做的行更糟糕,並且可能會預先分配結果。

+0

它並不真正工作,因爲它返回不同長度的列表列表,而不是稀疏的(/不稀疏)矢量。例如sm.data [sample(xrange(sm.shape [0]),2)]返回array([[1,2],[8]],dtype = object) – ScienceFriction 2012-03-24 21:57:01

+0

@ScienceFriction哎呀,你是對的:我是測試所有行都有條目的樣本。我已經改變了類似的答案,實際上你可以一步完成一個稀疏矩陣。 – Dougal 2012-03-24 22:00:11

+0

謝謝!奇蹟般有效。 – ScienceFriction 2012-03-24 22:09:45