filtrar una matriz ND numpy y mantener solo elementos específicos

Nov 27 2020

Estoy tratando con una gran matriz de números ND. Me gustaría mantener solo esos elementos presentes en una matriz numérica diferente y establecer los valores restantes en 0.

por ejemplo, si consideramos esta matriz numpy

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

y quiero fijar 0en todos los lugares excepto cuando los valores son 50, 11,72

Respuestas

1 DanielLenz Nov 27 2020 at 09:31

He creado una máscara mediante la combinación reducecon np.logical_ory repiten a lo largo de los valores que deben permanecer:

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

Si va a usar solo numpy, esto también se puede hacer usando el uso simple de la transmisión al convertir la valsmatriz a solo un rango superior a a. Esto se logra sin utilizar iteraciones u otras funcionalidades.

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

Salida:

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