首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >平方差之和- NumPy/Python

平方差之和- NumPy/Python
EN

Stack Overflow用户
提问于 2017-03-04 19:22:16
回答 2查看 3.5K关注 0票数 2

我有两个向量A和B:

代码语言:javascript
运行
复制
import numpy as np
A=np.array([1,2,3])
B=np.array([8,7])

我想用这个表达式把它们加起来:

代码语言:javascript
运行
复制
Result = sum((A-B)**2)

我需要的预期结果是:

代码语言:javascript
运行
复制
Result = np.array([X,Y])

其中:

代码语言:javascript
运行
复制
X = (1-8)**2 + (2-8)**2 + (3-8)**2 = 110
Y = (1-7)**2 + (2-7)**2 + (3-7)**2 = 77

我该怎么做呢?这两个数组就是一个例子,在我的例子中,我有一个非常大的数组,我不能手动完成它。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-04 19:25:46

您可以使A成为一个2d数组,并利用numpy的广播属性将计算矢量化:

代码语言:javascript
运行
复制
((A[:, None] - B) ** 2).sum(0)
# array([110,  77])
票数 5
EN

Stack Overflow用户

发布于 2017-03-04 21:08:56

由于您已经提到了您正在使用大型数组,并将重点放在性能上--这里有一个用np.einsum高效地执行squaringsum-reduction组合操作的方法,如下所示-

代码语言:javascript
运行
复制
def einsum_based(A,B):
    subs = A[:,None] - B
    return np.einsum('ij,ij->j',subs, subs)

样本运行-

代码语言:javascript
运行
复制
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 -

代码语言:javascript
运行
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42600289

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档