【问题标题】:Numpy 2D indexing of a 1D array with known min, max indices具有已知最小、最大索引的一维数组的 Numpy 2D 索引
【发布时间】:2022-01-19 14:52:54
【问题描述】:

我有一个 False 布尔值的 1D numpy 数组,以及一个 2D numpy 数组,其中包含第一个数组中要更改为 True 的值的最小、最大索引。

一个例子:

my_data = numpy.zeros((10,), dtype=bool)
inds2true = numpy.array([[1, 3], [8, 9]])

我想要以下结果:

out = numpy.array([False, True, True, True, False,  False,  False,  False, True, True])

在带有 Numpy 的 Python 中这怎么可能?

编辑:我希望一步完成(即不循环)。

【问题讨论】:

  • 在 numpy 中似乎不是一件容易的事。 There is a related question
  • 您必须以一种或其他方式遍历inds2true,无论是将这些对应用为切片,还是将它们转换为一个索引数组。所以这是可能的,但不是盲目的简单。

标签: python numpy np


【解决方案1】:
import numpy as np
my_data = np.zeros((10,), dtype=bool)
inds2true = np.array([[1, 3], [8, 9]])
indeces = []
for ix_range in inds2true:
    indeces += list(range(ix_range[0], ix_range[1] + 1))
my_data[indeces] = True

【讨论】:

    【解决方案2】:

    有一个违反规则的黑客:

    my_data[inds2true] = True
    my_data = np.cumsum(my_data) % 2 == 1
    my_data
    >>> array([False,  True,  True, False, False, False, False, False,  True, False])
    

    最常见的做法是更改 np.arange([1, 3])np.arange([8, 9]) 内的索引,不包括 3 或 9。如果您仍想包括它们,请添加:my_data[inds2true[:, 1]] = True

    如果您正在寻找其他选项来一次性完成,最有可能包括np.cumsum 技巧。

    【讨论】:

    • 非常聪明。 “违反规则”是什么意思?
    • 嗯,inds2true 通常是一维数组的一维索引。在第二种情况下,您应该使用多个数组作为Advanced Indexing 的情况。我不习惯像这样使用一维数组的二维索引:my_data[inds2true]。我宁愿这样做:my_data[inds2true.ravel()]
    猜你喜欢
    • 2019-11-20
    • 1970-01-01
    • 1970-01-01
    • 2015-11-12
    • 1970-01-01
    • 2019-01-09
    • 1970-01-01
    • 2015-08-11
    • 2013-03-04
    相关资源
    最近更新 更多