如何计算两个一维向量的外和(非外积),可通过np.einsum实现吗?
外和计算的实现方案
以下所有方案均为纯矢量化实现,无Python层循环,性能远高于原生for循环写法。
方法1:numpy广播实现(最简洁高效)
通过维度扩展触发广播机制直接相加,代码易读性最高:
import numpy as np a = np.arange(3) b = np.arange(2) # 维度扩展后广播相加 out = a[:, None] + b print(out) # 输出: # [[0 1] # [1 2] # [2 3]]
如果需要转置结果,调整维度扩展顺序即可:out = b[:, None] + a
方法2:np.add.outer 内置外和实现
numpy所有通用运算函数都支持outer方法,可直接实现对应运算的外操作,语义最明确:
out_outer = np.add.outer(a, b) print(out_outer) # 输出和广播实现完全一致
方法3:np.einsum 实现
受einsum默认先乘后求和的运算逻辑限制,无法用单条einsum直接实现加法类外运算,可分两次广播后相加:
# 分别将a、b广播到ij形状后相加 out_einsum = np.einsum('i->ij', a) + np.einsum('j->ij', b) print(out_einsum) # 输出和上述方法完全一致
该写法适合需要和其他einsum运算逻辑结合的场景。
内容的提问来源于stack exchange,提问作者Schach21
相关产品推荐
相关产品推荐

