Skip to main content
 首页 » 编程设计

python之广播——将一个 (NxN) 数组乘以一个 (M) 数组得到一个 (NxNxM) 数组

2025年05月04日28EasonJim

我有两个 numpy 的 ndarrays

a.shape # -> (3, 3) 
b.shape # -> (5,) 

我想计算一个 c 数组,定义为

c.shape # -> (3, 3, 5) 
c[...,i] = a*b[i] 

(c 的确切形状并不重要,因为我总是可以调换它的轴)。

在我看来,到目前为止发布我的编码尝试会造成不必要的尴尬,这就像 a[:,None,:]*b[None,:] 的许多变体,这就足够了说,不是吗?

我怀疑 np.einsum() 可能是答案,但它的下标命令的语法在我脑海中飘过...

请您参考如下方法:

一个不错的解决方案是使用神奇的 einsum功能:

>>> a = np.array([[1,2,3],[4,5,6],[7,8,9]]) 
>>> b = np.array([10, 100, 1000, 10000, 100000]) 
>>> c = np.einsum('ij,k->ijk', a, b) 
>>> c[1, 2, 3] 
60000 
>>> a[1, 2] 
6 
>>> b[3] 
10000 

我喜欢它,因为它使转换 ij,k -> ijk 非常明确。也可能,更简洁,是使用简单的广播:

>>> c = a[:, :, None] * b[None, None, :] 
>>> c.shape 
(3L, 3L, 5L) 

使用 的地方: 使用一个维度,None 沿着一个维度传播。