我正在尝试使用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
答案 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)。