6

リストとタプルには違いがあり、タプルは単なる定数リストではないことは十分承知していますが、 (コーディング規約ではなく)コードによって実際に 2 つが異なって扱われる例はほとんどないので、 (ずさんに)それらを同じ意味で使用しました。

次に、まったく異なる動作をするケースに遭遇しました。

>>> import numpy as np
>>> a = np.arange(9).reshape(3,3)
>>> a
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])
>>> idx = (1,1)
>>> a[idx]
4
>>> idx = [1,1]
>>> a[idx]
array([[3, 4, 5],
       [3, 4, 5]])

誰かがここで何が起こっているのか説明できますか? さらに重要なことに、この落とし穴は scipy のどこに現れるのでしょうか?

4

1 に答える 1

4

numpy では 3 種類のインデックス作成がサポートされているため、異なる動作が発生しています。

  • 基本的なスライス
  • 高度なインデックス作成
  • 記録へのアクセス

インデックス作成にタプルを使用することは、基本スライシングとしてサフィックスが付くパラメーター リストとまったく同じですが、タプルのようなリスト以外を使用すると、高度なインデックス作成が行われます。

また、ドキュメントから覚えておいてください

高度なインデックス作成は、選択オブジェクト obj が非タプル シーケンス オブジェクト、ndarray (integer または bool データ型)、または少なくとも 1 つのシーケンス オブジェクトまたは ndarray (integer または bool データ型) を持つタプルである場合にトリガーされます。高度なインデックス作成には、整数とブールの 2 種類があります。

高度なインデックス作成では、常にデータのコピーが返されます (ビューを返す基本的なスライスとは対照的です)。

さらに、同じドキュメントから

Python では、x[(exp1, exp2, ..., expN)] は x[exp1, exp2, ..., expN] と同等です。後者は前者の構文糖衣にすぎません。

于 2013-08-12T07:16:28.700 に答える