あなたがしていることには2つの異なる問題があります。主なものは、numpy でのインデックス作成の処理方法です。Numpy 行列には、使用しているリスト構文のリストよりもはるかに明確な独自の構文があります...括弧内の個別のインデックスの代わりにコンマを使用します。
>>> from numpy import zeros
>>> a = zeros((5,5,3), 'uint8')
>>> print a[1:2,1:2,:].shape
(1, 1, 3)
a[1:2] はまだリストのリストを返すため、代わりに行っていることは失敗しているため、次のインデックスは外側のリスト (要素が 1 つしかない) のインデックスであり、必要な内側のリストではありません。
>>> a[1:2]
array([[[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0]]], dtype=uint8)
>>> a[1:2][1:2]
array([], shape=(0, 5, 3), dtype=uint8)
(スライスの代わりに単純なインデックスを使用していた場合、この問題は発生しませんが、カンマ構文を使用する必要があります。これは、はるかに明確であるためです。
第二に、スライスの使い方が間違っています。スライスの最初の値は、必要な配列の最初の値のインデックスです。インデックスは 0 から始まります。2 番目の値は、必要な配列のインデックスよりも 1 つ大きくなります。これは、ポイントをa[first_index:second_index]
返すためです。second_index-first_index
したがって、次のようなものが必要です。
>>> b = a[0:2,0:2,:]
>>> b
array([[[0, 0, 0],
[0, 0, 0]],
[[0, 0, 0],
[0, 0, 0]]], dtype=uint8)
のインデックスは[1:2]
1 つの要素のみを返します...リストの 2 番目の要素です。
また、.copy()
余談ですが、numpy 配列からスライスを取得すると、新しいオブジェクトが既に作成されているため、ここでは冗長です。