2016-06-21 9 views
3

私はちょうど私がかなり理解していないnumpyのインデックスの動作を偶然見つけました。インデックス作成のスキーマによっては、軸の順序が変わっているようです。残念ながら、私はドキュメントで次の説明を見つけることができません。誰かが何が起こっているか私に説明することができますか?ナンディインデックスの並べ替えの配列

# This is expected: dimension 1 is reduced to length 1: 
print np.ndarray(shape=(3,3,3,3))[:, [0], :, :].shape 
>>> (3, 1, 3, 3) 

# This is the unexpected behavior: 
print np.ndarray(shape=(3,3,3,3))[:, [0], :, 0].shape 
>>> (1, 3, 3) 

私は第2のコマンドが(3,1,3)を生成すると予想します。最初から2つの次元の形状が変わるのはなぜですか? ありがとうございます!

編集: は私のpython 2.7.11

+1

あいまいなものの、この動作は、[文書化されている](http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#combining-advanced-and-basic-indexing)。 –

答えて

4

ことが予想される動作でnumpyの1.11.0でこれを見... numpyのは、スライスとは異なる配列でインデックス軸でインデックス軸を扱います。デフォルトの振る舞いでは、得られるシェイプは結果として得られるシェイプの軸が配列でインデックスされ、スライスでインデックスされた軸のシェイプが生成されます。これは、奇妙なものが最初のケースであることを意味し、それは(1, 3, 3, 3)であったはずです。しかし、あなたのような単純なケースでユーザーを混乱させると思っていたので、配列でインデックス化されたすべての軸をグループ化すると、結果として得られた形状は、配列インデックス軸のクラスターが元の配列。

あなたは自分でそれをテストすることができます。

>>> print np.ndarray(shape=(3,3,3,3))[:, [0], [0], :].shape 
(3, 1, 3) 

あなたが経験してきたように、この賢さは、おそらく一貫性のある動作よりも混乱しています。 NumPy開発者間のコンセンサスは、クラスター配列のインデックス軸を別々に扱わない方が良いでしょうし、このsaner索引付けを可能にするa PR implementing indexer attributesさえあります。

下位互換性のため、デフォルトのインデックス作成はすぐには変更されない可能性がありますが、それほど遠い将来の一部のケースでは廃止予定の警告が発行される可能性があります。