3 回答

TA貢獻1995條經(jīng)驗 獲得超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條經(jīng)驗 獲得超4個贊
我找到了一個解決方案,該解決方案的靈感來自我在嘗試實現(xiàn)不同的邊緣行為時偶然發(fā)現(xiàn)的 matlab 函數(shù),而在均值過濾中沒有填充:https ://www.mathworks.com/matlabcentral/fileexchange/23287-smooth2a 。它適用于矩陣乘法,不涉及循環(huán)或卷積。使用一維數(shù)組,它會給出這樣的結(jié)果:
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
它的工作原理是創(chuàng)建一個對角線與內(nèi)核大小一樣多的矩陣,然后對數(shù)組進行點積。結(jié)果是一個數(shù)組,其中每個元素都是內(nèi)核上原始數(shù)組元素的總和?;旧?,這相當于卷積。最后,您通過內(nèi)核大小對該總和進行歸一化。
需要注意的一點是,在您無法構(gòu)建完整內(nèi)核的陣列邊緣,使用了適合您的陣列的盡可能多的內(nèi)核(這就是為什么您不能在之后僅通過標量進行歸一化)。
該解決方案還可以擴展到處理多維數(shù)組。

TA貢獻1780條經(jīng)驗 獲得超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)
注意:答案是從回購中挑選的
添加回答
舉報