2つのnumpy配列を多重化する効率的な方法は何ですか?例えば、私は効率的かつ迅速にこれを行うことができますどのように2つのnparrayをまとめてPython
A.B/|A||B| = (1*2 + 2*3 + .. 4*7)/sqrt(1^2 + 2^2... +4^2) * sqrt(.....)
である、AとBの間のドット積を計算したい?
A = [1, 2, 3, 4]
B = [2, 3, 5, 7]
を与えられましたか
2つのnumpy配列を多重化する効率的な方法は何ですか?例えば、私は効率的かつ迅速にこれを行うことができますどのように2つのnparrayをまとめてPython
A.B/|A||B| = (1*2 + 2*3 + .. 4*7)/sqrt(1^2 + 2^2... +4^2) * sqrt(.....)
である、AとBの間のドット積を計算したい?
A = [1, 2, 3, 4]
B = [2, 3, 5, 7]
を与えられましたか
あなたが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
>>>
from numpy.linalg import norm
from numpy import dot
dot(a,b)/(norm(a)*norm(b))
私はあなたがnorm
のデフォルトです二乗和の平方根をしたい推測している:numpy.dot
に加えは、あなたが探しているものんnumpy.linalg.norm
があります。このメトリックは、フロベニウスノルムまたはL2ノルムと呼ばれます。あなたが別のメトリックを望む場合は、ManhattanまたはL1標準と言うと、それは単に渡すパラメータです。
も標準を得る方法です(もっと速く): – Fraz
@Fraz:質問を更新してください新しい質問 – Abhijit
@Abhijit numpy(とabs)よりもむしろPythonの合計を呼び出しているので、2番目のtimeitをちょっと騙すのではないですか? 'numpy.sqrt((numpy.abs(A)** 2).sum())'はどうでしょうか?私は「linalg.norm」が非常に遅いことが判明したことに驚いています。私は、ベクトルの長さが長くなるにつれてそのタイミングが変わるかどうか疑問に思っています。明日テストするか、好きなだけ追加することができます。 – Hooked