[英]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.