Il problema si trova in x[1,x[0,:]+1]
, l'indice per il 2o asse: x[0,:]+1
è [1 2 3 4 5 6 7 8 9 10]
, in cui l'indice 10
è più grande della dimensione di x.
Nel caso della x[1,x[0,:]-1]
, l'indice del 2 ° asse è [-1 0 1 2 3 4 5 6 7 8 9]
, si finisce per ottenere [9 0 1 2 3 4 5 6 7 8]
, come 9
è l'ultimo elemento e ha un indice di -1
. L'indice del secondo elemento dalla fine è -2 e così via.
Con np.where((x[0,:]<5)&(x[0,:]>0),x[1,x[0,:]-1],x[1,:])
e x[0,:]=[0 1 2 3 4 5 6 7 8 9]
, ciò essenzialmente sta succedendo è che la prima cella viene acquistata forma x[1,:]
perché x[0,0]
è 0 e x[0,:]<5)&(x[0,:]>0
è False
. I successivi quattro elementi sono presi da x[1,x[0,:]-1]
. Il resto è da x[1,:]
. Infine, il risultato è [0 0 1 2 3 4 5 6 7 8]
Può sembrare essere OK per finestra scorrevole di appena 1 cellulare, ma è gonna a sorpresa con:
>>> 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])
Quando si tenta di spostarlo da una finestra di due celle .
Per questo specifico problema, se vogliamo mantenere ogni cosa in una linea, questa, farà:
>>> 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: Ora ho capito la tua domanda iniziale meglio, in pratica si vuole prendere un 2D array e calcolare la media delle celle N * N attorno a ciascuna cella. Questo è abbastanza comune. Per prima cosa probabilmente si vuole limitare N a numeri dispari, altrimenti una cosa come la media 2 * 2 attorno a una cella è difficile da definire. Supponiamo di voler 3 * 3 media:
#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]])
penso che non c'è bisogno di appiattire voi 2D-array, che provoca confusione. Inoltre, se si desidera gestire gli elementi di bordo in modo diverso da quelli appena tagliati, considerare la possibilità di creare array mascherati utilizzando np.ma
in Passaggio "Sposta l'array originale".
Per chiarire che non si desidera includere 'vector2 [i]' nel mezzo o si trattava di un errore nel codice? – Daniel
Io no. Grazie. – JEquihua
Il tuo codice calcola la media di un quartiere 3x3 di ogni cella, non un quartiere 6x6; era intenzionale? – nneonneo