[英]move values of 3D array knowing new coordinates with mask
我想擴展一個我在Stackoverflow上討論過的問題。 它正在處理2D numpy數組,我想用三維數組做同樣的事情。
我想將2D數組的元素“移動”到新坐標,這些坐標存儲在其他2個數組中。 我希望自動化這個,因為實際上我的陣列很大(400x200x100)。 有些值不會找到他的坐標並且不會被使用,其中一些坐標被屏蔽,我在下面的例子中通過使用值0指示。如果坐標被屏蔽,我想要重新洗牌的數組中的元素將不會使用。
import numpy as np
#My new coordinates in X and Y directions
mx = np.array([[[ 1., 2., 3., 4., 0.],
[ 1., 2., 3., 4., 0.],
[ 1., 2., 3., 4., 0.],
[ 1., 2., 3., 4., 0.],
[ 1., 2., 3., 4., 0.]],
[[ 1., 2., 3., 4., 0.],
[ 1., 2., 3., 4., 0.],
[ 1., 2., 3., 4., 0.],
[ 1., 2., 3., 4., 0.],
[ 1., 2., 3., 4., 0.]]])
my = np.array([[[ 0., 2., 2., 2., 2.],
[ 0., 3., 3., 3., 3.],
[ 0., 4., 4., 4., 4.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.]],
[[ 0., 2., 2., 2., 2.],
[ 0., 3., 3., 3., 3.],
[ 0., 4., 4., 4., 4.],
[ 0., 0., 0., 0., 0.],
[ 0., 0., 0., 0., 0.]]])
IRtest = np.array([[[-0.07383495, -0.08606554, -0.08480594, -0.08099556, -0.08218414],
[-0.07866761, -0.08373 , -0.08253587, -0.08106102, -0.08220205],
[-0.07727436, -0.08271511, -0.0807254 , -0.07832416, -0.08021686],
[-0.07612349, -0.08190446, -0.07996929, -0.07842754, -0.08024891],
[-0.07488144, -0.08150557, -0.08038229, -0.07895656, -0.07997815]],
[[-0.07383495, -0.08606554, -0.08480594, -0.08099556, -0.08218414],
[-0.07866761, -0.08373 , -0.08253587, -0.08106102, -0.08220205],
[-0.07727436, -0.08271511, -0.0807254 , -0.07832416, -0.08021686],
[-0.07612349, -0.08190446, -0.07996929, -0.07842754, -0.08024891],
[-0.07488144, -0.08150557, -0.08038229, -0.07895656, -0.07997815]]])
因此預期的陣列看起來像:
array_expected = np.array([[[-0.08271511, -0.0807254 , -0.07832416, -0.08021686, 0],
[-0.08190446, -0.07996929, -0.07842754, -0.08024891, 0],
[-0.08150557, -0.08038229, -0.07895656, -0.07997815, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]],
[[-0.08271511, -0.0807254 , -0.07832416, -0.08021686, 0],
[-0.08190446, -0.07996929, -0.07842754, -0.08024891, 0],
[-0.08150557, -0.08038229, -0.07895656, -0.07997815, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]]])
我試着用我上一篇文章得到的代碼部分。
b = np.zeros_like(IRtest)
for i in range(IRtest.shape[1]):
for j in range(IRtest.shape[2]):
for k in range(IRtest.shape[0]):
b[k, j, i] = IRtest[k,my[k,j,i],mx[k,j,i]]*(mx[k,j,i]!=-1)*(my[k,j,i]!=-1)
b
但結果與我預期的結果不一樣:
array([[[-0.08606554, -0.0807254 , -0.07832416, -0.08021686, -0.07727436],
[-0.08606554, -0.07996929, -0.07842754, -0.08024891, -0.07612349],
[-0.08606554, -0.08038229, -0.07895656, -0.07997815, -0.07488144],
[-0.08606554, -0.08480594, -0.08099556, -0.08218414, -0.07383495],
[-0.08606554, -0.08480594, -0.08099556, -0.08218414, -0.07383495]],
[[-0.08606554, -0.0807254 , -0.07832416, -0.08021686, -0.07727436],
[-0.08606554, -0.07996929, -0.07842754, -0.08024891, -0.07612349],
[-0.08606554, -0.08038229, -0.07895656, -0.07997815, -0.07488144],
[-0.08606554, -0.08480594, -0.08099556, -0.08218414, -0.07383495],
[-0.08606554, -0.08480594, -0.08099556, -0.08218414, -0.07383495]]])
你的地圖矩陣是錯誤的,要得到你想要的結果就像這樣(因為,當你把值放入b時,你正在檢查m [k,j,i]!= -1並且你想要最后一列為0,而不是第一個)
mx = np.array([[[ 1., 2., 3., 4., -1.],
[ 1., 2., 3., 4., -1.],
[ 1., 2., 3., 4., -1.],
[ 1., 2., 3., 4., -1.],
[ 1., 2., 3., 4., -1.]],
[[ 1., 2., 3., 4., -1.],
[ 1., 2., 3., 4., -1.],
[ 1., 2., 3., 4., -1.],
[ 1., 2., 3., 4., -1.],
[ 1., 2., 3., 4., -1.]]])
my = np.array([[[ 2., 2., 2., 2., -1.],
[ 3., 3., 3., 3., -1.],
[ 4., 4., 4., 4., -1.],
[ -1., -1., -1., -1., -1.],
[ -1., -1., -1., -1., -1.]],
[[ 2., 2., 2., 2., -1.],
[ 3., 3., 3., 3., -1.],
[ 4., 4., 4., 4., -1.],
[ -1., -1., -1., -1., -1.],
[ -1., -1., -1., -1., -1.]]])
同樣在你的循環中,最好切換第一個和第二個循環中的尺寸,使它們變成
for i in range(IRtest.shape[2]):
for j in range(IRtest.shape[1]):
for k in range(IRtest.shape[0]):
這對於你在這里給出的情況無關緊要,因為矩陣是正方形的,但是你提到矩陣的真正問題不是正方形,因此它成為一個問題。
總結一下你之前關於2dim的問題的答案,你可以簡單地使用花式索引(當然,在修復數組的dtypes之后):
b = IRtest[my,mx] * ~(mask_my | mask_mx)
現在,為了將相同的技術應用於3dim情況,您需要創建一個“中性”索引數組,以應用於第一個軸。 這是np.indices
有用的地方:
mz = np.indices(IRtest.shape)[0] # take [0] because we need to be neutral w.r.t. axis=0
現在應用花哨的索引:
b = IRtest[mz, my, mx]
要應用蒙版,最簡單的方法是將一個維度添加到蒙版數組中以使其成為3dim,然后讓numpy的廣播發揮其魔力。 (我假設我們在2dim問題中使用相同的掩碼,dtype = bool)。
unified_mask = mask_my | mask_mx
b *= ~unified_mask[np.newaxis,...]
與2dim情況一樣,您可以同時使用花式分配(同樣,軸= 0正在廣播):
b[unified_mask[np.newaxis,...]] = 0.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.