【问题标题】:Dimensions of array after multidimensional index slicing多维索引切片后数组的维度
【发布时间】: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:7slice(4, 7)。切片应该保留数组的维度,而高级索引很可能会减少它们。
  • 您可能会发现我的回答很有帮助:stackoverflow.com/questions/10921893/…

标签: python arrays numpy slice dimension


【解决方案1】:

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

如果将 where 掩码应用于二维数组,则您的 where 掩码将生成一维 (7,) 形状数组,条件为真的值。您将其表述为“摧毁”一对轴。

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

但首先它是模棱两可的,因为中间的切片(非邻接) - 后备规则是将它放在第一位,然后对切片进行排序。换句话说,它不会尝试在 (2,7,4) 和 (2,4,7) 顺序之间进行选择,而是选择 (7,2,4)。

这种情况下的歧义是明确的,默认是合理的。通过标量索引消除一个或多个维度会更复杂。

【讨论】:

    猜你喜欢
    • 2015-10-23
    • 2020-06-09
    • 2021-12-18
    • 2012-06-30
    • 2023-03-29
    • 2020-07-19
    • 2018-11-07
    • 2017-09-20
    • 1970-01-01
    相关资源
    最近更新 更多