考虑以下内容:
import numpy as np
a = np.random.rand(123, 45, 3)
print(a[:, :, [0, 1]].shape) # (123, 45, 2)
print(a[:, 0, [0, 1]].shape) # (123, 2)
print(a[0, :, [0, 1]].shape) # (2, 45)
为什么最后一个阵列转移?
文档的索引部分中所述:
当索引中至少有一个切片(
:
),省略(或阵列具有比高级索引的尺寸)时,行为可能更复杂。这就像对每个高级索引元素的索引结果串联。[...]理解多个高级指数组合的最简单方法可能是从由此产生的形状方面进行思考。索引操作有两个部分,即基本索引(不包括整数)定义的子空间和从高级索引部分中的子空间。需要区分两种指数组合的情况:高级索引被切片,省略于椭圆形或新索引。例如...
高级指数彼此相邻。例如
但不是
newaxis
x[arr1, :, arr2]
,因为x[..., arr1, arr2, :]
是这方面的高级索引。在第一种情况下,由高级索引操作产生的尺寸在结果数组中首先出现,之后的子空间尺寸。在第二种情况下,来自高级索引操作的尺寸被插入结果数组与初始数组中的同一地点(后一种逻辑是使简单的高级索引像切片一样表现的原因)。
在您的情况下,与第二种情况匹配(维护尺寸的原始顺序),
x[arr1, :, 1]
第一个情况(先进的索引首先)。 您可能会使用:1
a[:, 0, [0, 1]]