对于3d数组

时间:2018-03-18 14:02:27

标签: python numpy

当我尝试切割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)?

最新版本出乎意料地换掉尺寸。为什么呢?

2 个答案:

答案 0 :(得分:1)

您正在使用两种数组索引方法的组合。 Python中常用的方法是所谓的基本索引,其中使用切片m:n和省略号...来定义数组的切片。另一种方法称为Advanced Indexing,您可以使用元组或列表来指定选择。两种方法的区别在于,高级索引方法生成数据的副本,而基本索引则不生成。

组合基本索引和高级索引时,阵列的内存布局可能会发生变化。

第一个示例中,被视为高级索引的维度彼此相邻,因此会保留形状。

第二个示例中,被视为高级索引的维度散布着具有基本索引的维度。因此,高级索引维度在结果数组中排在第一位。

答案 1 :(得分:1)

它在docs

引用:

结合高级和基本索引

...

了解情况的最简单方法可能是考虑结果形状。索引操作分为两部分,即由基本索引(不包括整数)定义的子空间和来自高级索引部分的子空间。需要区分两种指数组合:

  • 高级索引由切片,省略号或新轴分隔。例如x [arr1,:,arr2]。
  • 高级索引彼此相邻。例如x [...,arr1,arr2,:]但不是x [arr1,:,1],因为1是这方面的高级索引。

在第一种情况下,高级索引操作产生的维度首先出现在结果数组中,然后是子空间维度。在第二种情况下,高级索引操作的维度将插入到结果数组中与初始数组中相同的位置(后一种逻辑使简单的高级索引行为就像切片一样)。

引文结束。