当我尝试切割Numpy数组(3d)时,会发生意外情况。
import numpy as np
x=np.array(
[ [[1., 2., 3., 4., 5.],
[6., 7., 8., 9., 0.],
[1., 2., 3., 4., 5.],
[6., 7., 8., 9., 0.]],
[ [11., 12., 13., 14., 15.],
[16., 17., 18., 19., 10.],
[11., 12., 13., 14., 15.],
[16., 17., 18., 19., 10.]],
[ [21., 22., 23., 24., 25.],
[26., 27., 28., 29., 20.],
[21., 22., 23., 24., 25.],
[26., 27., 28., 29., 20.]]]
)
print(x.shape) #(3,4,5)
print(x[:,0,[0,1,2,3,4]].shape) #(3,5) as expected
print(x[0,:,[0,1,2,3,4]].shape) #(5,4) why not (4,5)?
最新版本出乎意料地换掉尺寸。为什么呢?
答案 0 :(得分:1)
您正在使用两种数组索引方法的组合。 Python中常用的方法是所谓的基本索引,其中使用切片m:n
和省略号...
来定义数组的切片。另一种方法称为Advanced Indexing,您可以使用元组或列表来指定选择。两种方法的区别在于,高级索引方法生成数据的副本,而基本索引则不生成。
组合基本索引和高级索引时,阵列的内存布局可能会发生变化。
在第一个示例中,被视为高级索引的维度彼此相邻,因此会保留形状。
在第二个示例中,被视为高级索引的维度散布着具有基本索引的维度。因此,高级索引维度在结果数组中排在第一位。
答案 1 :(得分:1)
它在docs
中引用:
...
了解情况的最简单方法可能是考虑结果形状。索引操作分为两部分,即由基本索引(不包括整数)定义的子空间和来自高级索引部分的子空间。需要区分两种指数组合:
在第一种情况下,高级索引操作产生的维度首先出现在结果数组中,然后是子空间维度。在第二种情况下,高级索引操作的维度将插入到结果数组中与初始数组中相同的位置(后一种逻辑使简单的高级索引行为就像切片一样)。
引文结束。