在NumPy中使用两个布尔数组建立索引

时间:2020-10-25 14:46:37

标签: python arrays numpy indexing

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

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

代码示例:

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]

如果仅使用一个布尔数组进行索引,则值将更新,因此这是一种可能的解决方法。但是,我正在为物理过程实现一种算法,首先创建一个蒙版,然后根据一个条件进行子集化,然后再根据另一个条件进行子集化,这是很自然的事情,因此,如果我能够做到这一点,那将是非常优雅的工作。

1 个答案:

答案 0 :(得分:2)

一个表演者将带有 chained-masking -

[delay 1000]

表现不佳-

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