12

考虑以下 Numpy 数组广播中的练习。

import numpy as np
v = np.array([[1.0, 2.0]]).T # column array

A2 = np.random.randn(2,10) # 2D array
A3 = np.random.randn(2,10,10) # 3D

v * A2 # works great

# causes error: 
v * A3 # error

我知道广播的 Numpy 规则,并且熟悉bsxfunMatlab 中的功能。我理解为什么尝试将 (2,1) 数组广播到 (2,N,N) 数组会失败,并且在此之前我必须将 (2,1) 数组重新整形为 (2,1,1) 数组广播通过。

我的问题是:有没有办法告诉 Python 在尝试广播时自动填充数组的维度,而无需我专门告诉它必要的维度?

不想将 (2,1) 向量与要广播的多维数组显式耦合——否则我可能会做一些愚蠢和荒谬丑陋的事情,比如mult_v_A = lambda v,A: v.reshape([v.size] + [1]*(A.ndim-1)) * A. 我不知道“A”阵列是 2D 还是 3D 还是 ND。

Matlab 的bsxfun广播功能会根据需要隐式填充尺寸,所以我希望我可以在 Python 中做一些事情。

4

2 回答 2

9

NumPy 广播在左侧添加了额外的轴。

因此,如果您排列数组,使共享轴在右侧,可广播轴在左侧,那么您可以毫无问题地使用广播:

import numpy as np
v = np.array([[1.0, 2.0]])  # shape (1, 2)

A2 = np.random.randn(10,2) # shape (10, 2)
A3 = np.random.randn(10,10,2) # shape (10, 10, 2)

v * A2  # shape (10, 2)

v * A3 # shape (10, 10, 2)
于 2013-07-10T17:59:07.343 回答
9

这很丑陋,但这会起作用:

(v.T * A3.T).T

如果你不给它任何参数,转置会反转形状元组,所以你现在可以依靠广播规则来发挥它们的魔力。最后一个转置将所有内容返回到正确的顺序。

于 2013-07-10T18:19:08.117 回答