2012-03-24 34 views
5

Câu hỏi này có hai phần (có lẽ một giải pháp?):dễ dàng lấy mẫu của vectơ từ một ma trận thưa thớt, và tạo ra một ma trận mới từ mẫu (python)

mẫu vector từ một ma trận thưa thớt: Có một cách dễ dàng để lấy mẫu vectơ từ một ma trận thưa thớt là gì? Khi tôi đang cố gắng để lấy mẫu dòng bằng cách sử dụng random.sample tôi nhận được một TypeError: chiều dài ma trận thưa thớt là mơ hồ.

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. 

giải pháp hiện tại của tôi là để lấy mẫu từ số lượng hàng trong ma trận, sau đó sử dụng getrow() ,, cái gì đó như:

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

Bất kỳ ý tưởng hiệu quả/thanh lịch khác? kích thước ma trận dày đặc là 1000x30000 và có thể lớn hơn.

Xây dựng một ma trận thưa thớt từ một danh sách các vector thưa thớt: Bây giờ tưởng tượng tôi có danh sách các vectơ sampledRows lấy mẫu, làm thế nào tôi có thể chuyển đổi nó vào một ma trận thưa thớt mà không tăng mật độ nó, chuyển nó sang danh sách liệt kê và sau đó convet nó đến lil_matrix?

Trả lời

3

Hãy thử

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

này giúp bạn ra một ma trận LIL-format chỉ với K của các hàng (theo thứ tự xác định bởi random.sample). Tôi không chắc nó siêu nhanh, nhưng nó không thể thực sự tồi tệ hơn việc truy cập bằng tay theo từng hàng như bạn hiện đang làm, và có lẽ preallocates các kết quả.

+0

nó không thực sự hoạt động vì nó trả về danh sách các danh sách có độ dài khác nhau và không vectơ (/ không thưa thớt). ví dụ. sm.data [mẫu (xrange (sm.shape [0]), 2)] trả về mảng ([[1, 2], [8]], dtype = object) – ScienceFriction

+0

@ScienceFriction Rất tiếc, bạn nói đúng: tôi đã thử nghiệm trên một mẫu nơi tất cả các hàng đều có mục nhập. Tôi đã thay đổi câu trả lời cho một cái gì đó tương tự mà thực sự giúp bạn ra khỏi một ma trận thưa thớt trong một bước. – Dougal

+0

cảm ơn! hoạt động như một sự quyến rũ. – ScienceFriction

Các vấn đề liên quan