Cela est apparu dans les fonctionnalités cachées de Python , mais je ne vois pas de bonne documentation ou d'exemples expliquant le fonctionnement de la fonctionnalité.
Cela est apparu dans les fonctionnalités cachées de Python , mais je ne vois pas de bonne documentation ou d'exemples expliquant le fonctionnement de la fonctionnalité.
Réponses:
Ellipsis
, ou ...
n'est pas une fonctionnalité cachée, c'est juste une constante. C'est assez différent de, disons, javascript ES6 où il fait partie de la syntaxe du langage. Aucune classe intégrée ou structure de langage Python ne l'utilise.
La syntaxe dépend donc entièrement de vous, ou de quelqu'un d'autre, ayant écrit du code pour le comprendre.
Numpy l'utilise, comme indiqué dans la documentation . Quelques exemples ici .
Dans votre propre classe, vous l'utiliseriez comme ceci:
>>> class TestEllipsis(object):
... def __getitem__(self, item):
... if item is Ellipsis:
... return "Returning all items"
... else:
... return "return %r items" % item
...
>>> x = TestEllipsis()
>>> print x[2]
return 2 items
>>> print x[...]
Returning all items
Bien sûr, il y a la documentation python et la référence du langage . Mais ceux-ci ne sont pas très utiles.
Les points de suspension sont utilisés dans numpy pour découper des structures de données de plus grande dimension.
Il est conçu pour signifier à ce stade, insérer autant de tranches complètes ( :
) pour étendre la tranche multidimensionnelle à toutes les dimensions .
Exemple :
>>> from numpy import arange
>>> a = arange(16).reshape(2,2,2,2)
Maintenant, vous avez une matrice à 4 dimensions d'ordre 2x2x2x2. Pour sélectionner tous les premiers éléments de la 4ème dimension, vous pouvez utiliser la notation points de suspension
>>> a[..., 0].flatten()
array([ 0, 2, 4, 6, 8, 10, 12, 14])
ce qui équivaut à
>>> a[:,:,:,0].flatten()
array([ 0, 2, 4, 6, 8, 10, 12, 14])
Dans vos propres implémentations, vous êtes libre d'ignorer le contrat mentionné ci-dessus et de l'utiliser à votre guise.
a[:,:,:,0]
renverra une copie et a[...,0]
renverra la "vue" et non la copie? J'ai essayé de courir id()
contre les deux versions et pour un tableau à 3 dimensions: a[:,:,:, 0], a[:,:,:, 1], a[:,:,:, 2]
tous ont des identifiants différents alors que: a[..., 0], a[..., 1], a[..., 2]
tous ont les mêmes identifiants.
id()
renvoie la même valeur pour les deux. Vérifier également avec __array_interface__['data']
montre la même adresse mémoire.
a[indexes, ...]
un tableau à 1 dimension!
C'est une autre utilisation d'Ellipsis, qui n'a rien à voir avec les tranches: je l'utilise souvent dans la communication intra-thread avec les files d'attente, comme une marque qui signale "Terminé"; c'est là, c'est un objet, c'est un singleton, et son nom signifie «manque de», et ce n'est pas le None surutilisé (qui pourrait être mis dans une file d'attente dans le cadre d'un flux de données normal). YMMV.
Comme indiqué dans d'autres réponses, il peut être utilisé pour créer des tranches. Utile lorsque vous ne souhaitez pas écrire de nombreuses notations de tranches complètes ( :
), ou lorsque vous n'êtes pas sûr de la dimensionnalité du tableau manipulé.
Ce que je pensais important de souligner, et qui manquait dans les autres réponses, c'est qu'il peut être utilisé même lorsqu'il n'y a plus de dimensions à remplir.
Exemple:
>>> from numpy import arange
>>> a = arange(4).reshape(2,2)
Cela entraînera une erreur:
>>> a[:,0,:]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: too many indices for array
Cela fonctionnera:
a[...,0,:]
array([0, 1])