- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我希望实现一个快速移动的中位数,因为我必须为我的程序做很多中位数。我想使用 python 内置函数,因为它们比我能做的更优化。
我的中位数应该做:
基本上多次调用:
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 个循环)
你知道我的电话有什么问题吗?
最佳答案
唯一的区别似乎是由于如何处理“关系”:
sc.median
返回关系的平均值sc.median_filter
似乎系统地返回较大的值给定方式median_filter
is implemented对于“偶数个元素的中位数应该返回关系的平均值”的情况,有效处理特殊/特定是很尴尬的
我已经编写了一个可以处理这种情况的版本:
from scipy.ndimage.filters import _rank_filter
def median_filter(input, footprint, output=None, mode="reflect", cval=0.0, origin=0):
filter_size = np.where(footprint, 1, 0).sum()
rank = filter_size // 2
result = _rank_filter(
input, rank, None, footprint, output, mode, cval, origin, 'dummy')
if filter_size % 2 == 0:
if result is output:
tmp = result.copy()
else:
tmp = result
rank -= 1
assert rank > 0
result = _rank_filter(
input, rank, None, footprint, output, mode, cval, origin, 'dummy')
# fix up ties without creating any more garbage
result += tmp
result /= 2
return result
但它有点笨重,并且使用 scipy 的内部功能(我使用的是 1.3.0),因此将来可能会崩溃
在我的机器上,这些基准测试为:
sc.generic_filter
每个循环需要 578 µs ± 8.51 µssc.median_filter
每个循环需要 27.4 µs ± 1.37 µsmedian_filter
每次循环需要 65.6 µs ± 1.29 µs关于python - 使用 scipy generic_filter 和 numpy Median_filter 计算移动中位数会给出不同的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56749449/
我正在尝试学习 ndimage,但我不知道如何做 generic_filter()功能有效。文档提到用户功能将应用于用户定义的足迹,但不知何故我做不到。这是示例: >>> import numpy a
我正在尝试编写一个 python 函数来删除 2D 图像数据中的热像素。我正在尝试创建一个函数,该函数将获取 2D 数组中每个元素周围的邻居的平均值,并且如果该元素的值超过其邻居的平均值特定量(例如
是否可以在 scipy.ndimage.filters.generic_filter 的过滤函数中获取“当前元素”? 例如,如果 A[0] 始终包含当前元素(似乎并非如此),则类似以下的内容可能会找到
我有一个 5000*5000 numpy 数组,我想在其上计算大小为 25 的窗口的峰度。我尝试将 scipys 自己的峰度函数放在 generic_filter 中找到在 ndimage.filte
我希望实现一个快速移动的中位数,因为我必须为我的程序做很多中位数。我想使用 python 内置函数,因为它们比我能做的更优化。 我的中位数应该做: 提取 5 个值, 删除中间的一个, 求剩余 4 个值
下面是测试代码 import numpy as np import cv2 from scipy.ndimage import generic_filter def s
我是一名优秀的程序员,十分优秀!