Numpy で 2 つの異なる方法でインデックス付けされた 2D 配列を見てきました。配列があると仮定すると、 orA
と入力できます。いずれにせよ、A の同じスライスが得られます。A[0:3, 2:5]
A[0:3][:,2:5]
なぜどちらか一方を選択するのか興味があります。速度の違いはありますか?それとも、一方が他方よりも単純に Pythonic なのですか?
最初の形式は、1 つのスライス操作を実行するため、より Pythonic で望ましいものです。2 番目の形式は、実際には 2 回スライスします。
最初の形式でA[0:3]
は、A より小さいスライスを返し、次に 2 番目のスライス操作で最初のスライス 1 の結果をスライスします。
あなたがするときA[0:3,2:5]
、あなたは実際にやっています
A.__getitem__((slice(0,3),slice(2,5)))
__getitem__
つまり、メソッドを 1 回だけ呼び出しています。
あなたがするときA[0:3][:,2:5]
、あなたは実際にやっています
A.__getitem__(slice(0,3)).__getitem__((slice(0,None), slice(2,5)))
つまり、(i) 一時配列を作成し、A[0:3]
(ii) この一時配列のスライスを取得します。これは通常、最初の方法 (直接スライス) よりも効率が悪いため、お勧めしません。[あなたが参照しているリンクはしばらく更新されていません。バグの可能性があります...]
A[i,j]
スタイルよりもスタイルを使用する正当な理由A[i][j]
は、スライス時に行全体または列全体を簡単にアドレス指定できるためだと思います。
たとえばA[:,0]
、列 0 のすべての値が返されますA[:][0]
が、範囲外のインデックス エラーが返されます。