たまたま、の配列がnumpy
空のタプルによってインデックス付けされている可能性があることを発見しました。
In [62]: a = arange(5)
In [63]: a[()]
Out[63]: array([0, 1, 2, 3, 4])
numpy wikiZeroRankArrayでいくつかのドキュメントを見つけました:
(サーシャ)まず、x[...]とx[()]の選択は同じである必要があります。これは、...が「必要な数:必要な数」の構文糖衣であり、ゼロの場合は同じであるためです。ランクは...=(:、)* 0 =()につながります。次に、ランクゼロの配列とnumpyスカラータイプはnumpy内で交換可能ですが、ndarrayが使用できない一部のPythonコンストラクトではnumpyスカラーを使用できます。
したがって、0-d配列の場合a[()]
、a[...]
は同等であると想定されます。高次元配列用でもありますか?それらは強く次のように見えます:
In [65]: a = arange(25).reshape(5, 5)
In [66]: a[()] is a[...]
Out[66]: False
In [67]: (a[()] == a[...]).all()
Out[67]: True
In [68]: a = arange(3**7).reshape((3,)*7)
In [69]: (a[()] == a[...]).all()
Out[69]: True
しかし、それは糖衣構文ではありません。高次元配列ではなく、0次元配列でもありません。
In [76]: a[()] is a
Out[76]: False
In [77]: a[...] is a
Out[77]: True
In [79]: b = array(0)
In [80]: b[()] is b
Out[80]: False
In [81]: b[...] is b
Out[81]: True
そして、空のリストによるインデックス作成の場合があります。これは、まったく別のことを行いますが、空のリストを使用したインデックス作成と同等のように見えますndarray
。
In [78]: a[[]]
Out[78]: array([], shape=(0, 3, 3, 3, 3, 3, 3), dtype=int64)
In [86]: a[arange(0)]
Out[86]: array([], shape=(0, 3, 3, 3, 3, 3, 3), dtype=int64)
In [82]: b[[]]
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
IndexError: 0-d arrays can't be indexed.
したがって、()
と...
は類似しているように見えますが、完全に同一ではなく、インデックスを付ける[]
ことはまったく別のことを意味します。そしてa[]
、b[]
またははSyntaxError
sです。リストを使用したインデックス作成はインデックス配列で文書化されており、同じドキュメントの最後にタプルを使用したインデックス作成に関する短い通知があります。
それは疑問を残します:
a[()]
との違いはa[...]
設計によるものですか?では、デザインは何ですか?
(どういうわけか、空の `()`はMatlabマトリックスで何をするのかを思い出させる質問ですか?)
編集:
実際、スカラーでさえ空のタプルによって索引付けされる場合があります。
In [36]: numpy.int64(10)[()]
Out[36]: 10