[英]How to properly index a big matrix in python
我有一個大的numpy數組與某些條目。 假設一個虛擬的例子是:
arr = np.array([[[1.0, 2.0, 3.0],[1.5, 1.8, 3.2]],
[[1.3, 1.7, 1.9],[1.4, 1.9, 2.1]],
[[1.8, 2.2, 2.5],[2.0, 2.2, 2.8]]])
我想知道arr
條目落在某個范圍內的所有索引,比如1.5
和2.4
。 我想補相同的形狀的另一矩陣arr
與1
在其中的價值指數arr
落入該范圍內,以其他方式與0
。 也就是說,我想得到一個矩陣,如:
mask = np.array([[[0, 1, 0], [1, 1, 0]],
[[0, 1, 1], [0, 1, 1]],
[[1, 1, 0], [1, 1, 0]]])
有沒有簡單的numpy
技巧來做到這一點? 我知道使用for loop
來做這件事很簡單,但由於我的arr
非常大,我希望它的速度相當快。 謝謝
您可以使用masking和np.where
:首先創建一個條件掩碼,組合您的兩個邊界條件,然后將其傳遞給np.where
。 矩陣將被賦值為1
,此條件保持為True否則為0
如果為False
最小的工作答案
import numpy as np
arr = np.array([[[1.0, 2.0, 3.0],[1.5, 1.8, 3.2]],
[[1.3, 1.7, 1.9],[1.4, 1.9, 2.1]],
[[1.8, 2.2, 2.5],[2.0, 2.2, 2.8]]])
mask = ((arr>1.5) & (arr<2.4))
arr = np.where(mask, 1, 0)
print (arr)
產量
array([[[0, 1, 0],
[0, 1, 0]],
[[0, 1, 1],
[0, 1, 1]],
[[1, 1, 0],
[1, 1, 0]]])
創建符合條件的布爾掩碼。 將0添加到布爾值會將它們轉換為數字結果:
import numpy as np
arr = np.array([[[1.0, 2.0, 3.0],[1.5, 1.8, 3.2]],
[[1.3, 1.7, 1.9],[1.4, 1.9, 2.1]],
[[1.8, 2.2, 2.5],[2.0, 2.2, 2.8]]])
arr_out = ((arr>=1.5) & (arr<=2.4)) + 0
print(arr_out)
或者:
arr_out = np.array(((arr>=1.5) & (arr<=2.4)), dtype=np.uint8)
print(arr_out)
或者,正如@hpaulj所建議的那樣:
arr_out = ((arr>=1.5) & (arr<=2.4)).astype(int)
print (arr_out)
輸出:
[[[0 1 0]
[1 1 0]]
[[0 1 1]
[0 1 1]]
[[1 1 0]
[1 1 0]]]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.