簡體   English   中英

python:使用相應的2d數組在3d numpy數組的每個切片中設置索引值

[英]python: setting values of indices in every slice of 3d numpy array with corresponding 2d array

我有一個大小為 8x512x512 的 3d 堆棧,並且想根據兩個對應的 2d 512x512 數組為每個 8x --512x512-- 數組設置值。

Array1 是一個具有我想要的某種形狀的二進制文件,而 Array2 具有我想要通過 3d 數組投影的值。 我希望 Array2 中的值出現在 3d 數組中的每個 512x512 切片上,其中 Array1 值等於 1。所以如果 Array1 是一個邊界框而 Array2 是一張貓圖片,它的臉位於邊界框的區域內......我希望將貓臉投影到 8x512x512 陣列的每個 8x 切片上。

我認為這是一個簡單的問題,但只能想到我認為這樣做的愚蠢方法:

Array1 = np.zeros((512,512)); Array1[10:20,40:60]=1
Array2 = np.load(somecatpicture)
Array3d = np.random.rand(8,512,512)

for imnum in range(Array3d.shape[0]):
    tmp = np.copy(Array3d[imnum,...])
    tmp[Array1==1] = Array2[Array1==1]
    Array3d[imnum,...] = tmp

或者:

Array1 = np.zeros((512,512)); Array1[10:20,40:60]=1
Array2 = np.load(somecatpicture)
Array3d = np.random.rand(8,512,512)

stack1 = np.array([Array1 for i in range(Array3d.shape[0])])
stack2 = np.array([Array2 for i in range(Array3d.shape[0])])
Array3d[stack1==1] = stack2[stack1==1]

我假設有一些方法可以在沒有循環或列表理解的情況下做到這一點:

Array3d[:,[Array1==1]]=Array2[Array1==1]

?

讓我們用一個更小的例子來嘗試這個,我們可以形象化

圖像和蒙版。 mask==1與將其轉換為布爾值相同:

In [280]: img = np.arange(12).reshape(3,4)*10                                                  
In [281]: mask = np.zeros((3,4),int); mask[1,1:3]=1                                            
In [282]: mask = mask.astype(bool)                                                             
In [283]: mask                                                                                 
Out[283]: 
array([[False, False, False, False],
       [False,  True,  True, False],
       [False, False, False, False]])

所以圖像的選定部分是:

In [284]: img[mask]                                                                            
Out[284]: array([50, 60])

定義 3d 目標數組:

In [285]: arr = np.arange(24).reshape(2,3,4)                                                   
In [286]: arr                                                                                  
Out[286]: 
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]],

       [[12, 13, 14, 15],
        [16, 17, 18, 19],
        [20, 21, 22, 23]]])

應用掩碼 - 使用第一個維度的[[0],[1]]索引:

In [287]: arr[np.arange(arr.shape[0])[:,None],mask]                                            
Out[287]: 
array([[ 5,  6],
       [17, 18]])

並插入:

In [288]: arr[np.arange(arr.shape[0])[:,None],mask]=img[mask]                                  
In [289]: arr                                                                                  
Out[289]: 
array([[[ 0,  1,  2,  3],
        [ 4, 50, 60,  7],
        [ 8,  9, 10, 11]],

       [[12, 13, 14, 15],
        [16, 50, 60, 19],
        [20, 21, 22, 23]]])

np.arange(arr.shape[0])[:,None]是將插入應用於所有塊的關鍵。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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