2012-03-24 1 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), :] 

Это заставляет вас матрицу LIL-формат с только K строк (в порядке, определяемом random.sample). Я не уверен, что это супер-быстро, но на самом деле это не может быть хуже, чем ручной доступ к строке за строкой, как вы сейчас делаете, и, вероятно, предварительно распределяет результаты.

+0

он действительно не работает, поскольку он возвращает список списков различной длины и не разреженных (/ не разреженных) векторов. например sm.data [sample (xrange (sm.shape [0]), 2)] возвращает массив ([[1, 2], [8]], dtype = object) – ScienceFriction

+0

@ScienceFriction Увы, вы правы: я был тестирование на выборке, где все строки имеют записи. Я изменил ответ на что-то подобное, которое на самом деле вытаскивает вас из разреженной матрицы за один шаг. – Dougal

+0

спасибо! работает как шарм. – ScienceFriction

Смежные вопросы