【发布时间】:2019-11-07 00:29:58
【问题描述】:
我希望实现一个快速移动的中位数,因为我必须为我的程序做很多中位数。我想使用 python 内置函数,因为它们比我能做的更优化。
我的中位数应该这样做:
- 提取 5 个值,
- 删除中间的一个,
- 找出剩余 4 个值的中位数。
基本上多次调用:
numpy.median(np.array([0, 1, 2, 3, 4])[np.array([True, True, False, True, True])])
# (1. + 3.) / 2. = 2.0
我找到了两个函数:scipy generic_filter 和 scipy median_filter。我的问题是 generic_filter 给出了正确的输出,而不是 median_filter,即使它们似乎具有相同的参数。此外,generic_filter 比 median_filter 慢。所以我想知道我在调用 median_filter 时做错了什么,并将这个用于提高速度。
import numpy as np
import scipy.ndimage as sc
v = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
print(sc.generic_filter(v, sc.median, footprint=np.array([1, 1, 0, 1, 1]), mode = "mirror", output=np.float64))
%timeit sc.generic_filter(v, sc.median, footprint=np.array([1, 1, 0, 1, 1]), mode = "mirror", output=np.float64)
print(sc.median_filter(v, footprint=np.array([1, 1, 0, 1, 1]), output=np.float64, mode="mirror"))
%timeit sc.median_filter(v, footprint=np.array([1, 1, 0, 1, 1]), output=np.float64, mode="mirror")
如您所见,generic_filter 给出了正确的输出: [1.5 1.5 2. 3. 4. 5. 6. 7. 8. 8.5 8.5] 每个循环 327 µs ± 15.2 µs(7 次运行的平均值 ± 标准偏差,每次 1000 个循环)
并且 median_filter 更快,但我不明白它的输出: [2. 2. 3. 4. 5. 6. 7. 8. 9. 9. 9.] 每个循环 12.4 µs ± 217 ns(7 次运行的平均值 ± 标准偏差,每次 100000 次循环)
你知道我的电话有什么问题吗?
【问题讨论】: