Numpy - le meilleur moyen de supprimer le dernier élément de 1 dimensions tableau?
Quel est le moyen le plus efficace pour supprimer le dernier élément d'une numpy 1 dimensions tableau? (comme la pop pour la liste)
Voulez-vous un copier du tableau original ou tout simplement un autre point de vue, qui partage les données avec le tableau d'origine, suffit-il?
Je préfère une copie
Je préfère une copie
OriginalL'auteur Meni | 2015-10-04
Vous devez vous connecter pour publier un commentaire.
NumPy tableaux ont une taille fixe, de sorte que vous ne pouvez pas supprimer un élément en place. Par exemple à l'aide de
del
ne fonctionne pas:Noter que l'indice
-1
représente le dernier élément. C'est parce que les indices négatifs en Python (et NumPy) sont comptés à partir de la fin-1
est la dernière,-2
est l'avant-dernier et-len
est en fait le premier élément. C'est juste pour votre information, dans le cas où vous ne saviez pas.Python, les listes sont de taille variable, de sorte qu'il est facile d'ajouter ou de supprimer des éléments.
Donc, si vous voulez supprimer un élément, vous devez créer un nouveau tableau ou de la vue.
Création d'une nouvelle vue
Vous pouvez créer une nouvelle vue contenant tous les éléments sauf le dernier à l'aide de la tranche de notation:
Cependant un point de vue partage les données avec le tableau d'origine, de sorte que si l'une est modifiée de sorte est l'autre:
La création d'un nouveau tableau de
1. Copier l'affichage
Si vous n'aimez pas cette mémoire de partage, vous devez créer un nouveau tableau, dans ce cas, il est probablement plus simple pour créer une vue, puis copier (par exemple à l'aide de la
copier()
méthode de tableaux):2. À l'aide de tableau d'entiers d'indexation [docs]
Cependant, vous pouvez également utiliser le tableau entier de l'indexation pour supprimer le dernier élément et obtenir un nouveau tableau. Ce tableau d'entiers, l'indexation toujours (pas sûr à 100% qu') créer une copie et non un point de vue:
Ce tableau d'entiers de l'indexation peut être utile de supprimer l'arbitraire des éléments d'un tableau (qui peut être difficile, voire impossible, lorsque vous voulez une vue):
Si vous voulez une fonction généralisée qui supprime le dernier élément à l'aide de tableau d'entiers indexation:
3. À l'aide de booléen tableau d'indexation [docs]
Il est également boolean d'indexation qui pourrait être utilisé, par exemple:
Cela crée aussi une copie! Et une approche généralisée pourrait ressembler à ceci:
Si vous souhaitez plus d'informations sur NumPys l'indexation de la documentation sur l ' "Indexation" est très bonne et couvre un grand nombre de cas.
4. À l'aide de
np.delete()
Normalement, je ne recommanderais pas les fonctions de NumPy qui "semblent" comme ils sont en train de modifier le tableau en place (comme
np.append
etnp.insert
) mais faire remettre des copies, car ceux-ci sont généralement inutilement lent et trompeuse. Vous devriez les éviter autant que possible, c'est pourquoi il est le dernier point de ma réponse. Toutefois, dans ce cas, il est en fait un ajustement parfait donc je dois le mentionner:5.) À l'aide de
np.resize()
NumPy a une autre méthode qui sonne comme il le fait d'une opération, mais c'est vraiment renvoie un nouveau tableau:
Pour supprimer le dernier élément que j'ai simplement donné une nouvelle forme qui est 1 plus petit qu'avant, ce qui, de fait, supprime le dernier élément.
La modification de la matrice en place
Oui, je l'ai déjà écrit précédemment que vous ne pouvez pas modifier un tableau en place. Mais je disais ça parce que dans la plupart des cas, il n'est pas possible ou seulement en désactivant certains (tout à fait utiles) les contrôles de sécurité. Je ne suis pas sûr que sur le fonctionnement interne, mais en fonction de la taille ancienne et de la nouvelle taille, il pourrait être possible que cela comprend un (interne uniquement) opération de copie, de sorte qu'il pourrait être plus lente que la création d'une vue.
À l'aide de
np.ndarray.resize()
Si le tableau ne partage pas sa mémoire avec un autre tableau, alors il est possible de redimensionner le tableau en place:
Cependant, que va jeter
ValueError
s dans le cas où c'est effectivement référencé par un autre tableau:Vous pouvez désactiver cette sécurité-vérification par la mise en
refcheck=False
mais cela ne doit pas être fait à la légère, car vous rendre vulnérable pour la segmentation des défauts et de corruption de la mémoire dans le cas où l'autre tente d'accéder à un les éléments supprimés! Cerefcheck
argument doit être considéré comme un expert seule option!Résumé
Création d'une vue est vraiment très rapide et ne prend pas beaucoup de mémoire supplémentaire, donc chaque fois que possible, vous devriez essayer de travailler autant avec des points de vue que possible. Toutefois, selon les cas d'utilisation, il n'est pas si facile à enlever arbitraire des éléments de l'aide de la base de découpage. Alors qu'il est facile de supprimer les n premiers éléments et/ou n derniers éléments ou de supprimer tout élément x (l'étape argument pour le tranchage) c'est tout ce que vous pouvez faire avec elle.
Mais dans votre cas de suppression du dernier élément d'un tableau à une dimension, je recommanderais:
parce que ces la plupart d'exprimer clairement l'intention et tout le monde avec Python/NumPy expérience reconnaître que.
Timings
Basé sur le timing cadre de cette réponse:
J'ai le minutage comme graphe log-log pour couvrir tous les détails, moins de temps encore le moyen le plus rapide, mais l'intervalle entre deux graduations représente un ordre de grandeur au lieu d'un montant fixe. Dans le cas où vous êtes intéressé par les valeurs spécifiques, j'ai copié dans cette gist:
Selon la ces horaires ces deux approches sont aussi le plus rapide. (Python 3.6 et NumPy 1.14.0)
Je sais pas rapidement (si tu veux de la vitesse avec l'efficacité de l').
Il y a le
resize
méthode avecrefcheck=False
, mais il est une chose dangereuse à utiliser que si vous êtes très sûr il n'y a pas d'autres points de vue pour les anciennes données.OriginalL'auteur MSeifert
Pour supprimer le dernier élément d'une 1-dimensions tableau NumPy, utilisez le numpy.supprimer méthode, comme suit:
Sortie:
[1 2 3 4]
La dernière valeur du tableau NumPy, qui a été 5, est maintenant supprimé.
OriginalL'auteur David M. Helmuth