Python 多维索引切片后的数组维数

Python 多维索引切片后的数组维数,python,arrays,numpy,slice,dimension,Python,Arrays,Numpy,Slice,Dimension,我想使用索引切片沿其两个轴切片多维numpy数组(>2维)。每个原始维度的结束位置有什么规则 为了说明我的问题,让我举一个例子。假设我们有一个4D阵列: import numpy as np a = np.arange(2*3*4*5).reshape(2,3,4,5) 我将使用numpy.where创建一个索引元组,用于沿轴1和3进行切片: mask = np.where(np.random.rand(3,5) > 0.5) 这将从我的数组a中选择随机切片。假设它返回长度为7的元

我想使用索引切片沿其两个轴切片多维numpy数组(>2维)。每个原始维度的结束位置有什么规则


为了说明我的问题,让我举一个例子。假设我们有一个4D阵列:

import numpy as np

a = np.arange(2*3*4*5).reshape(2,3,4,5)
我将使用numpy.where创建一个索引元组,用于沿轴1和3进行切片:

mask = np.where(np.random.rand(3,5) > 0.5)
这将从我的数组
a
中选择随机切片。假设它返回长度为7的元组。 要保留其余尺寸,我将使用
切片(无)
对象:

b = a[(slice(None), mask[0], slice(None), mask[1])]
这改变了形状:

>>> a.shape
(2, 3, 4, 5)
>>> b.shape
(7, 2, 4)
未触及的轴(即使用
切片(无)
对象进行切片)似乎已被保留,而被切片的轴将被破坏,生成的轴将移动到前面

然而,情况并非总是如此。将遮罩应用于轴1和轴2时:

mask2 = np.where(np.random.rand(3,4) > 0.5)
c = a[(slice(None), mask[0], mask[1], slice(None))]
我观察到以下情况(numpy.where再次返回长度为7的元组):

由于被切片破坏的轴而产生的轴这次没有移动到前面

我的猜测是,这与切片轴是否相邻有关,但我想知道这种行为是根据什么规则产生的。

您的
其中
遮罩将生成1d
(7,)
形状数组如果应用于2d数组,则条件为真的值。你把它称为“摧毁”一对斧子

在第二种情况下,
7
可置于
2
5
之间

但是,第一个是模糊的,因为中间的切片(非邻接)-回落规则是把它放在第一位,然后命令切片。换句话说,它不是尝试在(2,7,4)和(2,4,7)顺序之间进行选择,而是选择(7,2,4)


在这种情况下,模糊性是明确的,默认值是合理的。更复杂的是,一个或多个维度被标量索引所消除。

混合切片(基本索引)和掩码(高级索引)时,有一个记录在案的复杂性。可以使用布尔掩码将切片尺寸移动到endAfaik,因为索引不是“切片”,而是高级索引。切片是指选择某种时间范围,比如说
4:7
slice(4,7)
。切片应该保留数组的维度,而高级索引很可能会减少这些维度。您可能会发现我的回答很有帮助:。
>>> c.shape
(2, 7, 5)