多维索引切片后数组的维度
Dimensions of array after multidimensional index slicing
我想使用索引切片沿其 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)
被切片破坏的轴产生的轴这次没有移动到前面。
我的猜测是与切片轴是否相邻有关,但我想知道这种行为是从什么规律出现的。
如果应用于二维数组,您的 where
掩码将生成一维 (7,)
形状数组,条件为真时的值。您将其表述为 'destroying' 一对轴。
在第二种情况下,7
可以放在2
和5
之间。
但在第一个中,由于中间的切片(非邻接),它是模棱两可的 - 回退规则是将它放在第一位,然后对切片进行排序。换句话说,它不是试图在 (2,7,4) 和 (2,4,7) 顺序之间进行选择,而是选择 (7,2,4)。
本例歧义明确,默认合理。它更复杂,一个或多个维度被标量索引消除。
我想使用索引切片沿其 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)
被切片破坏的轴产生的轴这次没有移动到前面。
我的猜测是与切片轴是否相邻有关,但我想知道这种行为是从什么规律出现的。
如果应用于二维数组,您的 where
掩码将生成一维 (7,)
形状数组,条件为真时的值。您将其表述为 'destroying' 一对轴。
在第二种情况下,7
可以放在2
和5
之间。
但在第一个中,由于中间的切片(非邻接),它是模棱两可的 - 回退规则是将它放在第一位,然后对切片进行排序。换句话说,它不是试图在 (2,7,4) 和 (2,4,7) 顺序之间进行选择,而是选择 (7,2,4)。
本例歧义明确,默认合理。它更复杂,一个或多个维度被标量索引消除。