从稀疏矩阵中轻松采样矢量,并从样本中创建一个新矩阵(python)

时间:2012-03-24 21:48:22

标签: python scipy sparse-matrix sampling

这个问题有两个部分(也许是一个解决方案?):

来自稀疏矩阵的样本向量:是否有一种简单的方法可以从稀疏矩阵中对向量进行采样? 当我尝试使用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?

1 个答案:

答案 0 :(得分:4)

尝试

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

这会让你输出一个LIL格式矩阵,只有K行(按random.sample确定的顺序)。我不确定它是否超级快,但它并不比你目前正在进行的逐行手动访问更糟糕,并且可能预先分配了结果。