Filtern Sie ein ND-Numpy-Array und behalten Sie nur bestimmte Elemente bei

Nov 27 2020

Ich habe es mit einem großen ND-Numpy-Array zu tun. Ich möchte nur die Elemente in einem anderen Numpy-Array behalten und die verbleibenden Werte auf 0 setzen.

Zum Beispiel, wenn wir dieses numpy-Array betrachten

array([[[36,  1, 72],
        [76, 50, 23],
        [28, 68, 17],
        [84, 75, 69]],

       [[ 5, 15, 93],
        [92, 92, 88],
        [11, 54, 21],
        [87, 76, 81]]])

und ich möchte setzen 0an allen Orten , außer wo die Werte 50, 11,72

Antworten

1 DanielLenz Nov 27 2020 at 09:31

Ich habe eine Maske nach oben durch die Kombination reducemit np.logical_orund iteriert über die Werte , die bleiben sollen:

import functools
import numpy as np

arr = np.array([[[36,  1, 72],
        [76, 50, 23],
        [28, 68, 17],
        [84, 75, 69]],
       [[ 5, 15, 93],
        [92, 92, 88],
        [11, 54, 21],
        [87, 76, 81]]])

# Set the values that should not
# be set to zero
vals = [11, 50, 72]

# Create a mask by looping over the above values
mask = functools.reduce(np.logical_or, (arr==val for val in vals))

masked = np.where(mask, arr, 0.)

print(masked)
> array([[[ 0.,  0., 72.],
        [ 0., 50.,  0.],
        [ 0.,  0.,  0.],
        [ 0.,  0.,  0.]],

       [[ 0.,  0.,  0.],
        [ 0.,  0.,  0.],
        [11.,  0.,  0.],
        [ 0.,  0.,  0.]]])
2 swag2198 Nov 27 2020 at 09:33

Wenn Sie nur verwenden möchten numpy, können Sie dies auch mithilfe der einfachen Verwendung von Broadcasting tun, indem Sie das valsArray auf einen Rang höher als setzen a. Dies wird ohne Verwendung von Iterationen oder anderen Funktionen erreicht.

import numpy as np

a = np.array([[[36,  1, 72],
         [76, 50, 23],
         [28, 68, 17],
         [84, 75, 69]],
 
        [[ 5, 15, 93],
         [92, 92, 88],
         [11, 54, 21],
         [87, 76, 81]]])

vals = np.array([50, 11, 72])
inds = a == vals[:, None, None, None]
a[~np.any(inds, axis = 0)] = 0
a

Ausgabe:

array([[[ 0,  0, 72],
        [ 0, 50,  0],
        [ 0,  0,  0],
        [ 0,  0,  0]],

       [[ 0,  0,  0],
        [ 0,  0,  0],
        [11,  0,  0],
        [ 0,  0,  0]]])