从稀疏矩阵中轻松抽样向量,并从样本创建新矩阵(Python)

6
这个问题有两部分(也许一个解决方案?):
从稀疏矩阵中获取样本向量:是否有一种简单的方法从稀疏矩阵中获取样本向量? 当我尝试使用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,可能更大。

从稀疏向量列表构建稀疏矩阵:现在假设我有采样向量采样行的列表,如何将其转换为稀疏矩阵而不使其密集化,将其转换为列表的列表,然后将其转换为lil_matrix?

2个回答

3

尝试

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

使用这种方法可以得到一个LIL格式的矩阵,只包含K行(按照random.sample确定的顺序)。我不确定它是否非常快,但它肯定比手动逐行访问要好,并且可能会预先分配结果。


它实际上并不起作用,因为它返回了一个长度各异且不稀疏的列表嵌套列表。例如,sm.data[sample(xrange(sm.shape[0]), 2)] 返回 array([[1, 2], [8]], dtype=object)。 - ScienceFriction
@ScienceFriction 哎呀,你说得对:我在一个所有行都有条目的样本上进行测试。我已经将答案更改为类似的东西,实际上可以一步得到一个稀疏矩阵。 - Danica
我之前不熟悉xrange(),但它似乎非常有用 :) - ScienceFriction
2
“TypeError: random_sample() takes at most 1 positional argument (2 given)” 也许在过去这个命令可以正常运行,但是在现代版本的numpy中,np.random.sample已经成为numpy.random.random_sample的别名,只接受一个参数size,并返回一个随机数数组。 - mbecker

1

这个问题的被接受答案已经过时并且不再适用。在新版本的 numpy 中,你应该使用 np.random.choice 代替 np.random.sample,例如:

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

与之相反:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接