2014-11-24 33 views
6

我想擴展一個我已經在Stackoverflow上討論過的問題。它正在處理二維numpy數組,我想對三維數組做同樣的處理。移動3D陣列的數值知道帶掩模的新座標

我想將一個2D數組的元素「移動」到存儲在另外兩個數組中的新座標。我期待自動化,因爲實際上我的數組很大(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]]]) 
+0

我可能誤解了一些東西,但爲什麼是第一列不填充在預期結果中使用'0'? – 2014-12-27 15:28:28

+0

這是一個錯誤,我改變座標和值,我把我的帖子作爲二維情況相同! ;) – user3601754 2014-12-28 08:56:29

回答

4

你的地圖矩陣錯了,得到你想要的結果,他們需要這樣的(因爲,當你把值在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.]]]) 

而且在你的循環,這將是更好在第一個和第二個廁所中切換尺寸PS,使他們成爲

for i in range(IRtest.shape[2]): 
    for j in range(IRtest.shape[1]): 
     for k in range(IRtest.shape[0]): 

這不要緊,你給在這裏,因爲矩陣是正方形的情況下,但你提到的矩陣不是方形的,真正的問題,使其成爲有一個問題。

1

總結the answer to your previous question有關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情況下,可以alrenatively使用花式分配(再次,軸= 0是正在播出):

b[unified_mask[np.newaxis,...]] = 0.