【问题标题】:How to get the minimum and maximum of each period in the list?如何获取列表中每个周期的最小值和最大值?
【发布时间】:2021-12-04 16:28:57
【问题描述】:

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

我的问题是如何获得列表中每个周期的每个最小值和最大值? 根据图表,我想在点 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

提前致谢。

【问题讨论】:

  • 使用内置函数 minmax 将帮助您对您的 img_list_pix 进行一些明智的切片列表。你希望得到什么输出?
  • 您的目标是在数组中找到局部最大值和最小值?
  • 在您的逻辑中,为什么第一个最小值会在 30 点触发?
  • 我觉得94必须改成93,是真的吗?

标签: python arrays list numpy graph


【解决方案1】:

您修改后的代码如下:

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,它将返回 93。为了获得与 93 相同大小的最后一个,即 96 用于指定范围内的min_2 F1_lim = 15小于 和 大于运算符必须替换为小于等于大于等于运算符。

【讨论】:

    【解决方案2】:

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

    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”的字典

    【讨论】:

      【解决方案3】:

      这有帮助吗:

      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))
      

      【讨论】:

        猜你喜欢
        • 2023-03-20
        • 2020-09-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-16
        相关资源
        最近更新 更多