これはPythonの非表示の機能で発生しました が、機能の動作を説明する適切なドキュメントや例が表示されません。
これはPythonの非表示の機能で発生しました が、機能の動作を説明する適切なドキュメントや例が表示されません。
回答:
Ellipsis
、または...
隠し機能ではありません。それは単なる定数です。言語構文の一部であるjavascript ES6などとはかなり異なります。組み込みのクラスやPython言語の構築ではこれを利用していません。
そのため、その構文は、それを理解するためのコードを書いたかどうかに依存します。
ドキュメントに記載されているように、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のドキュメントと言語リファレンスがあります。しかし、それらはあまり役に立ちません。
省略記号は、高次元のデータ構造をスライスするためにnumpyで使用されます。
これは、この時点で、:
多次元スライスをすべての次元に拡張するために完全なスライス()を挿入することを意味するように設計されています。
例:
>>> 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])
独自の実装では、上記のコントラクトを無視して自由に使用できます。
a[:,:,:,0]
はコピーを返し、コピーでa[...,0]
はなく「ビュー」を返すでしょうか?私はid()
両方のバージョンと3次元配列に対して実行してみました: a[:,:,:, 0], a[:,:,:, 1], a[:,:,:, 2]
すべてが異なるIDをa[..., 0], a[..., 1], a[..., 2]
持っているのに対し、:すべてが同じIDを持っています。
id()
両方に対して同じ値を返します。また、で確認すると__array_interface__['data']
、同じメモリアドレスが表示されます。
a[indexes, ...]
aが1次元配列でも使用できることがわかりました!
これは、Ellipsisのもう1つの使用法であり、スライスとは関係ありません。キューとのスレッド内通信で、「完了」を示すマークとしてよく使用します。それはそこにあり、オブジェクトであり、シングルトンであり、その名前は「不足」を意味し、過度に使用されたNoneではありません(通常のデータフローの一部としてキューに入れられる可能性があります)。YMMV。
他の回答で述べたように、スライスの作成に使用できます。多くの完全なスライス表記(:
)を記述したくない場合、または操作される配列の次元数がわからない場合に役立ちます。
私が強調することが重要だと思ったのは、他の答えでは見当たらないことですが、埋める必要のある次元がなくなった場合でも使用できるということです。
例:
>>> 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])