python - 在 'outer' 大小相同的数组之间广播
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
的second维度与outer维度相同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,) 的数组一起广播会工作得很好 - 那么为什么当它们是 'sub-arrays' 两个时它不起作用更大的数组?
什么是最 'pythonic' 做我想做的事的方法?具体来说,这是为了创建一个 3D ndarray,其中每个 2D 子数组都具有不同的重复值。显然我可以只使用一个循环,但它看起来并不优雅。
怎么样?
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.]]])
你有一个 (2,2,3) 和一个 (2,1)。第 2 个扩展为 (1,2,1)(前面的自动新轴),然后扩展为 (2,2,3)。
尝试 b[:,:,None]
使其成为 (2,1,1)。
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
的second维度与outer维度相同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,) 的数组一起广播会工作得很好 - 那么为什么当它们是 'sub-arrays' 两个时它不起作用更大的数组?
什么是最 'pythonic' 做我想做的事的方法?具体来说,这是为了创建一个 3D ndarray,其中每个 2D 子数组都具有不同的重复值。显然我可以只使用一个循环,但它看起来并不优雅。
怎么样?
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.]]])
你有一个 (2,2,3) 和一个 (2,1)。第 2 个扩展为 (1,2,1)(前面的自动新轴),然后扩展为 (2,2,3)。
尝试 b[:,:,None]
使其成为 (2,1,1)。