在具有相同"外部"大小的阵列之间广播



Numpy似乎有一些(对我来说(广播阵列的不直观行为。假设我们有两个数组

a = numpy.ones((2,2,3))
b = numpy.array([[1],[2]])

我希望能够将它们相乘,输出为

>>> a*b
array([[[1., 1., 1.],
[1., 1., 1.]],
[[2., 2., 2.],
[2., 2., 2.]]])

然而,相反,我们得到

>>> a*b
array([[[1., 1., 1.],
[2., 2., 2.]],
[[1., 1., 1.],
[2., 2., 2.]]])

事实上,这种乘法之所以有效,是因为a第二维与b外部维数相同(在本例中为 2(。相反,如果我们有a = numpy.ones((2,3,3)),我得到以下错误:

>>> a*b
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: operands could not be broadcast together with shapes (2,3,3) (2,1)

我觉得这很奇怪的原因是,将形状为 (3,4( 和 (1,( 的数组广播在一起就可以了——那么当它们是两个较大数组的"子数组"时,为什么它不起作用呢?

做我想做的事最"pythonic"的方式是什么?具体来说,这是为了创建一个 3D ndarray,其中每个 2D 子数组都有一个不同的值,在整个过程中重复。显然我可以使用循环,但它似乎并不优雅。

你有 (2,2,3( 和 (2,1(。第二个扩展到 (1,2,1((前面的自动新轴(,然后扩展到 (2,2,3(。

尝试b[:,:,None]来制作它 (2,1,1(。

怎么样?

a = np.ones((2,2,3))
b = np.array([[[1],
[1]],
[[2],
[2]]])
print(a*b)

array([[[1., 1., 1.],
[1., 1., 1.]],
[[2., 2., 2.],
[2., 2., 2.]]])

最新更新