是否有可能在python中有效地获得稀疏向量的范数?
我尝试了以下方法:
from scipy import sparse
from numpy.linalg import norm
vector1 = sparse.csr_matrix([ 0 for i in xrange(4000000) ], dtype = float64)
#just to test I set a few points to a value higher than 0
vector1[ (0, 10) ] = 5
vector1[ (0, 1500) ] = 80
vector1[ (0, 2000000) ] = 6
n = norm(t1)
但后来我得到了错误:
ValueError: dimension mismatch
norm 函数仅适用于数组,因此可能这就是 csr_matrix 不起作用的原因,但后来我没有找到另一种有效计算范数的方法。一种可能的解决方案是计算:
norm(asarray(vector1.todense()))
但随后它首先扼杀了使用稀疏向量的目的。作为最后一种方法,我可以遍历向量的每个元素并手动计算范数,但由于效率非常重要,我一直在寻找更快、更容易实现的东西。
提前感谢您的帮助!
编辑:我尝试了所有建议,最好的解决方案是:
(vector1.data ** 2).sum()
来自杜格尔。但是 Cython 解决方案也非常好,并且随着向量在不同零元素数量上的增长,效果更好。感谢大家的帮助!