Das Problem liegt in x[1,x[0,:]+1]
, der Index für die 2. Achse: x[0,:]+1
ist [1 2 3 4 5 6 7 8 9 10]
, in dem Index 10
ist größer als die Dimension von x.
Im Fall x[1,x[0,:]-1]
ist der Index der 2. Achse [-1 0 1 2 3 4 5 6 7 8 9]
Sie [9 0 1 2 3 4 5 6 7 8]
am Ende immer, wie 9
das letzte Element ist und hat einen Index von -1
. Der Index des zweiten Elements vom Ende ist -2 und so weiter.
Mit np.where((x[0,:]<5)&(x[0,:]>0),x[1,x[0,:]-1],x[1,:])
und x[0,:]=[0 1 2 3 4 5 6 7 8 9]
, was im Wesentlichen los ist, ist, dass die erste Zelle Form genommen wird x[1,:]
weil x[0,0]
0 und x[0,:]<5)&(x[0,:]>0
ist False
. Die nächsten vier Elemente stammen aus x[1,x[0,:]-1]
. Der Rest ist von x[1,:]
. Schließlich ist das Ergebnis [0 0 1 2 3 4 5 6 7 8]
Es erscheinen für Gleitfenstersystem von nur 1 Zelle in Ordnung zu sein, aber es wird Sie überraschen mit:
>>> 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])
Wenn Sie versuchen, es durch ein Fenster von zwei Zellen zu bewegen .
Für dieses spezifische Problem, wenn wir alles, was in einer Linie halten wollen, dies tun:
>>> 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]
Edit: Jetzt ist Ihre ursprüngliche Frage besser verstehe ich, im Grunde Sie eine 2D nehmen wollen Array und berechnen N * N-Zelle Durchschnitt um jede Zelle. Das ist ziemlich üblich. Zuerst möchten Sie wahrscheinlich N auf ungerade Zahlen beschränken, andernfalls ist ein 2 * 2 Durchschnitt um eine Zelle schwierig zu definieren. Angenommen, wir wollen 3 * 3 Durchschnitt:
#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]])
Ich glaube, Sie brauchen nicht zu glätten Sie 2D-Array, die Verwirrung verursacht. Wenn Sie die Kantenelemente anders handhaben möchten, als sie einfach wegzuschneiden, sollten Sie maskierte Arrays erstellen, indem Sie np.ma
im Schritt "Move your original array around" verwenden.
Um zu verdeutlichen, dass Sie "vector2 [i]" nicht in den Mittelwert einschließen wollen oder war das ein Fehler im Code? – Daniel
Ich nicht. Vielen Dank. – JEquihua
Ihr Code berechnet den Durchschnitt einer 3x3-Umgebung jeder Zelle, nicht eine 6x6-Umgebung; war das beabsichtigt? – nneonneo