Próbuję wekslować progu na plasterku w tablicy 3D. Niestety, próg jest stosowany do wszystkich 3 wartości w wymiarze. Jedynym sposobem, w jaki mogę wymyślić, jest wyodrębnienie plasterka 1, proces, który następnie umieścił go do tablicy, ale jestem pewien, że jest lepszy sposób. Oto jakiś kod, aby wyjaśnić, co robię i co próbuję zrobić. Dziękuję bardzo za każdą pomoc. jot

import numpy as np
arr = np.arange(18).reshape(3, 2, 3)
arr[ arr[:,:,1] < 10 ] = 0

Daje:

array([[[ 0,  0,  0],
        [ 0,  0,  0]],

       [[ 0,  0,  0],
        [ 9, 10, 11]],

       [[12, 13, 14],
        [15, 16, 17]]])

Mam nadzieję:

array([[[ 0,  0,  2],
        [ 3,  0,  5]],

       [[ 6,  0,  8],
        [ 9, 10, 11]],

       [[12, 13, 14],
        [15, 16, 17]]])
1
Johned 26 luty 2019, 20:53

2 odpowiedzi

Najlepsza odpowiedź

To powinno działać:

arr[:, :, 1][arr[:, :, 1] < 10] = 0

Spowoduje to utworzenie maski boolowskiej dla drugiego elementu wymiaru 3 z arr z: arr[:, :, 1] < 10. Ta maska boolowska jest następnie używana do indeksowania ich specyficznej tablicy.

Ładna funkcja, aby dokonać wyboru ostatniego wymiaru bardziej czytelny, jest elipsis .... Będzie pokroić wszystkie osie przed jawną indeksowaną osią.

print(arr[..., 1])
# Out: array([[ 1,  4],
              [ 7, 10],
              [13, 16]])

W takim przypadku możesz na przykład użyć go tak:

slc = (..., 1)
arr[slc][arr[slc] < 10] = 0
4
Scotty1- 26 luty 2019, 18:18

Możemy po prostu użyć maski porównania do indeksu wzdłuż pierwszych dwóch osi i używać krojenia na ostatniej osi, dając nam kompaktowy sposób jak tak -

arr[arr[:,:,1]<10, 1] = 0

Przykładowy przebieg -

In [47]: arr = np.arange(18).reshape(3, 2, 3)

In [48]: arr[arr[:,:,1] <10,1] = 0

In [49]: arr
Out[49]: 
array([[[ 0,  0,  2],
        [ 3,  0,  5]],

       [[ 6,  0,  8],
        [ 9, 10, 11]],

       [[12, 13, 14],
        [15, 16, 17]]])
4
Divakar 26 luty 2019, 18:19