这个问题有两个部分(也许一个解决方案?):
从稀疏矩阵中抽取向量:有没有一种简单的方法可以从稀疏矩阵中抽取向量? 当我尝试使用 random.sample 对行进行采样时,我收到 TypeError: sparse matrix length is ambiguous。
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?
最佳答案
尝试
sm[np.random.sample(sm.shape[0], K, replace=False), :]
这会得到一个只有 K 行的 LIL 格式矩阵(按照 random.sample
确定的顺序)。我不确定它是否超快,但它真的不会比像您目前正在做的那样逐行手动访问更糟糕,并且可能会预先分配结果。
关于python - 从稀疏矩阵中轻松抽取向量,并从样本中创建一个新矩阵(python),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9855913/