为了账号安全,请及时绑定邮箱和手机立即绑定

在 NumPy 中使用两个布尔数组进行索引

在 NumPy 中使用两个布尔数组进行索引

慕勒3428872 2024-01-04 17:22:47
我在 numpy 数组中有一些数据,然后我想选择子集的子集,并更新这些值。假设第一个数组 A 有 N 个元素。然后,我使用布尔数组 mask1,其中 N 个元素作为掩码来选择第一个子集。然后,我使用第二个布尔数组 mask2 和 sum(mask1) 元素来选择第一个子集的子集。但是当我尝试更新这些值时,它们不会存储到原始数组中。代码示例:N = 10A = np.arange(N)# Create mask of size N, with only some True valuesmask1 = np.zeros(N, dtype = np.bool)mask1[:7] = True# Create mask of size (sum(mask1)), with only some True valuesmask2 = 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] = -1print(A)这将打印原始的、未更改的数组:[0 1 2 3 4 5 6 7 8 9]如果我仅使用一个布尔数组进行索引,那么值就会更新,所以这是一种可能的解决方法。但是,我正在为物理过程实现一种算法,其中首先创建一个掩码,根据一个标准进行子集化,然后根据另一个标准进一步对它进行子集化,这是非常自然的,所以如果我可以将其实现,那将非常优雅工作。
查看完整描述

1 回答

?
冉冉说

TA贡献1877条经验 获得超1个赞

一个高性能的将是链式掩蔽-

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

性能不太好 -

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


查看完整回答
反对 回复 2024-01-04
  • 1 回答
  • 0 关注
  • 49 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信