278 votes

Comment supprimer des éléments spécifiques dans un tableau numpy

Comment puis-je supprimer certains éléments spécifiques d'un tableau numpy ? Disons que j'ai

import numpy as np

a = np.array([1,2,3,4,5,6,7,8,9])

Je veux ensuite supprimer 3,4,7 de a . Je ne connais que l'indice des valeurs ( index=[2,3,6] ).

369voto

Levon Points 34085

Utilisez numpy.delete() - renvoie un nouveau réseau avec des sous-réseaux le long d'un axe supprimé

numpy.delete(a, index)

Pour votre question spécifique :

import numpy as np
a
array([1, 2, 3, 4, 5, 6, 7, 8, 9])

index
[2, 3, 6]

new_a = np.delete(a, index)

new_a
array([1, 2, 5, 6, 8, 9])

Notez que numpy.delete() renvoie un nouveau tableau depuis scalaires des tableaux sont immuables, comme les chaînes de caractères en Python, de sorte que chaque fois qu'une modification y est apportée, un nouvel objet est créé. C'est-à-dire que, pour citer le delete() docs :

"A copie de arr avec les éléments spécifiés par obj supprimés. Notez que la suppression ne se fait pas sur place ..."

1 votes

@IngviGautsson Quand vous avez fait votre modification, vous avez aussi changé les valeurs correctes pour les éléments de 2, 3, 6 à 3, 4, 7, si vous exécutez le code maintenant vous n'obtenez pas la sortie correcte comme c'était le cas à l'origine.

1 votes

AttributeError : L'objet 'list' ne possède pas d'attribut 'delete'.

3 votes

@IngviGautsson Non, votre commentaire est trompeur. Cela fonctionne comme prévu. Cependant, la documentation de numpy.delete() indique que "souvent, il est préférable d'utiliser un masque booléen" ; un exemple de cela est également donné.

92voto

Zong Points 1009

Il y a une fonction intégrée à numpy pour aider à cela.

import numpy as np
>>> a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> b = np.array([3,4,7])
>>> c = np.setdiff1d(a,b)
>>> c
array([1, 2, 5, 6, 8, 9])

9 votes

Bon à savoir. Je pensais que np.delete serait plus lent mais hélas, timeit pour 1000 entiers dit que delete est x2 plus rapide.

3 votes

C'est génial parce que cela fonctionne sur le tableau de valeurs plutôt que de devoir fournir le ou les indices que vous souhaitez supprimer. Par exemple : np.setdiff1d(np.array(['one','two']),np.array(['two', 'three']))

0 votes

Cela trie également la sortie, ce qui peut ne pas être ce que l'on souhaite. Sinon, c'est très bien.

43voto

Digitalex Points 450

Un tableau Numpy est immuable ce qui signifie que vous ne pouvez techniquement pas supprimer un élément de cette liste. Cependant, vous pouvez construire un nouveau sans les valeurs que vous ne voulez pas, comme ceci :

b = np.delete(a, [2,3,6])

2 votes

+1 pour la mention "immuable". Il est bon de rappeler que les tableaux numpy ne sont pas adaptés aux changements rapides de taille (ajout/suppression d'éléments).

47 votes

techniquement, les tableaux numpy sont mutables. Par exemple, ceci : a[0]=1 modifie a en place. Mais ils ne peuvent pas être redimensionnés.

4 votes

La définition dit qu'il est immuable, mais si en assignant une nouvelle valeur il vous laisse modifier, alors comment est-il immuable ?

31voto

Prakhar Pandey Points 71

Pour supprimer par valeur :

modified_array = np.delete(original_array, np.where(original_array == value_to_delete))

1 votes

La question porte sur suppression d'éléments par index ne pas supprimer les articles ayant une valeur spécifique

8voto

AndyK Points 1677

Utilisation de np.delete est le moyen le plus rapide de le faire, si l'on connaît les indices des éléments que l'on veut supprimer. Cependant, pour être complet, laissez-moi ajouter une autre façon de "supprimer" les éléments d'un tableau en utilisant un masque booléen créé à l'aide de la fonction np.isin . Cette méthode nous permet de supprimer les éléments en les spécifiant directement ou par leurs indices :

import numpy as np
a = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])

Suppression par indices :

indices_to_remove = [2, 3, 6]
a = a[~np.isin(np.arange(a.size), indices_to_remove)]

Suppression par éléments (n'oubliez pas de recréer l'original a puisqu'il a été réécrit dans la ligne précédente) :

elements_to_remove = a[indices_to_remove]  # [3, 4, 7]
a = a[~np.isin(a, elements_to_remove)]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X