web-dev-qa-db-fra.com

Comment utilisez-vous la syntaxe de découpage Ellipsis en Python?

Cela est apparu dans Fonctionnalités cachées de Python , mais je ne vois pas de bonne documentation ou d'exemples qui expliquent comment la fonctionnalité fonctionne.

143
miracle2k

Vous l'utiliseriez dans votre propre classe, car aucune classe intégrée ne l'utilise.

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 documentation python , et référence du langage . Mais ce n'est pas très utile.

95
nosklo

L'ellipse est utilisée pour découper des structures de données de dimension supérieure.

Il est conçu pour signifier à ce stade, insérez 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 4e dimension, vous pouvez utiliser la notation Ellipsis

>>> 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 comme bon vous semble.

214
Torsten Marek

C'est une autre utilisation d'Ellipsis, qui n'a rien à voir avec les tranches: je l'utilise souvent en communication intra-thread avec des files d'attente, comme une marque qui signale "Terminé"; il est là, c'est un objet, c'est un singleton, et son nom signifie "manque de", et ce n'est pas le sur-utilisé None (qui pourrait être mis dans une file d'attente dans le cadre d'un flux de données normal). YMMV.

70
tzot

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])
3
Mauricio Perez