这个问题有两个部分(也许是一个解决方案?):
来自稀疏矩阵的样本向量:是否有一种简单的方法可以从稀疏矩阵中对向量进行采样? 当我尝试使用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,可能更大。
从稀疏矢量列表构造稀疏矩阵:现在想象一下我有采样矢量的列表samplesRows,如何将其转换为稀疏矩阵而不将其密集化,将其转换为列表列表,然后将其传递给lil_matrix?
答案 0 :(得分:4)
尝试
sm[np.random.sample(sm.shape[0], K, replace=False), :]
这会让你输出一个LIL格式矩阵,只有K行(按random.sample
确定的顺序)。我不确定它是否超级快,但它并不比你目前正在进行的逐行手动访问更糟糕,并且可能预先分配了结果。