在scipy稀疏矩阵中找到给定的行?

时间:2012-12-21 00:47:33

标签: python numpy scipy sparse-matrix

问题很简单:假设我有一个来自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]

2 个答案:

答案 0 :(得分:1)

除非您想深入了解一个或多个稀疏矩阵类型的内部,否则您应该为您的矩阵使用CSR格式:

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

如果M*r的条目与相应行的长度匹配,则表示您匹配。

请注意ord的默认numpy.linalg.norm是L2规范。

答案 1 :(得分:0)

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