問題はx[1,x[0,:]+1]
、2 番目の軸のインデックスであるにあります。x[0,:]+1
は[1 2 3 4 5 6 7 8 9 10]
、インデックス10
が x の次元よりも大きいです。
の場合x[1,x[0,:]-1]
、2 番目の軸のインデックスは であり、最終的には[-1 0 1 2 3 4 5 6 7 8 9]
を取得[9 0 1 2 3 4 5 6 7 8]
し、9
最後の要素は のインデックスを持ちます-1
。最後から 2 番目の要素のインデックスは -2 などです。
とnp.where((x[0,:]<5)&(x[0,:]>0),x[1,x[0,:]-1],x[1,:])
でx[0,:]=[0 1 2 3 4 5 6 7 8 9]
、本質的に起こっていることは、が 0 でが でx[1,:]
あるため、最初のセルが形をとることです。次の 4 つの要素は から取得されます。残りは からです。最終的に結果はx[0,0]
x[0,:]<5)&(x[0,:]>0
False
x[1,x[0,:]-1]
x[1,:]
[0 0 1 2 3 4 5 6 7 8]
1 セルだけのスライディング ウィンドウでは問題ないように見えるかもしれませんが、次のように驚かれることでしょう。
>>> np.where((x[0,:]<5)&(x[0,:]>0),x[1,x[0,:]-2],x[1,:])
array([0, 9, 0, 1, 2, 5, 6, 7, 8, 9])
2 つのセルのウィンドウで移動しようとすると。
この特定の問題について、すべてを 1 行にまとめたい場合は、次のようにします。
>>> for i in [1, 2, 3, 4, 5, 6]:
print hstack((np.where(x[1,x[0,:]-i]<x[0, -i], x[1,x[0,:]-i], 0)[:5], x[0,5:]))
[0 0 1 2 3 5 6 7 8 9]
[0 0 0 1 2 5 6 7 8 9]
[0 0 0 0 1 5 6 7 8 9]
[0 0 0 0 0 5 6 7 8 9]
[0 0 0 0 0 5 6 7 8 9]
[0 0 0 0 0 5 6 7 8 9]
編集:元の質問をよりよく理解できるようになりました。基本的には、2D配列を取得して、各セルのN * Nセル平均を計算したいと考えています。それは非常に一般的です。最初に、おそらく N を奇数に制限したいと思うでしょう。そうしないと、セルの周りの 2*2 平均などを定義するのが難しくなります。3*3 の平均が必要だとします。
#In this example, the shape is (10,10)
>>> a1=\
array([[3, 7, 0, 9, 0, 8, 1, 4, 3, 3],
[5, 6, 5, 2, 9, 2, 3, 5, 2, 9],
[0, 9, 8, 5, 3, 1, 8, 1, 9, 4],
[7, 4, 0, 0, 9, 3, 3, 3, 5, 4],
[3, 1, 2, 4, 8, 8, 2, 1, 9, 6],
[0, 0, 3, 9, 3, 0, 9, 1, 3, 3],
[1, 2, 7, 4, 6, 6, 2, 6, 2, 1],
[3, 9, 8, 5, 0, 3, 1, 4, 0, 5],
[0, 3, 1, 4, 9, 9, 7, 5, 4, 5],
[4, 3, 8, 7, 8, 6, 8, 1, 1, 8]])
#move your original array 'a1' around, use range(-2,2) for 5*5 average and so on
>>> movea1=[a1[np.clip(np.arange(10)+i, 0, 9)][:,np.clip(np.arange(10)+j, 0, 9)] for i, j in itertools.product(*[range(-1,2),]*2)]
#then just take the average
>>> averagea1=np.mean(np.array(movea1), axis=0)
#trim the result array, because the cells among the edges do not have 3*3 average
>>> averagea1[1:10-1, 1:10-1]
array([[ 4.77777778, 5.66666667, 4.55555556, 4.33333333, 3.88888889,
3.66666667, 4. , 4.44444444],
[ 4.88888889, 4.33333333, 4.55555556, 3.77777778, 4.55555556,
3.22222222, 4.33333333, 4.66666667],
[ 3.77777778, 3.66666667, 4.33333333, 4.55555556, 5. ,
3.33333333, 4.55555556, 4.66666667],
[ 2.22222222, 2.55555556, 4.22222222, 4.88888889, 5. ,
3.33333333, 4. , 3.88888889],
[ 2.11111111, 3.55555556, 5.11111111, 5.33333333, 4.88888889,
3.88888889, 3.88888889, 3.55555556],
[ 3.66666667, 5.22222222, 5. , 4. , 3.33333333,
3.55555556, 3.11111111, 2.77777778],
[ 3.77777778, 4.77777778, 4.88888889, 5.11111111, 4.77777778,
4.77777778, 3.44444444, 3.55555556],
[ 4.33333333, 5.33333333, 5.55555556, 5.66666667, 5.66666667,
4.88888889, 3.44444444, 3.66666667]])
混乱の原因となる 2D 配列を平坦化する必要はないと思います。また、エッジ要素をトリミングする以外に別の方法で処理したい場合は、np.ma
「元の配列を移動する」手順を使用してマスクされた配列を作成することを検討してください。