простая выборка векторов из разреженной матрицы и создание новой матрицы из выборки (python) - PullRequest
6 голосов
/ 25 марта 2012

Этот вопрос состоит из двух частей (может быть, одного решения?):

Выборка векторов из разреженной матрицы : Существует ли простой способ выборки векторов из разреженной матрицы?Когда я пытаюсь сэмплировать строки, используя 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, как я могу преобразовать его в разреженную матрицу без ее уплотнения, преобразоватьсписок списков, а затем преобразовать его в lil_matrix?

1 Ответ

4 голосов
/ 25 марта 2012

Попробуйте

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

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

...