dato un 2D NumPy gammapython/NumPy metodo più veloce per 2g filtraggio kernel rango su array mascherati (e/o posizionamento selettiva)
MyArray = np.array([[ 8.02, 9.54, 0.82, 7.56, 2.26, 9.47],
[ 2.68, 7.3 , 2.74, 3.03, 2.25, 8.84],
[ 2.21, 3.62, 0.55, 2.94, 5.77, 0.21],
[ 5.78, 5.72, 8.85, 0.24, 5.37, 9.9 ],
[ 9.1 , 7.21, 4.14, 9.95, 6.73, 6.08],
[ 1.8 , 5.14, 5.02, 6.52, 0.3 , 6.11]])
e una serie maschera
MyMask = np.array([[ 0., 0., 1., 1., 0., 1.],
[ 1., 0., 0., 0., 0., 1.],
[ 0., 0., 0., 1., 0., 0.],
[ 0., 1., 1., 1., 1., 0.],
[ 0., 1., 0., 1., 0., 0.],
[ 0., 1., 0., 0., 1., 1.]])
voglio correre un filtro mediano "bucato" che ignora gli elementi mascherati.
Ad esempio, un filtro rango con un kernel
k = np.array([[ 1, 1, 1],
[ 1, 0, 1],
[ 1, 1, 1]]);
porrebbe su : classificare la zona definita dal kernel per ogni elemento di e restituire la mediana dei soli elementi non mascherati (averaging se l'array è un numero pari).
Ora, attualmente lo sto facendo in loop unptonici, usando bottleneck.nanmedian mappando la maschera ai NaN. Questo mi sta dando esattamente quello di cui ho bisogno, ma speravo di fare affidamento su routine di manipolazione di array 2D.
scipy.signal.order_filter
e scipy.ndimage.filters.rank_filter
bothavailable (rank_filter sembra essere molto più veloce), ma risulta che ordinare NaN
e Inf
nella parte superiore della matrice prima di restituire il rango e polarizzando il risultato. Sembra che nessuno di questi metodi supporti gli array numpy.ma (masking), né accettano una schiera di ranghi selettivi (quindi potrei riempire tutte le maschere con 0 e compensare il mio rank), né c'è un modo ovvio per variare il kernel per ogni posizione.
Mi chiedo se mi sia mancata una combinazione e/o una funzione Python, o se dovrei cercare di implementare una nuova routine in Cython.
Ignorando movimentazione confine, i punti interni del problema sopra sarebbero
[[ 0. 0. 0. 0. 0. 0. ]
[ 0. 3.18 3.62 2.26 2.645 0. ]
[ 0. 2.74 3.325 2.74 2.64 0. ]
[ 0. 3.88 3.62 4.955 6.08 0. ]
[ 0. 5.02 5.77 5.77 6.52 0. ]
[ 0. 0. 0. 0. 0. 0. ]]
Date un'occhiata a http://stackoverflow.com/questions/3662361/fill-in-missing-values-with-nearest-neighbour-in-python-numpy-masked-arrays?rq=1 – Jesuisme
Avete abbastanza RAM per contenere una matrice di (dati di dimensione) * (dimensione kernel)? –
@moarningsun si, ogni array non ha più di 12mb di memoria, devo solo ripetere questo processo alcune migliaia di volte. – anemes