Utilisez numpy.delete () - retourne un nouveau tableau 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()
retourne un nouveau tableau puisque les scalaires du tableau sont immuables, similaires aux chaînes en Python, donc chaque fois qu'un changement lui est apporté, un nouvel objet est créé. C'est-à-dire, pour citer les delete()
documents :
"Une copie de arr avec les éléments spécifiés par obj supprimés. Notez que la suppression ne se produit pas sur place ..."
Si le code que je poste a une sortie, c'est le résultat de l'exécution du code.
Il y a une fonction intégrée numpy pour vous aider.
la source
np.setdiff1d(np.array(['one','two']),np.array(['two', 'three']))
Un tableau Numpy est immuable , ce qui signifie que vous ne pouvez techniquement pas en supprimer un élément. Cependant, vous pouvez construire un nouveau tableau sans les valeurs que vous ne voulez pas, comme ceci:
la source
a[0]=1
modifiea
sur place. Mais ils ne peuvent pas être redimensionnés.Pour supprimer par valeur:
la source
N'étant pas une personne engourdie, j'ai pris une photo avec:
Selon mes tests, cela surpasse
numpy.delete()
. Je ne sais pas pourquoi ce serait le cas, peut-être en raison de la petite taille du tableau initial?C'est une différence assez importante (dans la direction opposée à ce que j'attendais), n'importe qui a une idée pourquoi ce serait le cas?
Encore plus étrange, passer
numpy.delete()
une liste est moins efficace que de parcourir la liste et de lui donner des indices uniques.Edit: Cela semble être lié à la taille du tableau. Avec de grands tableaux,
numpy.delete()
est beaucoup plus rapide.Évidemment, tout cela n'est pas pertinent, car vous devriez toujours aller pour plus de clarté et éviter de réinventer la roue, mais je l'ai trouvée un peu intéressante, alors j'ai pensé que je la laisserais ici.
la source
a = delte_stuff(a)
dans votre première itération, ce quia
diminue à chaque itération. Lorsque vous utilisez la fonction inbuild, vous ne stockez pas la valeur dans un, qui conserve un dans la taille d'origine! En plus de cela, vous pouvez accélérer considérablement votre fonction lorsque vous créez un ensemble ouf deindex
et vérifiez par rapport à cela, si vous souhaitez supprimer un élément. En corrigeant les deux choses, j'obtiens pour 10 000 éléments: 6,22 ms par boucle avec votre fonction, 4,48 ms pournumpy.delete
, ce qui est à peu près ce à quoi vous vous attendez.np.array(list(range(x)))
utilisernp.arange(x)
, et pour créer l'index, vous pouvez utilisernp.s_[::2]
.Si vous ne connaissez pas l'index, vous ne pouvez pas utiliser
logical_and
la source
L'utilisation
np.delete
est le moyen le plus rapide de le faire, si nous connaissons les indices des éléments que nous voulons supprimer. Cependant, pour être complet, permettez-moi d'ajouter une autre façon de "supprimer" les éléments du tableau à l'aide d'un masque booléen créé à l'aide denp.isin
. Cette méthode nous permet de supprimer les éléments en les spécifiant directement ou par leurs indices:Supprimer par indices :
Supprimer par éléments (n'oubliez pas de recréer l'original
a
car il a été réécrit sur la ligne précédente):la source
Supprimer un index spécifique (j'ai supprimé 16 et 21 de la matrice)
Production:
la source
Vous pouvez également utiliser des ensembles:
la source