我正在寻找可以实现movmin
功能的Python函数。我将下面的Matlab description of movmin
包括在内。
M = movmin(A,k)
返回以局部k
点为中心的最小值的数组,其中每个最小值是在k
的相邻元素之间的长度为A
的滑动窗口上计算的。当k
为奇数时,窗口将在当前位置围绕元素居中。当k
为偶数时,窗口以当前元素和先前元素为中心。当没有足够的元素填充窗口时,窗口大小将在端点处自动截断。截断窗口时,最小值将仅覆盖填充窗口的元素。M
与A
的大小相同。如果
A
是向量,则movmin
沿着向量的长度进行操作。如果
A
是多维数组,则movmin
沿大小不等于1的第一个数组维进行操作。
我的输入是一个多维数组。
答案 0 :(得分:0)
movMin向量的代码:
def movMin(datas,k):
result = np.empty_like(datas)
start_pt = 0
end_pt = int(np.ceil(k/2))
for i in range(len(datas)):
if i < int(np.ceil(k/2)):
start_pt = 0
if i > len(datas) - int(np.ceil(k/2)):
end_pt = len(datas)
result[i] = np.min(datas[start_pt:end_pt])
start_pt += 1
end_pt +=1
return result
测试用例:
a = [15,14,11,14,14,4,3,20,4,1]
movMin(a,4)
array([14, 11, 11, 11, 4, 3, 3, 3, 1, 1])
b = [1,14,11,14,4,11,6,3,20,4,2]
movMin(b,11)
array([1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2])
这是代码和测试用例以供参考。
答案 1 :(得分:0)
Pandas dataframes为许多不同类型的移动窗口计算(或Pandas称之为rolling window)提供了简洁而强大的方法。这是MATLAB的movmin
文档中矩阵最小移动示例的重现:
import pandas as pd
A = pd.DataFrame([[4, 8, 6], [-1, -2, -3], [-1, 3, 4]])
M = A.rolling(window=3, min_periods=1, center=True, axis=1).min()
print(M)
# Output:
# 0 1 2
# 0 4.0 4.0 6.0
# 1 -2.0 -3.0 -3.0
# 2 -1.0 -1.0 3.0