如何获取列表中每个周期的最小值和最大值?

How to get the minimum and maximum of each period in the list?

这是我在列表中得到的图表

我的问题是如何获得列表中每个周期的每个最小值和最大值? 按照图表,我想在点 1 处获得第一个最大值,第一个最小值在点 30,第二个最大值在点 62,第二个最小值在点 94

我已经试过了,但是它得到了错误的点,因为列表中的值不稳定,正如你在图表上看到的那样

这是我试过的代码

import matplotlib.pyplot as plt

max_1 = 0
max_1_pos = 0
min_1_pos = 0
max_2 = 0
max_2_pos = 0
min_2_pos = 0
img_list_pix =[218, 225, 224, 224, 224, 220, 217, 215, 216, 216,
               216, 215, 214, 215, 214, 214, 213, 210, 210, 205,
               207, 204, 205, 201, 200, 201, 201, 197, 202, 203,
               196, 196, 196, 196, 198, 198, 199, 202, 202, 205,
               205, 205, 207, 206, 208, 207, 209, 214, 212, 213,
               215, 218, 220, 219, 218, 220, 223, 222, 224, 224,
               224, 222, 225, 222, 222, 222, 222, 223, 223, 221,
               223, 222, 223, 219, 218, 216, 215, 214, 212, 212,
               211, 211, 207, 206, 205, 204, 202, 199, 199, 198,
               197, 195, 193, 191, 191, 193, 191, 196]

for i in range(len(img_list_pix)):
    if img_list_pix[i] >= max_1:
        max_1 = img_list_pix[i]
        max_1_pos = i
    else:
        break
min_1 = max_1
print(f"max_1:{max_1} | i:{i}")

for i in range(max_1_pos + 1, len(img_list_pix)):
    if img_list_pix[i] <= min_1:
        min_1 = img_list_pix[i]
        min_1_pos = i
    else:
        break
max_2 = min_1
print(f"min_1:{min_1} | i:{i}")

for i in range(min_1_pos + 1, len(img_list_pix)):
    if img_list_pix[i] >= max_2:
        max_2 = img_list_pix[i]
        max_2_pos = i
    else:
        break
min_2 = max_2
print(f"max_2:{max_2} | i:{i}")

for i in range(max_2_pos + 1, len(img_list_pix)):
    if img_list_pix[i] <= min_2:
        min_2 = img_list_pix[i]
        min_2_pos = i
    else:
        break
print(f"min_2:{min_2} | i:{i}")

结果

max_1:225 | i:2
min_1:215 | i:8
max_2:216 | i:11
min_2:214 | i:13

提前致谢。

您应该首先使用以下内容过滤您的列表:

def low_pass_filter(L, alpha = 0.2):
    filtered_L = []
    for i in range(1,len(L)-1):
        filtered_L.append(L[i-1] * alpha + L[i] * (1-2*alpha) + L[i+1]*alpha)
    return filtered_L

然后您可以使用以下命令找到列表的极值:

def extremums(L):
    """
    This function will only find the local extremums where the derivative should be zero
    """
    maximums = {} #index -> value
    minimums = {} #index -> value
    for i in range(1,len(L)-1):
        if  L[i-1] <= L[i] > L[i+1] or L[i-1] < L[i] >= L[i+1]:
            maximums[i] = L[i] #add this value to maximums
        elif L[i-1] >= L[i] < L[i+1] or L[i-1] > L[i] <= L[i+1]:
            minimums[i] = L[i] #add this value to manimums
    return maximums, minimums
    

L = [1, 2, 3, 1, 2, 0, 5, 8, 7]

print("Maximums :",extremums(L)[0])
print("Minimums :",extremums(L)[1])

输出:

Maximums : {2: 3, 4: 2, 7: 8}
Minimums : {3: 1, 5: 0}
  • 如果极值在列表的开头或结尾,则不会输出
  • 输出是一个包含“index->​​value”的字典

这有帮助吗:

img_list_pix = [218, 225, 224, 224, 224, 220, 217, 215, 216, 216,
                216, 215, 214, 215, 214, 214, 213, 210, 210, 205,
                207, 204, 205, 201, 200, 201, 201, 197, 202, 203,
                196, 196, 196, 196, 198, 198, 199, 202, 202, 205,
                205, 205, 207, 206, 208, 207, 209, 214, 212, 213,
                215, 218, 220, 219, 218, 220, 223, 222, 224, 224,
                224, 222, 225, 222, 222, 222, 222, 223, 223, 221,
                223, 222, 223, 219, 218, 216, 215, 214, 212, 212,
                211, 211, 207, 206, 205, 204, 202, 199, 199, 198,
                197, 195, 193, 191, 191, 193, 191, 196]


def getminmax(L, i):
    _min = min(L[i:])
    _max = max(L[i:])
    return (_min, L[i:].index(_min)+i), (_max, L[i:].index(_max)+i)


for i in [0, 29, 61, 93]:
    print(getminmax(img_list_pix, i))

您修改后的代码如下:

F1 = 0
F1_lim = 15
for i in range(len(img_list_pix)):
    if img_list_pix[i] > max_1:
        max_1 = img_list_pix[i]
        max_1_pos = i
        F1 = 0
    elif F1 <= F1_lim:
        F1 += 1
        if img_list_pix[i] > max_1:
            max_1 = img_list_pix[i]
            max_1_pos = i
            F1 = 0
    else:
        F1 = 0
        break
print(f"max_1:{max_1} | i:{max_1_pos}")

min_1 = max_1
for i in range(max_1_pos + 1, len(img_list_pix)):
    if img_list_pix[i] < min_1:
        min_1 = img_list_pix[i]
        min_1_pos = i
        F1 = 0
    elif F1 <= F1_lim:
        F1 += 1
        continue
    else:
        F1 = 0
        break
print(f"min_1:{min_1} | i:{min_1_pos}")

max_2 = min_1
for i in range(min_1_pos + 1, len(img_list_pix)):
    if img_list_pix[i] > max_2:
        max_2 = img_list_pix[i]
        max_2_pos = i
        F1 = 0
    elif F1 <= F1_lim:
        F1 += 1
        if img_list_pix[i] > max_2:
            max_2 = img_list_pix[i]
            max_2_pos = i
            F1 = 0
    else:
        F1 = 0
        break
print(f"max_2:{max_2} | i:{max_2_pos}")

min_2 = max_2
for i in range(max_2_pos + 1, len(img_list_pix)):
    if img_list_pix[i] < min_2:
        min_2 = img_list_pix[i]
        min_2_pos = i
        F1 = 0
    elif F1 <= F1_lim:
        F1 += 1
        continue
    else:
        F1 = 0
        break
print(f"min_2:{min_2} | i:{min_2_pos}")

F1_lim是要比较的已建立值的索引后的索引数,可以由用户更改。此代码将给出以下结果:

max_1:225 | i:1
min_1:196 | i:30
max_2:225 | i:62
min_2:191 | i:93

该代码将给出第一次出现的谷值或峰值的最小值或最大值,例如min_2 它将 return 93。为了获得与 93 相同大小的最后一个,即 96 for min_2 在指定范围 F1_lim = 15小于大于运算符必须替换为小于等于大于等于 运算符。