2014-11-24 30 views
6

Chciałbym rozszerzyć problem, który już omówiłem na Stackoverflow. Zajmowałem się tablicami 2D numpy i chciałbym zrobić to samo z trójwymiarową tablicą.przesuń wartości tablicy 3D znając nowe współrzędne z maską

Chciałbym "przenieść" elementy tablicy 2D do nowych współrzędnych, które są przechowywane w 2 innych tablicach. Zamierzam to zautomatyzować, ponieważ w rzeczywistości moje tablice są duże (400x200x100). Niektóre wartości nie znajdą jego współrzędnych i nie będą używane, Niektóre z tych współrzędnych są zamaskowane, co wskazałem w poniższym przykładzie za pomocą wartości 0. Jeśli współrzędne są zamaskowane, elementy w tablicy, które chcę przetasować, nie będą być użytym.

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]]]) 

Więc tablica spodziewać wygląda następująco:

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]]]) 

próbuję z częścią kodu Mam z mojego ostatniego postu.

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 

Ale ISN wynik t samo ja się spodziewać:

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

pewnie rozumieją coś, ale dlaczego to pierwsza kolumna nadzieniem z '0' w oczekiwanym wyniku? –

+0

to był błąd, zmieniłem współrzędne i wartości, wziąłem to samo co mój post dla przypadku 2D! ;) – user3601754

Odpowiedz

4

mapy matryce są złe, aby uzyskać wynik, który chcesz muszą być takie jak (ponieważ, kiedy można umieścić wartości do b, podczas sprawdzania, czy m [k, j, i]! = -1 i chcesz ostatnie kolumny do 0, nie pierwszy z nich)

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.]]]) 

również w swoich pętli, byłoby lepiej aby zmienić wymiary w pierwszym i drugim loo ps tak stają

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

To nie ma znaczenia dla sprawy dajesz tu od macierze są kwadratowe, ale prawdziwym problemem można wymienić matryce nie są kwadratowe więc staje się tam problemem.

1

Podsumowując the answer to your previous question dotyczące 2dim, można po prostu użyć fantazyjne indeksowanie jak (po ustalające dtypes swoich tablicach, oczywiście):

b = IRtest[my,mx] * ~(mask_my | mask_mx) 

Teraz, aby zastosować tę samą technikę do przypadku 3dim, musisz utworzyć "neutralną" tablicę indeksów, aby zastosować ją do pierwszej osi. To gdzie np.indices pochodzi przydatne:

mz = np.indices(IRtest.shape)[0] # take [0] because we need to be neutral w.r.t. axis=0 

Teraz stosuje wyszukane indeksowania:

b = IRtest[mz, my, mx] 

Aby zastosować maskę, to najłatwiej dodać wymiar tablicy maski w celu uczynienia go 3dim , następnie niech transmisja numpy zrobi swoją magię. (Zakładam, że używamy tych samych masek z pytania 2dim, z dtype = bool).

unified_mask = mask_my | mask_mx 
b *= ~unified_mask[np.newaxis,...] 

jak w 2dim przypadku można alrenatively używać fantazyjne zadanie (znowu, oś = 0 jest nadawanego):

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