列表输出中需要浮点数

时间:2015-10-30 08:08:00

标签: python numpy filtering

我正在尝试使用SciPy包中的通用过滤器创建自定义过滤器来运行它。

  

scipy.ndimage.filters.generic_filter

问题是我不知道如何将返回的值作为标量,因为它需要通用函数才能工作。我通读了这些线程(底部),但是找不到我的函数执行方式。

代码是这样的:

import scipy.ndimage as sc

def minimum(window):    
    list = []
    for i in range(window.shape[0]):
        window[i] -= min(window)
        list.append(window[i])        
    return list

test =  np.ones((10, 10)) * np.arange(10)

result = sc.generic_filter(test, minimum, size=3)

它给出错误:

cval, origins, extra_arguments, extra_keywords)
TypeError: a float is required

Scipy filter with multi-dimensional (or non-scalar) output

How to apply ndimage.generic_filter()

http://ilovesymposia.com/2014/06/24/a-clever-use-of-scipys-ndimage-generic_filter-for-n-dimensional-image-processing/

2 个答案:

答案 0 :(得分:2)

如果我理解,你想要将每个像素减去其3水平邻域的最小值。使用列表来做这件事并不是一个好习惯,因为numpy用于提高效率(大约快100倍)。最简单的方法就是:

test-sc.generic_filter(test, np.min, size=3)

然后在整个阵列上对减法进行矢量化。 你也可以这样做:

test-np.min([np.roll(test,1),np.roll(test,-1),test],axis=0)
如果您接受边界处的人工制品,则快10倍。

答案 1 :(得分:1)

使用Scipy filter with multi-dimensional (or non-scalar) output中的示例,我将您的代码转换为:

def minimum(window,out):
    list = []
    for i in range(window.shape[0]):
        window[i] -= min(window)
        list.append(window[i])        
    out.append(list)
    return 0

test =  np.ones((10, 10)) * np.arange(10)

result = []
sc.generic_filter(test, minimum, size=3, extra_arguments=(result,))

现在,您的函数minimum将其结果输出到参数out,并且不再使用返回值。因此,最终的 result 矩阵包含连接的所有结果,而不是generic_filter的输出。

编辑1:使用带有返回标量的函数的generic_filter,返回相同尺寸的矩阵。但是在这种情况下,过滤器会对每个调用附加列表,从而产生更大的矩阵(在这种情况下为100x9)。