获取scipy.ndimage.filters.generic_filter中的当前元素

时间:2013-09-02 21:22:20

标签: python numpy scipy

是否可以在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 )

1 个答案:

答案 0 :(得分: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]])