【问题标题】:ValueError: shape mismatch: with same shapeValueError:形状不匹配:形状相同
【发布时间】:2019-10-29 10:35:52
【问题描述】:

我收到一个基本错误,输出奇怪,我不太理解:

重现步骤

arr1 = np.zeros([6,10,50])
arr2 = np.zeros([6,10])
arr1[:, :, range(25,26,1)] = [arr2]

即产生此错误:

ValueError: shape mismatch: value array of shape (1,6,10) could not be broadcast to indexing result of shape (1,6,10)

谁能解释我做错了什么?

【问题讨论】:

  • arr2 = np.zeros([6,10,1]) 解决你的问题。
  • 为什么会有奇怪的range(25, 26, 1) 符号?为什么不只是25:26

标签: python numpy shapes numpy-ndarray numpy-slicing


【解决方案1】:

arr2添加一个额外的维度:

arr1[:, :, range(25,26,1)] = arr2.reshape(arr2.shape + (1,))

这里使用的range 更简单的表示法:

arr1[:, :, 25:26)] = arr2.reshape(arr2.shape + (1,))

(和slice(25,26,1),或slice(25,26),也可以工作;只是为了增加选项和可能的混乱。)

或者在arr2的末尾插入一个额外的轴:

arr1[..., 25:26] = arr2[..., np.newaxis]

(其中... 表示“尽可能多的维度”)。你也可以用None代替np.newaxis;后者可能更明确,但任何了解 NumPy 的人都会将None 识别为插入了一个额外的维度(轴)。

当然,您也可以从一开始就将arr2 设置为 3 维:

arr2 = np.zeros([6,10,1])

请注意,从左侧使用广播确实起作用:

>>> arr1 = np.zeros([50,6,10])   # Swapped ("rolled") dimensions
>>> arr2 = np.zeros([6,10])
>>> arr1[25:26, :, :] = arr2     # No need to add an extra axis

只是从右边使用它不起作用,就像在你的代码中一样。

【讨论】:

  • arr2[..., None]代替arr2.reshape(arr2.shape + (1,))怎么样?
  • @n None 确实也可以;在看到您使用该选项的评论之前,我刚刚编辑了我的答案,尽管我使用了np.newaxis 来更明确。麻烦的是,我觉得解决这个问题的方法太多了,只能找到一个简单、一致的答案。
  • 谢谢我终于用arr1[:, :, range(25,26,1)] = arr2[..., None]了。因为在我的代码中,range(25,26,1) 是一个遗留变量。
【解决方案2】:

由于range(25, 26, 1) 实际上是一个数字,您可以使用以下任一:

arr1[:, :, 25:26] = arr2[..., None]

或:

arr1[:, :, 25] = arr2

代替arr1[:, :, range(25,26,1)] = [arr2]

请注意,对于不减少为单个数字的范围/切片,第一行将使用 broadcasting

您的原始代码不起作用的原因是您以不兼容的方式混合 NumPy 数组和 Python lists,因为 NumPy 将 [arr2] 解释为具有形状 (1, 6, 10) 而结果需要形状 @ 987654329@(你得到的错误基本上就是这个。)


上述解决方案旨在确保arr2 的形状兼容。 另一种可能性是更改收件人的形状,这将允许您分配[arr2],例如:

arr1 = np.zeros([50,6,10])
arr2 = np.zeros([6,10])
arr1[25:26, :, :] = [arr2]

这种方法可能效率较低,因为arr2[..., None] 只是arr2 中相同数据的内存视图,而[arr2] 正在创建(读取:分配新内存)一个新的list 对象,这将需要将一些强制转换(发生在幕后)分配给 NumPy 数组。

【讨论】:

    猜你喜欢
    • 2019-03-05
    • 2021-05-22
    • 2021-12-12
    • 2013-06-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-27
    • 2019-06-10
    相关资源
    最近更新 更多