3 回答
TA贡献1995条经验 获得超2个赞
举例:
import numpy as np
k=2
kern=np.ones(2*k+1)/(2*k+1)
arr=np.random.random((10))
out=np.convolve(arr,kern, mode='same')
TA贡献1744条经验 获得超4个赞
我找到了一个解决方案,该解决方案的灵感来自我在尝试实现不同的边缘行为时偶然发现的 matlab 函数,而在均值过滤中没有填充:https ://www.mathworks.com/matlabcentral/fileexchange/23287-smooth2a 。它适用于矩阵乘法,不涉及循环或卷积。使用一维数组,它会给出这样的结果:
import scipy.sparse
import numpy as np
def mean_filter(arr, k):
p = len(arr)
diag_offset = np.linspace(-(k//2), k//2, k, dtype=int)
eL = scipy.sparse.diags(np.ones((k, p)), offsets=diag_offset, shape=(p, p))
nrmlize = eL @ np.ones_like(arr)
return (eL @ arr) / nrmlize
它的工作原理是创建一个对角线与内核大小一样多的矩阵,然后对数组进行点积。结果是一个数组,其中每个元素都是内核上原始数组元素的总和。基本上,这相当于卷积。最后,您通过内核大小对该总和进行归一化。
需要注意的一点是,在您无法构建完整内核的阵列边缘,使用了适合您的阵列的尽可能多的内核(这就是为什么您不能在之后仅通过标量进行归一化)。
该解决方案还可以扩展到处理多维数组。
TA贡献1780条经验 获得超1个赞
def meanfilt (x, k):
"""Apply a length-k mean filter to a 1D array x.
Boundaries are extended by repeating endpoints.
"""
import numpy as np
assert k % 2 == 1, "Mean filter length must be odd."
assert x.ndim == 1, "Input must be one-dimensional."
k2 = (k - 1) // 2
y = np.zeros ((len (x), k), dtype=x.dtype)
y[:,k2] = x
for i in range (k2):
j = k2 - i
y[j:,i] = x[:-j]
y[:j,i] = x[0]
y[:-j,-(i+1)] = x[j:]
y[-j:,-(i+1)] = x[-1]
return np.mean (y, axis=1)
注意:答案是从回购中挑选的
添加回答
举报