web-dev-qa-db-ja.com

PythonでEllipsisスライス構文をどのように使用しますか?

これは Pythonの非表示機能 で登場しましたが、機能の仕組みを説明する優れたドキュメントや例は見当たりません。

143
miracle2k

組み込みクラスはそれを使用しないため、独自のクラスで使用します。

ドキュメント で述べられているように、Numpyはこれを使用します。いくつかの例 ここ

独自のクラスでは、次のように使用します。

>>> 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

もちろん、 python documentationlanguage reference があります。しかし、それらはあまり役に立ちません。

95
nosklo

省略記号は、高次元のデータ構造をスライスするために使用されます。

この時点でを意味するように設計されており、完全なスライス(:)多次元スライスをすべての次元に拡張する

>>> from numpy import arange
>>> a = arange(16).reshape(2,2,2,2)

これで、次数2x2x2x2の4次元マトリックスができました。 4次元の最初の要素をすべて選択するには、省略記号表記を使用できます

>>> a[..., 0].flatten()
array([ 0,  2,  4,  6,  8, 10, 12, 14])

これは

>>> a[:,:,:,0].flatten()
array([ 0,  2,  4,  6,  8, 10, 12, 14])

独自の実装では、上記の契約を自由に無視して、適切と思われるものに使用できます。

214
Torsten Marek

これは、スライスとは関係のないEllipsisのもう1つの使用法です。「完了」を示すマークとして、キューとのスレッド内通信でよく使用します。そこにあり、オブジェクトであり、シングルトンであり、その名前は「欠如」を意味し、使い古されたNoneではありません(通常のデータフローの一部としてキューに入れることができます)。 YMMV。

70
tzot

他の回答で述べたように、スライスの作成に使用できます。多くのフルスライス表記を書きたくない場合に便利です(:)、または操作されている配列の次元性が不明な場合。

私が強調することが重要だと思ったのは、それが他の答えに欠けていたということです。それは、満たすべき次元がもうないときでも使えるということです。

例:

>>> from numpy import arange
>>> a = arange(4).reshape(2,2)

これはエラーになります:

>>> a[:,0,:]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: too many indices for array

これは動作します:

a[...,0,:]
array([0, 1])
3
Mauricio Perez