将两个np数组乘以python

时间:2012-04-17 17:24:53

标签: python numpy

将两个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(.....)

如何有效和快速地完成这项工作?

2 个答案:

答案 0 :(得分: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
>>> 

答案 1 :(得分:3)

除了numpy.dot之外,还有numpy.linalg.norm可以满足您的需求:

from numpy.linalg import norm    
from numpy import dot

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

我猜你想要平方和的sqrt,这是norm的默认值。该度量称为Frobenius范数或L2范数。如果您想要一个不同的指标,比如Manhattan或L1规范,它只是一个传入的参数。