1

2つのnumpy配列を掛け合わせる効率的な方法は何ですか? たとえば、与えられた

A = [1, 2, 3, 4]
B = [2, 3, 5, 7]

A と B の間の内積を計算したいのですが、これは

  A.B/|A||B| = (1*2 + 2*3 + .. 4*7)/sqrt(1^2 + 2^2... +4^2) * sqrt(.....)

これを効率的かつ迅速に行うにはどうすればよいですか?

4

2 に答える 2

5

numpy を使用している場合、numpy.dotがジョブを実行します。

numpy.dot(A,B)
51

ベクトルの最速ノルムは次のようになります

n = math.sqrt(numpy.dot(A,A.conj()))

他の方法との比較はこちら

>>> t1=timeit.Timer("n = math.sqrt(numpy.dot(A,A.conj()))","from __main__ import A,math,numpy")
>>> t2=timeit.Timer("n = math.sqrt(sum(abs(A)**2))","from __main__ import A,math")
>>> t3=timeit.Timer("numpy.linalg.norm(A)","from __main__ import A,numpy")
>>> print "%.2f usec/pass" % (1000000 * t1.timeit(number=100000)/100000)
2.82 usec/pass
>>> print "%.2f usec/pass" % (1000000 * t2.timeit(number=100000)/100000)
13.16 usec/pass
>>> print "%.2f usec/pass" % (1000000 * t3.timeit(number=100000)/100000)
15.68 usec/pass
>>> 
于 2012-04-17T17:27:31.077 に答える
3

に加えてnumpy.dotnumpy.linalg.normあなたが探していることを行うものがあります:

from numpy.linalg import norm    
from numpy import dot

dot(a,b)/(norm(a)*norm(b))

二乗和の平方根が必要だと思います。これはのデフォルトですnorm。この測定基準は、フロベニウスノルムまたはL2ノルムと呼ばれます。別のメトリック、たとえばマンハッタンまたはL1ノルムが必要な場合、それは単に渡すパラメーターです。

于 2012-04-17T17:40:25.513 に答える