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
ノルム関数は配列でのみ機能するため、おそらくcsr_matrixが機能しないのはそのためですが、ノルムを効果的に計算する別の方法が見つかりませんでした。考えられる解決策の1つは、次のように計算することです。
norm(asarray(vector1.todense()))
しかし、最初はスパースベクトルを使用する目的が失われます。そして最後のアプローチとして、ベクトルの各要素を反復処理し、ノルムを手動で計算することができましたが、効率が非常に重要であるため、より速く、より簡単に実装できるものを探していました。
助けてくれてありがとう!
編集:私は提案されたすべてを試しました、そして最良の解決策は:
(vector1.data ** 2).sum()
ダガルから。しかし、Cythonのソリューションも非常に優れており、ベクトルがゼロとは異なる要素の数が増えるにつれて、より適切に機能します。助けてくれてありがとう!