indexError:形状不匹配:索引阵列无法与形状一起播放(2,)(3,)
我有一个 np.ndarray
Shape (5,5,5,2,2,2,10,8)
命名 table
。我可以像这样成功地将其切成薄片:
table[4, [0, 1], 1, 1, 1, slice(0, 10, None), slice(0, 8, None)]
table[4, [0, 1], 1, 1, 1, [0, 2], slice(0, 8, None)]
但是由于某种原因,当我尝试为尺寸5(长度10)指定三个值时:
table[4, [0, 1], 1, 1, 1, [0, 2, 6], slice(0, 8, None)]
我得到:
>>> IndexError: shape mismatch: indexing arrays could not be broadcast together with shapes (2,) (3,)
相同的是:
table[4, [0, 1, 4], 1, 1, 1, [0, 2], slice(0, 8, None)]
这不会发生:
table[4, [0, 1, 4], 1, 1, 1, slice(0, 10, None), slice(0, 8, None)]
table[4, [1, 0, 4], 1, 1, 1, slice(0, 10, None), slice(0, 8, None)]
哪个输出正确的结果。
我试图在广播上阅读类似的问题,但是我仍然感到困惑为什么 numpy
无法理解此切片符号。当我沿着轴上已经有另一个数组时,当我沿着轴上拿出两个以上的点以将其切成薄片时,为什么它会感到困惑?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您使用
slice
而不是:
的事实并不重要;同样的是,不必指定尾随的切片。这具有高级索引数组/长度2的列表 - 其他维度是标量或切片。因此它们消失了或“通过”。
在这里,您有两个高级索引列表 - 长度2,因此它们一起“广播”以选择2个值(我认为这是一种“对角线”)。
与以前相同,但有3个列表。
但是,当两个列表具有不同的长度时,您会遇到错误:
如果一个列表为(2,1),则可以工作 - 它在一个维度中选择2个,而另一个列表则在另一个维度中选择:
索引中的“广播”遵循相同的规则就像添加(或乘法)数组时一样。
编辑
查看更简单的2D数组:
如果我用2(2,)阵列索引,则获得2个值:
但是如果我用(2,1)和(2,)索引,我会得到(2,2)形状结果。请注意[1,5]值在哪里:
ix _
是用于构建此类“笛卡尔”索引数组的方便工具。例如,我得到的3个列表:这些列表将从3D(或更大)数组中选择一个形状(2,3,2)的块。
正式地,这在
(您的切片都在最后。当切片在中间出现切片时,此索引有些细微差别。请参阅有关
组合
组合高级的小节如果出现了基本索引
。)The fact that you use
slice
instead of:
doesn't matter; same for the fact that the trailing slices don't have to be specified.This has an advanced indexing array/list of length 2 - the other dimensions are either scalars or slices. So they disappear or 'pass through'.
Here you have two advanced indexing lists - both length 2, so they 'broadcast' together to select 2 values (I think of this as a kind of 'diagonal').
Same as before but with a length 3 list.
But when the 2 lists have different length you get an error:
If one list is (2,1), then it works - it selects 2 in one dimension, and 3 in the other:
In indexing, 'broadcasting' follows the same rules as when adding (or multiplying) arrays.
edit
Look at a simpler 2d array:
If I index with 2 (2,) arrays I get 2 values:
But if I index with a (2,1) and (2,), I get a (2,2) shape result. Note where the [1,5] values are:
ix_
is a handy tool for constructing such a "cartesian" set of indexing arrays. For example 3 lists I get:Together those will select a block of shape (2,3,2) from a 3d (or larger) array.
Formally this is described in https://numpy.org/doc/stable/user/basics.indexing.html#advanced-indexing
(Your slices are all at the end. There is a nuance to this indexing when slices occur in the middle. See the subsection about
Combining advanced and basic indexing
if that arises.)