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.
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])
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])
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.
Pour supprimer par valeur:
modified_array = np.delete(original_array, np.where(original_array == value_to_delete))
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)]
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]])