Tableau NumPy, modifier les valeurs qui ne sont pas dans une liste d'indices
J'ai un tableau numpy
comme:
a = np.arange(30)
Je sais que je peux remplacer les valeurs situées aux positions indices=[2,3,4]
en utilisant par exemple l'indexation de fantaisie:
a[indices] = 999
Mais comment remplacer les valeurs aux positions qui ne sont pas dans indices
? Serait quelque chose comme ci-dessous?
a[ not in indices ] = 888
Merci!
4 réponses
Je ne connais pas de moyen propre de faire quelque chose comme ceci:
mask = np.ones(a.shape,dtype=bool) #np.ones_like(a,dtype=bool)
mask[indices] = False
a[~mask] = 999
a[mask] = 888
Bien sûr, si vous préférez utiliser numpy type de données, vous pouvez utiliser dtype=np.bool_
-- Il n'y aura aucune différence dans la sortie. c'est juste une question de préférence vraiment.
Ne fonctionne que pour les tableaux 1d:
a = np.arange(30)
indices = [2, 3, 4]
ia = np.indices(a.shape)
not_indices = np.setxor1d(ia, indices)
a[not_indices] = 888
Évidemment, il n'y a pas d'opérateur général not
pour les ensembles. Vos choix sont:
- soustraire votre ensemble
indices
d'un ensemble universel d'indices (dépend de la forme dea
), mais ce sera un peu difficile à implémenter et à lire. - une sorte d'itération (probablement la
for
-loop est votre meilleur pari puisque vous voulez certainement utiliser le fait que vos indices sont triés). -
Créer un nouveau tableau rempli de nouvelle valeur, et copier sélectivement des indices de l'ancien un.
b = np.repeat(888, a.shape) b[indices] = a[indices]
Juste surmonter situation similaire, résolu de cette façon:
a = np.arange(30)
indices=[2,3,4]
a[indices] = 999
not_in_indices = [x for x in range(len(a)) if x not in indices]
a[not_in_indices] = 888