どのようにインデックスリスト(配列をどのように動作するか
- )お互いにブロードキャスト
- 複合型の高度な/基本的なインデックス作成の仕組み
In [286]: y1 = np.arange(18).reshape(3,2,3)
In [287]: y1
Out[287]:
array([[[ 0, 1, 2],
[ 3, 4, 5]],
[[ 6, 7, 8],
[ 9, 10, 11]],
[[12, 13, 14],
[15, 16, 17]]])
In [288]: y1[[0,1,2],:,[False, False, True]]
Out[288]:
array([[ 2, 5],
[ 8, 11],
[14, 17]])
In [289]: y1[[0,1,2],0:2,[False, False, True]]
Out[289]:
array([[ 2, 5],
[ 8, 11],
[14, 17]])
In [290]: y1[[0,1,2],[0,1],[False, False, True]]
....
IndexError: shape mismatch: indexing arrays could not be
broadcast together with shapes (3,) (2,) (1,)
したがって、最初の2は、(3,2)結果を生成し、エラー最後。最後は[False,False,True]
を(1、)インデックス配列に変換したことに注意してください。
最初
は、このシンプルなインデックスと同じである:(3,2,1) In [291]: y1[:,:,[False,False,True]]
Out[291]:
array([[[ 2],
[ 5]],
[[ 8],
[11]],
[[14],
[17]]])
A:私はブール値を使用する代わりに、場合
In [294]: y1[:,:,2]
Out[294]:
array([[ 2, 5],
[ 8, 11],
[14, 17]])
、それは私がy1[:,:,[2]]]
を使用しているかのようですアレイ。
y1[np.ix_([0,1,2], [0,1], [2])]
では、同じことが行われますが、高度なインデックス作成が行われます。 booleanリストも同じように動作します。彼らはこれが(にブロードキャスト(3,1,1)、(1,2,1)及び(1,1,1)を作成互いに
In [299]: np.ix_([0,1,2],[0,1],[2])
Out[299]:
(array([[[0]],
[[1]],
[[2]]]), array([[[0],
[1]]]), array([[[2]]]))
に対してブロードキャストできるようix_
3つのアレイを整形します3,2,1)。
y1[[0,1,2], :, [2]]
は、(3、)を生成するためにa(1、)でa(3、)を使用します。中間の(2、)中間の端が最後まで付いています。これは、基本的な/高度な索引付けが混在した例です。場合によっては直感的ではありません。たとえば、y1[[2], :, [0,1,2]]
は(3,2)を生成しますが、ユーザーはしばしば(2,3)を期待します。
Python multi-dimensional notation transpose automatically
ブールインデックスは0/1インデックスと同じではありません。
In [297]: y1[[0,1,2], :, [0,0,1]]
Out[297]:
array([[ 0, 3],
[ 6, 9],
[13, 16]])
これはy1[0,:,0]
、y1[1,:,0]
、およびy1[2,:,1]
を選択します。 2つのリストの要素をペアにします。 a(3、)でa(3、)をブロードキャストします。再び中央のスライスが最後に追加されます。
[0,2]
の同等、サイズ(2,)
インデックスであることが[True, False, True]
た場合はブール値マスクは問題を抱えていることができることを注意、。それは(3,)
で放送されません。
In [307]: y1[[0,1,2],:,[True, False, True]]
IndexError: shape mismatch: indexing arrays could not be broadcast together with shapes (3,) (2,)
y1[[[0],[1],[2]],:,[True, False, True]]
(3,2,2)
結果、および y1[[[0],[1],[2]],[0,1],[True, False, True]]
(3,2)
とご理解をテストします。
最後のケースでは 'ix_'放送が必要です。真ん中の1つのスライスはシェイプオーダーを混乱させる可能性があります。これは、先進的な/基本的なインデックス作成の複合的なケースです。 '[:、:、[2]]を参照してください。 – hpaulj
numpyは、リストまたはスライスオブジェクトに遭遇するかどうかによって、そのインデックス動作を変更します。あなたはドキュメントのファンシーインデックスセクションでそれについて読むことができます。 – percusse