2012-04-17 9 views
1

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] 

を与えられましたか

答えて

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 
>>> 
+0

も標準を得る方法です(もっと速く): – Fraz

+0

@Fraz:質問を更新してください新しい質問 – Abhijit

+0

@Abhijit numpy(とabs)よりもむしろPythonの合計を呼び出しているので、2番目のtimeitをちょっと騙すのではないですか? 'numpy.sqrt((numpy.abs(A)** 2).sum())'はどうでしょうか?私は「linalg.norm」が非常に遅いことが判明したことに驚いています。私は、ベクトルの長さが長くなるにつれてそのタイミングが変わるかどうか疑問に思っています。明日テストするか、好きなだけ追加することができます。 – Hooked

3
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標準と言うと、それは単に渡すパラメータです。

関連する問題