問題がx[1,x[0,:]+1]
にあり、第2軸のインデックス:x[0,:]+1
は10
がxのディメンションより大きい[1 2 3 4 5 6 7 8 9 10]
です。 x[1,x[0,:]-1]
の場合
、第二軸のインデックスは9
が最後の要素であると-1
のインデックスを持っているとして、あなたが、[9 0 1 2 3 4 5 6 7 8]
を取得してしまう、[-1 0 1 2 3 4 5 6 7 8 9]
です。最後から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]
で
は、x[0,0]
が0であるとx[0,:]<5)&(x[0,:]>0
がFalse
であるため、最初のセルは、フォームx[1,:]
を取っていることです。次の4つの要素はx[1,x[0,:]-1]
から取られます。残りはx[1,:]
です。最後に結果が[0 0 1 2 3 4 5 6 7 8]
あるちょうど1セルのウィンドウをスライドさせるためのOKのように見えるかもしれないが、それはをごつもり驚きです:あなたは2つのセルの窓で、それを移動しようとすると
>>> 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])
。この特定の問題については
、私たちは、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
を使用してマスクされた配列を作成することを検討してください。
明確にするために、 'vector2 [i]'を平均に含めたくないのですが、これはコードの間違いでしたか? – Daniel
私はしません。ありがとうございました。 – JEquihua
あなたのコードは6x6近傍ではなく、各セルの3x3近傍の平均を計算します。これは意図的でしたか? – nneonneo