構文的には、これは矛盾しているように見えますが、意味的には、ここでは2つの非常に異なることを行っています。a
との定義では、データのコピーを返す高度なインデックス作成(ファンシーインデックス作成と呼ばれることもありb
ます)を実行しています。の定義では、データのビューを返す基本的なスライスを実行しています。c
違いを理解するには、インデックスがPythonオブジェクトにどのように渡されるかを理解するのに役立ちます。ここではいくつかの例を示します。
>>> class ShowIndex(object):
... def __getitem__(self, index):
... print index
...
>>> ShowIndex()[:,:]
(slice(None, None, None), slice(None, None, None))
>>> ShowIndex()[...,:]
(Ellipsis, slice(None, None, None))
>>> ShowIndex()[0:5:2,::-1]
(slice(0, 5, 2), slice(None, None, -1))
>>> ShowIndex()[0:5:2,np.arange(3)]
(slice(0, 5, 2), array([0, 1, 2]))
>>> ShowIndex()[0:5:2]
slice(0, 5, 2)
>>> ShowIndex()[5, 5]
(5, 5)
>>> ShowIndex()[5]
5
>>> ShowIndex()[np.arange(3)]
[0 1 2]
ご覧のとおり、さまざまな構成が考えられます。まず、個々のアイテムを渡すか、アイテムのタプルを渡すことができます。次に、タプルには、slice
オブジェクト、Ellipsis
オブジェクト、プレーン整数、またはnumpy
配列が含まれる場合があります。
基本的なスライスは、、、、またはオブジェクト、または(と同じ)などのオブジェクトのみを渡すとアクティブになります。これらは、単独またはタプルで渡すことができます。基本的なスライスがどのようにアクティブ化されるかについて、ドキュメントは次のように述べています。int
slice
Ellipsis
None
numpy.newaxis
基本的なスライスは、objがスライスオブジェクト(括弧内のstart:stop:step表記で構成されている)、整数、またはスライスオブジェクトと整数のタプルである場合に発生します。Ellipsisオブジェクトとnewaxisオブジェクトもこれらに散在させることができます。Numericでの一般的な使用法との下位互換性を維持するために、選択オブジェクトがスライスオブジェクト、Ellipsisオブジェクト、またはnewaxisオブジェクトを含むが、整数配列などを含まないシーケンス(リストなど)の場合も、基本的なスライスが開始されます。埋め込まれたシーケンス。
numpy
高度なインデックス作成は、配列、整数のみを含む、または任意の種類のサブシーケンスを含む非タプルシーケンス、または配列またはサブシーケンスを含むタプルを渡すとアクティブになります。
高度なインデックス作成と基本的なスライスの違いの詳細については、ドキュメント(上記にリンク)を参照してください。しかし、この特定のケースでは、何が起こっているのかは私には明らかです。部分インデックスを使用する場合は、次の動作と関係があります。
部分索引付けの規則は、結果の形状(または設定で使用されるオブジェクトの解釈された形状)が、索引付けされた部分空間がブロードキャストされた索引付け部分空間に置き換えられたxの形状であるということです。インデックスサブスペースが互いに隣接している場合、ブロードキャストされたインデックススペースは、x内のすべてのインデックスサブスペースを直接置き換えます。インデックスサブスペースが(スライスオブジェクトによって)分離されている場合、ブロードキャストされたインデックススペースが最初になり、次にxのスライスされたサブスペースが続きます。
a
高度なインデックスを使用するの定義では、シーケンス[0, 1]
をタプルの3番目の項目として効果的に渡します。また、ブロードキャストが行われないため(他のシーケンスがないため)、すべてが期待どおりに行われます。
の定義ではb
、これも高度なインデックスを使用して、最初の項目(配列に変換される)と3番目の項目の2つのシーケンスを効果的に渡します。この2つのアイテムは一緒に放送され、結果は3番目のアイテムと同じ形になります。ただし、ブロードキャストが行われたため、問題が発生しました。新しいシェイプのタプルのどこにブロードキャストされたシェイプを挿入するのでしょうか。ドキュメントが言うように、[0]
intp
[0, 1]
インデックスサブスペースにドロップする明確な場所がないため、最初に追加されます。
したがって、2
ブロードキャストから生じる結果は、シェイプタプルの先頭に移動され、見かけの転置が生成されます。