web-dev-qa-db-fra.com

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

Comment puis-je supprimer des éléments spécifiques d'un tableau numpy? Dis 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. Tout ce que je sais, c'est l'index des valeurs (index=[2,3,6]).

Utilisez numpy.delete () - renvoie un tableau new avec des sous-tableaux le long d'un axe supprimé

numpy.delete(a, index)

Pour votre question spécifique:

import numpy as np

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

new_a = np.delete(a, index)

print(new_a) #Prints `[1, 2, 5, 6, 8, 9]`

Notez que numpy.delete() renvoie un nouveau tableau puisque scalaires de tableau sont immuables, similaires aux chaînes en Python. Ainsi, chaque fois qu'une modification est apportée, un nouvel objet est créé. C'est-à-dire, pour citer le delete()docs :

"Une copie de arr avec les éléments spécifiés par obj supprimés. Notez que Delete ne se produit pas in-place ..."

Si le code que je poste a une sortie, c'est le résultat de l'exécution du code.

200
Levon

Il existe une fonction intégrée numpy pour vous aider.

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

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

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

N'étant pas une personne numpy, j'ai pris une photo avec:

>>> import numpy as np
>>> import itertools
>>> 
>>> a = np.array([1,2,3,4,5,6,7,8,9])
>>> index=[2,3,6]
>>> a = np.array(list(itertools.compress(a, [i not in index for i in range(len(a))])))
>>> a
array([1, 2, 5, 6, 8, 9])

D'après mes tests, cette performance est supérieure à numpy.delete(). Je ne sais pas pourquoi ce serait le cas, peut-être en raison de la petite taille du tableau initial?

python -m timeit -s "import numpy as np" -s "import itertools" -s "a = np.array([1,2,3,4,5,6,7,8,9])" -s "index=[2,3,6]" "a = np.array(list(itertools.compress(a, [i not in index for i in range(len(a))])))"
100000 loops, best of 3: 12.9 usec per loop

python -m timeit -s "import numpy as np" -s "a = np.array([1,2,3,4,5,6,7,8,9])" -s "index=[2,3,6]" "np.delete(a, index)"
10000 loops, best of 3: 108 usec per loop

C'est une différence assez importante (dans le sens opposé à ce que j'attendais), quelqu'un a-t-il une idée de la raison pour laquelle ce serait le cas?

Plus étrange encore, passer numpy.delete() une liste est pire que de parcourir la liste en boucle et de lui donner des index simples.

python -m timeit -s "import numpy as np" -s "a = np.array([1,2,3,4,5,6,7,8,9])" -s "index=[2,3,6]" "for i in index:" "    np.delete(a, i)"
10000 loops, best of 3: 33.8 usec per loop

Edit: Cela semble être lié à la taille du tableau. numpy.delete() est nettement plus rapide avec les tableaux de grande taille.

python -m timeit -s "import numpy as np" -s "import itertools" -s "a = np.array(list(range(10000)))" -s "index=[i for i in range(10000) if i % 2 == 0]" "a = np.array(list(itertools.compress(a, [i not in index for i in range(len(a))])))"
10 loops, best of 3: 200 msec per loop

python -m timeit -s "import numpy as np" -s "a = np.array(list(range(10000)))" -s "index=[i for i in range(10000) if i % 2 == 0]" "np.delete(a, index)"
1000 loops, best of 3: 1.68 msec per loop

Évidemment, tout cela n’a rien à voir avec la clarté et évitant de réinventer la roue, mais j’ai trouvé cela un peu intéressant, j’ai donc pensé que je le laisserais ici.

6
Gareth Latty

Pour supprimer par valeur:

modified_array = np.delete(original_array, np.where(original_array == value_to_delete))
3
Prakhar Pandey

Si vous ne connaissez pas l'index, vous ne pouvez pas utiliser logical_and

x = 10*np.random.randn(1,100)
low = 5
high = 27
x[0,np.logical_and(x[0,:]>low,x[0,:]<high)]
0
idnavid

Supprimer un index spécifique (j'ai supprimé 16 et 21 de la matrice)

import numpy as np
mat = np.arange(12,26)
a = [4,9]
del_map = np.delete(mat, a)
del_map.reshape(3,4)

Sortie:

array([[12, 13, 14, 15],
      [17, 18, 19, 20],
      [22, 23, 24, 25]])
0
Raja Ahsan Zeb