[英]How to broadcast a 1d array to an N-D array in Python
我在这里遗漏了一些东西。 我有一个一维数组,我想广播到一个 ND 数组,但它不起作用:
>>> import numpy as np
>>> np.broadcast_to(np.arange(12),(12,2,2))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "c:\app\python\anaconda\2\lib\site-packages\numpy\lib\stride_tricks.py", line 173, in broadcast_to
return _broadcast_to(array, shape, subok=subok, readonly=True)
File "c:\app\python\anaconda\2\lib\site-packages\numpy\lib\stride_tricks.py", line 128, in _broadcast_to
op_flags=[op_flag], itershape=shape, order='C').itviews[0]
ValueError: operands could not be broadcast together with remapped shapes [original->remapped]: (12,) and requested shape (12,2,2)
解决方案
您需要将最后一个维度的大小作为第一个参数(arange 数组)的大小。 这有效。 只需将 12 放在最后并转置
import numpy as np
np.broadcast_to(np.arange(12),(2,2,12)).T # so it fits exactly your question, transpose
>>> np.broadcast_to(np.arange(12),(2,2,12)).T.shape
(12, 2, 2)
笔记
查看文档,似乎您确实需要在两者上都有相应的形状 - 数组和所需的形状。 如果你有
np.arange(X)
那么你可以有任何想要的形状,只要最后一个维度的形状是 X
np.broadcast_to(np.arange(X),(ANY,ANY,ANY,ANY,ANY,X))
你可以用这个有趣的例子来测试它
X = 10
np.broadcast_to(np.arange(X),[i for i in range(X+1)]).shape
编辑:
关于@Divakar对 OP的评论(添加额外维度),看起来有两种可能的方法具有相同的结果
solution1 = np.broadcast_to(np.arange(12)[:,None,None], (12,2,2)) # Divakar's
solution2 = np.broadcast_to(np.arange(12),(12,2,2)[::-1]).T # without extra dimensions, using Transpose
>>> np.all(solution1 == solution2)
True
广播有两个步骤:
对于大小为 (12,) 的数组,第一步可以生成 (1,1,12),但不能生成 (12,1,1)。 第二步可以扩展到(2,2,12)。 但是你想要 (12,2,2)。
所以你必须明确添加尾随尺寸
In [773]: np.broadcast_to(np.arange(12)[:,None,None], (12,2,2)).shape
Out[773]: (12, 2, 2)
In [775]: np.broadcast_to(np.arange(3)[:,None,None], (3,2,2))
Out[775]:
array([[[0, 0],
[0, 0]],
[[1, 1],
[1, 1]],
[[2, 2],
[2, 2]]])
因此,通过这些规则广播到 (2,2,12) 起作用,并且转置可以将其更改为 (12,2,2)
广播到 (12,12,12) 相当于扩展 (1,1,12)。 arange
是最后一个维度,而不是第一个维度。 我们不想切割最后一个维度
In [777]: np.broadcast_to(np.arange(3),(3,3,3))[:,:2,:2]
Out[777]:
array([[[0, 1],
[0, 1]],
[[0, 1],
[0, 1]],
[[0, 1],
[0, 1]]])
当您广播到 ND 时,新形状必须与一维数组的输入相匹配。 例如,你可以这样做:
np.broadcast_to(np.arange(12),(12,12))
或者
np.broadcast_to(np.arange(12),(12,12,12))
从您的示例中,它无法将 12 个数字广播到长度为 2 的维度中。
如果你想要一些你提到的广播的子集,那么你可以对数组进行切片。
arr = np.broadcast_to(np.arange(12),(12,12,12))
arr = arr[:,:2,:2]
这给出了您想要的所需结果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.