Python NumPy中两个布尔数组的索引

Python NumPy中两个布尔数组的索引,python,arrays,numpy,indexing,Python,Arrays,Numpy,Indexing,我在numpy数组中有一些数据,然后我想选择子集的子集,并更新这些值 假设第一个数组A有N个元素。然后,我使用一个布尔数组mask1,以N个元素作为掩码来选择第一个子集。然后,我使用第二个布尔数组mask2和sum(mask1)元素来选择第一个子集的子集。但当我尝试更新这些值时,它们不会存储到原始数组中 代码示例: N = 10 A = np.arange(N) # Create mask of size N, with only some True values mask1 = np.zer

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

假设第一个数组A有N个元素。然后,我使用一个布尔数组mask1,以N个元素作为掩码来选择第一个子集。然后,我使用第二个布尔数组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]

如果我只使用一个布尔数组进行索引,那么值就会更新,所以这是一个可能的解决方法。然而,我正在为一个物理过程实现一个算法,在这个算法中,首先创建一个掩码,根据一个标准子集,然后根据另一个标准进一步子集,这是非常自然的,所以如果我能让它工作,那将是非常优雅的。

一个性能良好的算法将使用链式掩码-

没有那么好的表现-

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