2013-09-02 13 views
5

È possibile ottenere "l'elemento corrente" nella funzione di filtro di scipy.ndimage.filters.generic_filter?Ottenere l'elemento corrente in scipy.ndimage.filters.generic_filter

Se, ad esempio, A[0] sempre contenuto l'elemento corrente (che non sembra essere il caso) qualcosa di simile al seguente potrebbe trovare massimi locali

def local_max_f(A) : 
    return A[0] == A.max() 

img = np.random.rand(100).reshape(10,10) 
ndimage.generic_filter(img, local_max_f, size=3) 

risposta

3

L'elemento corrente dovrebbe essere l'elemento in centro di size (o A[1] nell'esempio), ma questo non può essere invocato ai bordi della matrice di input e dipende dallo mode per la gestione dei bordi dell'array.

docs instead provide a neat example (adattato per la situazione in basso) per determinare la posizione corrente nel filtro utilizzando una classe per mantenere uno stato tra le iterazioni. Questo sempre scorre prima l'ultima dimensione; tutto quello che dovresti fare è sostituire la riga result con qualunque sia la funzione di filtro effettivamente necessaria, nel tuo caso questo sarebbe qualcosa come result = self._array[self.coordinates] == buffer.max().

a = arange(12).reshape(3,4) 

class fnc_class: 
    def __init__(self, _array): 
     # store the shape: 
     self.shape = _array.shape 
     self._array = _array 
     # initialize the coordinates: 
     self.coordinates = [0] * len(self.shape) 

    def filter(self, buffer): 
     result = self._array[tuple(self.coordinates)] == buffer.max() 
     print self.coordinates 
     # calculate the next coordinates: 
     axes = range(len(self.shape)) 
     axes.reverse() 
     for jj in axes: 
      if self.coordinates[jj] < self.shape[jj] - 1: 
       self.coordinates[jj] += 1 
       break 
      else: 
       self.coordinates[jj] = 0 
     return result 

fnc = fnc_class(a) 
generic_filter(a, fnc.filter, footprint = [[1, 0], [0, 1]]) 
+0

Questo non del tutto il lavoro .. almeno nel caso 2D sto usando. C'è un problema con la ricerca 'self._array'. Sto cercando ora di capire come aggiustarlo .. – ajwood