numpy:无法将输入数组从形状(3)广播到形状(1)

时间:2019-01-29 21:07:28

标签: python numpy

我想创建一个numpy数组 b ,其中每个组件都是2D矩阵,其尺寸由向量 a < / em>

以下内容使我满意:

>>> a = [3,4,1]
>>> b = [np.zeros((a[i], a[i - 1] + 1)) for i in range(1, len(a))]
>>> np.array(b)
array([ array([[ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.]]),
       array([[ 0.,  0.,  0.,  0.,  0.]])], dtype=object)

但是,如果我发现这种病理情况无法正常工作

>>> a = [2,1,1]
>>> b = [np.zeros((a[i], a[i - 1] + 1)) for i in range(1, len(a))]
>>> b
[array([[ 0.,  0.,  0.]]), array([[ 0.,  0.]])]
>>> np.array(b)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: could not broadcast input array from shape (3) into shape (1)

2 个答案:

答案 0 :(得分:1)

这有点奇怪。通常,numpy会尝试根据np.array的输入创建一个具有通用数据类型的数组。数组列表将被解释为新维度。例如,np.array([np.zeros(3, 1), np.zeros(3, 1)])将产生一个2 x 3 x 1数组。因此,只有在列表中的数组形状匹配时,才会发生这种情况。否则,您最终将得到一个数组数组(带有dtype=object),正如所评论的那样,这实际上不是理想的情况。

但是,当第一个尺寸匹配时,您的错误似乎发生了。 Numpy由于某种原因尝试以某种方式广播阵列,但失败了。只要数组之间的第一个维度匹配,即使数组具有更高的维度,我也可以重现您的错误。

我知道这不是解决方案,但这不适合发表评论。正如@roganjosh所指出的那样,制作这种数组确实没有任何好处。最好坚持使用数组列表以提高可读性,并避免创建这些数组的成本。

答案 1 :(得分:0)

我将提出该问题的解决方案,但要考虑到评论中所说的内容。 Numpy数组未对齐会阻止大多数有用的操作发挥作用。考虑改用列表。

话虽如此,确实是个奇怪的错误。通过分配一个基本的for循环而不是使用np.array调用,我可以正常工作。

a = [2,1,1]
b = np.zeros(len(a)-1, dtype=object)
for i in range(1, len(a)):
    b[i-1] = np.zeros((a[i], a[i - 1] + 1))

结果:

>>> b
array([array([[0., 0., 0.]]), array([[0., 0.]])], dtype=object)