0

问题很简单:假设我有一个来自 scipy 稀疏矩阵 M(100,000X500,000)的给定行 r,我想在 M 矩阵中找到它的位置/索引?我怎样才能有效地做到这一点?

目前我正在尝试以下方式,但速度非常慢。

offset = 500
begin = 0
end  = begin + offset
row = row.todense() #convert sparse to dense
while 1:
    sub_M = M[begin:end,:].todense() #M matrix is too big that its dense cannot fit memory 
    labels=np.all(row == sub_M, axis=1) # here we find row in the sub set of M, but in a dense representation
    begin = end
    end = end + offset
    if (end - offset) == M.shape[0]:
        break
    elif end > M.shape[0]:
        end = M.shape[0]
4

2 回答 2

1

除非您想深入研究一种或多种稀疏矩阵类型的内部结构,否则您应该对矩阵使用 CSR 格式,并且:

  • 计算每个矩阵行的长度(L2范数);换句话说:sum(multiply(M, M), 2)
  • 将 r 归一化为 (L2) 长度 1
  • 矩阵乘法M*r(其中 r 被视为列向量)

如果条目M*r匹配相应行的长度,则您有一个匹配项。

请注意,默认ord值为numpy.linalg.normL2 norm。

于 2012-12-21T02:41:24.740 回答
0

最后,我想出了一个非常简单但非常省时的解决方案。稀疏矩阵中的每一行都被转换为字符串,并与其索引/位置一起放入字典中。然后需要找到的行是字典的键,而 dic[str(row)] 给了我它的索引。

于 2012-12-26T01:19:13.917 回答