繁体   English   中英

python-在具有相同“外部”大小的数组之间广播

[英]python - broadcasting between arrays with the same 'outer' size

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 = 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.]]])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM