0

numpy 配列のサブセットをコピーしようとしています (画像の背景の減算を行うためですが、それは by によるものです)。以下の何が問題なのか理解できません - インタラクティブにデモを行いました.

>>> from numpy import zeros
>>> a = zeros((5,5,3), 'uint8')
>>> print a.shape
(5, 5, 3)
>>> b = a[1:2][1:2][:].copy()
>>> print b.shape
(0, 5, 3)
>>> print a[1:2][1:2][:].shape
(0, 5, 3)
>>> print a.shape
(5, 5, 3)
>>>

私が望むのは、 b.shape が (2,2,3) を返すことです。そして、それを使用する必要がある後続の操作でそのように動作します。本当に明らかに間違ったことをしたと確信していますが、何が原因かわかりません。どんな提案もありがたく受け取った!

4

2 に答える 2

3

あなたがしていることには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 配列からスライスを取得すると、新しいオブジェクトが既に作成されているため、ここでは冗長です。

于 2013-04-25T14:45:45.107 に答える