我在 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
添加回答
舉報
0/150
提交
取消