2016-09-04 5 views
1

ここで見つかったPythonのN次元配列の畳み込みを行った後 SO 私は今、私の頭を包むことのできない問題に直面しています。 scipy.ndimageから提供される畳み込みは、Matlabのconvnのような畳み込みの '有効な'部分を選択することを許可しないので、有効な部分をスライスする必要があります。 [2×2]のカーネルサイズで 畳み込み後にスライスすると、-1インデックスが機能しない

"valid = [slice(kernel.shape[0]//2, -kernel.shape[0]//2), slice(kernel.shape[1]//2, -kernel.shape[1]//2)]" 

、Iわからない私は、カーネルと画像[24×24]の畳み込みのための有効なスライスを取得しない理由として。

z = convolve(image,kernel)[valid] 

私は[23x23]画像を期待していましたが、[22x22]画像が表示されます。 こうしてスライスの値をチェックしたところ、ここでは-1が動作しないようです。

convolve(image,kernel)[1:-1,1:-1] ---> Gives 22x22 
convolve(image,kernel)[1:,1:] ---> Gives 23x23 

マニュアルのスライスを行うので、質問が来るどのように...である-1単純な配列の最後の項目を与えるが、スライスの私の場合には、それはそれを無視? Pythonで

a= np.array([100,101,102]) 
a[-1] 
102 

答えて

4

スライスの上限はslice(1,-1)は最初と最後のアイテムの両方を削除し、すべてのPythonの場合、リストと配列において

In [699]: np.arange(5) 
Out[699]: array([0, 1, 2, 3, 4]) 
In [700]: np.arange(5)[:4] 
Out[700]: array([0, 1, 2, 3]) 
In [701]: np.arange(5)[:-1] 
Out[701]: array([0, 1, 2, 3]) 
In [702]: np.arange(5)[1:-1] 
Out[702]: array([1, 2, 3]) 

開放されています。 slice(1,None)x[1:]と同じ)は最初のものだけを削除します。

それだけで-1は最後を意味します。スライスではup to, but including, the lastを意味します。

In [703]: np.arange(5)[-1] 
Out[703]: 4 

は、私はこの問題は、単にスライス程度であり、それは畳み込みかから来ているかどうかに関係なく、任意の配列に適用されると仮定します。

+0

説明のためのブラボー:) – Wajih

関連する問題