filtrar uma matriz numpy ND e manter apenas elementos específicos

Nov 27 2020

Estou lidando com uma grande matriz numpy ND. Gostaria de manter apenas os elementos presentes em uma matriz numpy diferente e definir os valores restantes para 0.

por exemplo, se considerarmos 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]]])

e eu quero definir 0em todos os lugares, exceto onde os valores são 50, 11,72

Respostas

1 DanielLenz Nov 27 2020 at 09:31

Criei uma máscara combinando reducecom np.logical_ore iterado sobre os valores que devem 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

Se você numpypretende usar apenas , isso também pode ser feito usando o uso simples de transmissão, lançando o valsarray para apenas uma classificação acima de a. Isso é realizado sem o uso de iterações ou outras 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

Resultado:

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