如何在Python中将1d数组广播到ND数组

2024-04-26 20:26:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我错过了一些东西。我有一个一维阵列,我想广播到一个N-D阵列,但它不工作:

>>> 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)

Tags: toinnumpyapplibpackagesnpline
3条回答

当你广播到N-D时,新的形状必须与一维数组的输入相匹配。例如,您可以:

np.broadcast_to(np.arange(12),(12,12))

或者

^{pr2}$

它不能将12个数字广播到长度为2的维度中,从您的例子来看。在

广播有两个步骤:

  • 展开左侧的尺寸以匹配
  • 展开所有尺寸为1的尺寸以匹配

对于一个size(12,)数组,第一步可以生成(1,1,12),但不能生成(12,1,1)。第二步可以扩展到(2,2,12)。但是你想要。在

所以必须显式地添加尾随维度

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是最后一个维度,而不是第一个维度。我们不想分割最后一个维度

^{pr2}$

解决方案

您需要将最后一个维度的大小作为第一个参数的大小(arange数组)。 这很管用。把12放在末尾然后换位

import numpy as np
np.broadcast_to(np.arange(12),(2,2,12)).T # so it fits exactly your question, transpose

^{pr2}$

注意

看看文档,你似乎真的需要在两个位置都有相应的形状-数组和所需的形状。如果你有

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

相关问题 更多 >