我有两个向量A和B:
import numpy as np
A=np.array([1,2,3])
B=np.array([8,7])
我想用这个表达式把它们加起来:
Result = sum((A-B)**2)
我需要的预期结果是:
Result = np.array([X,Y])
其中:
X = (1-8)**2 + (2-8)**2 + (3-8)**2 = 110
Y = (1-7)**2 + (2-7)**2 + (3-7)**2 = 77
我该怎么做呢?这两个数组就是一个例子,在我的例子中,我有一个非常大的数组,我不能手动完成它。
发布于 2017-03-04 19:25:46
您可以使A
成为一个2d数组,并利用numpy的广播属性将计算矢量化:
((A[:, None] - B) ** 2).sum(0)
# array([110, 77])
发布于 2017-03-04 21:08:56
由于您已经提到了您正在使用大型数组,并将重点放在性能上--这里有一个用np.einsum
高效地执行squaring
和sum-reduction
组合操作的方法,如下所示-
def einsum_based(A,B):
subs = A[:,None] - B
return np.einsum('ij,ij->j',subs, subs)
样本运行-
In [16]: A = np.array([1,2,3])
...: B = np.array([8,7])
...:
In [17]: einsum_based(A,B)
Out[17]: array([110, 77])
运行时测试,使用大型数组扩展给定的示例1000x
-
In [8]: A = np.random.rand(3000)
In [9]: B = np.random.rand(2000)
In [10]: %timeit ((A[:, None] - B) ** 2).sum(0) # @Psidom's soln
10 loops, best of 3: 21 ms per loop
In [11]: %timeit einsum_based(A,B)
100 loops, best of 3: 12.3 ms per loop
https://stackoverflow.com/questions/42600289
复制相似问题