2012-03-24 18 views
5

Bu soru, iki parça (belki bir çözelti) sahiptir var mıdır seyrek bir matristen vektörleri örneklemenin kolay bir yolu? Random.sample kullanarak satırları örneklemeye çalıştığımda bir TypeError alıyorum: seyrek matris uzunluğu belirsiz.seyrek bir matris vektörlerin kolay örnekleme ve numune yeni bir matris oluşturarak (piton)

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

Başka verimli/zarif fikirler:

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. 

Benim şimdiki çözüm ,, gibi bir şey daha sonra matrisin satır sayısı dan örnek) (GetRow kullanmaktır? Yoğun matris boyutu 1000x30000'dür ve daha büyük olabilir. seyrek vektörlerin listesinden seyrek matris Oluşturma

: Şimdi ben örneklenmiş vektörler sampledRows listesi var hayal, nasıl, bunu yoğunlaştırmak olmadan seyrek matrise dönüştürmek listeleri ve daha sonra convet listesine dönüştürebilirsiniz lil_matrix'e mi?

cevap

3

Bu (random.sample tarafından belirlenen sırayla) satırların sadece K ile bir LIL formatlı matrisi dışarı çıkmayı

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

deneyin. Süper hızlı olduğundan emin değilim, ama şu anda yaptığınız gibi satır sırayla el ile erişmekten daha da kötü olamaz ve muhtemelen sonuçları önbelleğe alır.

+0

, çok uzun olmayan ve çok seyrek (/ seyrek olmayan) vektörlerin listelerini listelerken gerçekten işe yaramıyor. Örneğin. sm.data [örnek (xrange (sm.shape [0]), 2)] diziyi döndürür ([[1, 2], [8]], dtype = nesne) – ScienceFriction

+0

@ScienceFriction Whoops, haklısınız: Satırların girişleri olan bir örnek üzerinde test etme. Cevabını, bir adımda aslında seyrek bir matrisi dışarı çıkaran benzer bir şeye dönüştürdüm. – Dougal

+0

teşekkürler! ÇALIŞIYOR bir cazibe gibi. – ScienceFriction