簡體   English   中英

如何正確索引python中的大矩陣

[英]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.52.4 我想補相同的形狀的另一矩陣arr1在其中的價值指數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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM