2012-04-17 5 views
1

두 개의 numpy 배열을 함께 멀티플렉하는 효율적인 방법은 무엇입니까? 예를 들어, 내가 효율적이고 빠른이 작업을 수행 할 수있는 방법두 개의 nparray를 파이썬으로 곱하면

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

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

나는 A와 B 사이의 내적을 계산하려면 주어진? 당신이 NumPy와 사용하는 경우

답변

5

, 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)가 아닌 파이썬 합계를 호출하기 때문에 두 번째 timeit가 약간 부정 행위가되지 않습니까? 어때'numpy.sqrt ((numpy.abs (A) ** 2) .sum())'? 나는 'linalg.norm'이 너무 느리다는 사실에 놀랐다. 벡터의 길이가 길어지면 타이밍이 바뀌는 지 궁금합니다. 내일 테스트하거나 원하는 경우 추가 할 수 있습니다. – Hooked

3

numpy.dot뿐만 아니라, 당신이 찾고있는 것을 수행하는 numpy.linalg.norm이 : 나는 당신이 norm의 기본 인 제곱의 합의 SQRT을 원하는 같은데요

from numpy.linalg import norm  
from numpy import dot 

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

. 이 측정 기준은 Frobenius 표준 또는 L2 표준이라고합니다. 다른 측정 기준을 원할 경우 Manhattan 또는 L1 표준을 말하면 단순히 전달할 매개 변수 일뿐입니다.

관련 문제