MATLAB的movmin的Python实现

时间:2019-07-31 20:52:39

标签: python matlab numpy

我正在寻找可以实现movmin功能的Python函数。我将下面的Matlab description of movmin包括在内。

  

M = movmin(A,k)返回以局部k点为中心的最小值的数组,其中每个最小值是在k的相邻元素之间的长度为A的滑动窗口上计算的。当k为奇数时,窗口将在当前位置围绕元素居中。当k为偶数时,窗口以当前元素和先前元素为中心。当没有足够的元素填充窗口时,窗口大小将在端点处自动截断。截断窗口时,最小值将仅覆盖填充窗口的元素。 MA的大小相同。

     

如果A是向量,则movmin沿着向量的长度进行操作。

     

如果A是多维数组,则movmin沿大小不等于1的第一个数组维进行操作。

我的输入是一个多维数组。

2 个答案:

答案 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