python - 多维索引切片后数组的维度

标签 python arrays numpy slice dimension

我想使用索引切片沿其 2 个轴对多维 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 的元组。 为了保留剩余的尺寸,我将使用 slice(None) 对象:

b = a[(slice(None), mask[0], slice(None), mask[1])]

这改变了形状:

>>> a.shape
(2, 3, 4, 5)
>>> b.shape
(7, 2, 4)

未触及的轴(即使用 slice(None) 对象切片)似乎已被保留,而切片轴被破坏,并且生成的轴被移动到前面。

但是,情况并非总是如此。当我将 mask 应用于轴 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 的元组):

>>> c.shape
(2, 7, 5)

被切片破坏的轴所产生的轴这次没有移动到前面。

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

最佳答案

https://docs.scipy.org/doc/numpy-1.15.4/reference/arrays.indexing.html#combining-advanced-and-basic-indexing

如果应用于 2d 数组,您的 where 掩码将生成 1d (7,) 形状数组,即条件为 true 的值。你将其表述为“摧毁”一对斧头。

在第二种情况下,7 可以放置在 25 之间。

但在第一个中,由于中间的切片(非相邻),它是不明确的 - 回退规则是将其放在前面,然后将切片排序在后面。换句话说,它不会尝试在 (2,7,4) 和 (2,4,7) 顺序之间进行选择,而是选择 (7,2,4)。

在这种情况下,歧义很明显,并且默认值是合理的。由于一个或多个维度被标量索引消除,情况变得更加复杂。

关于python - 多维索引切片后数组的维度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53672180/

相关文章:

python - 使用一个数据帧在其他数据帧上创建组,然后取平均值

非关联数组上的 PHP in_array 行为

java - 如何在java、android中初始化巨大的 float 组?

python ,OpenCV : Increasing image brightness without overflowing UINT8 array

python - python 中用于 nd 数组的逻辑索引

python - 如何在满足多个条件的 numpy 数组中找到索引?

Python 无法在与其能找到的其他子模块相同的目录中找到子模块

python - 在python中的mysql表中插入时间戳

python - 计算一维 numpy 数组中的局部均值

python - 为什么两个机器上安装了不同版本的 numpy 和 scipy