【问题标题】:Indexing with two boolean arrays in NumPy在 NumPy 中使用两个布尔数组进行索引
【发布时间】:2021-02-07 23:54:36
【问题描述】:

我在一个 numpy 数组中有一些数据,然后我想选择一个子集的一个子集,并更新这些值。

假设第一个数组 A 有 N 个元素。然后,我使用带有 N 个元素的布尔数组 mask1 作为掩码来选择第一个子集。然后,我使用带有 sum(mask1) 元素的第二个布尔数组 mask2 来选择第一个子集的子集。但是当我尝试更新这些值时,它们并没有存储到原始数组中。

代码示例:

N = 10
A = np.arange(N)

# Create mask of size N, with only some True values
mask1 = np.zeros(N, dtype = np.bool)
mask1[:7] = True

# Create mask of size (sum(mask1)), with only some True values
mask2 = np.zeros(np.sum(mask1), dtype = np.bool)
mask2[2:] = True

# Indexing with both masks works as expected:
print(A[mask1][mask2])

打印出来

[2 3 4 5 6]

正如预期的那样。但是当我尝试更新以这种方式索引的值时,它不起作用。

# Trying to update those values does not work:
A[mask1][mask2] = -1
print(A)

这将打印原始的、未更改的数组:

[0 1 2 3 4 5 6 7 8 9]

如果我只使用一个布尔数组进行索引,则值会更新,因此这是一种可能的解决方法。但是,我正在为一个物理过程实现一个算法,首先创建一个掩码,根据一个标准进行子集化,然后根据另一个标准进一步对其进行子集化,这真的很自然,所以如果我能做到这一点,那就太好了工作。

【问题讨论】:

    标签: python arrays numpy indexing


    【解决方案1】:

    使用 chained-masking -

    mask1[mask1] = mask2
    A[mask1] = -1
    

    性能不太好 -

    A[np.flatnonzero(mask1)[mask2]] = -1
    

    【讨论】:

      猜你喜欢
      • 2018-07-06
      • 1970-01-01
      • 2021-08-01
      • 2020-03-25
      • 2020-08-27
      • 1970-01-01
      • 2021-01-06
      • 2018-12-13
      • 2013-07-20
      相关资源
      最近更新 更多