2013-09-02 11 views
5

scipy.ndimage.filters.generic_filterのフィルタ機能の中に「現在の要素」を取得できますか?scipy.ndimage.filters.generic_filterの現在の要素を取得する

例えば、A[0]は常に(ケースではないようです)現在の要素を含んで、場合は、次のようなものが極大値に

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) 

答えて

3

を見つけるかもしれない現在の要素は、内の要素でなければなりませんsize(または例ではA[1])ですが、これは入力配列の端に依存することはできず、配列境界を処理するためのmodeに依存します。

繰り返しの間にある状態を維持するためにクラスを使用してフィルタの現在の位置を決定するためのdocs instead provide a neat example(以下の状況に適応します)。これは常に最後の次元を最初に反復します。あなたがしなければならないのは、result行をフィルタ関数が実際に必要とするものに置き換えてください。あなたの場合、これは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

これは少なくとも私が使用している2Dの場合は動作しません。 'self._array'ルックアップに問題があります。私は今それを修正する方法を理解しようとしています.. – ajwood

関連する問題