【发布时间】:2019-05-09 09:02:06
【问题描述】:
我想使用索引切片沿 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) 对象切片)似乎已被保留,而切片的轴被破坏并且生成的轴被移动到前面。
但是,情况并非总是如此。当我对轴 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)
已经被切片破坏的轴产生的轴这次没有移动到前面。
我的猜测是与切片轴是否相邻有关,但我想知道这种行为是从什么规则出现的。
【问题讨论】:
-
在混合切片(基本索引)和掩码(高级索引)时有一个记录在案的复杂性。切片尺寸可以移动到末尾
-
Afaik 使用布尔掩码作为索引不称为“切片”,而是高级索引。切片是指选择某种时间范围,比如
4:7或slice(4, 7)。切片应该保留数组的维度,而高级索引很可能会减少它们。 -
您可能会发现我的回答很有帮助:stackoverflow.com/questions/10921893/…。
标签: python arrays numpy slice dimension