filtrer un tableau numpy ND et ne conserver que des éléments spécifiques
Nov 27 2020
J'ai affaire à un grand tableau numpy ND. Je voudrais conserver uniquement ces éléments présents dans un tableau numpy différent et définir les valeurs restantes sur 0.
par exemple, si nous considérons ce tableau 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]]])
et je veux mettre 0
dans tous les lieux sauf si les valeurs sont 50
, 11
,72
Réponses
1 DanielLenz Nov 27 2020 at 09:31
Je mis en place un masque en combinant reduce
avec np.logical_or
et itéré les valeurs qui doivent rester:
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 vous utilisez uniquement numpy
, cela peut également être fait en utilisant une simple utilisation de la diffusion en convertissant le vals
tableau à un rang supérieur à a
. Ceci est accompli sans utiliser d'itérations ou d'autres fonctionnalités.
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
Production:
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]]])