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!

24
demandé sur Saullo G. P. Castro 2013-06-05 17:12:50

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.

29
répondu mgilson 2013-06-05 13:51:26

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
5
répondu aaren 2013-10-26 00:19:00

Évidemment, il n'y a pas d'opérateur général not pour les ensembles. Vos choix sont:

  1. soustraire votre ensemble indices d'un ensemble universel d'indices (dépend de la forme de a), mais ce sera un peu difficile à implémenter et à lire.
  2. 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).
  3. 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]
    
4
répondu kirelagin 2013-06-05 13:20:19

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
3
répondu Alexey Trofimov 2017-03-12 09:20:08