【问题标题】:Python, finding the max value of an array above a specific value and it's indexPython,查找高于特定值的数组的最大值及其索引
【发布时间】:2021-09-10 07:36:10
【问题描述】:

python新手,我需要找到一个数组在下限之上的最大值, 示例 [1,2,3,4,5 6] 找到大于 3 的最大值以及它的索引位置。实际上,我有一列具有波长/能量(eV),另一列(几列)具有强度,我试图找出最大强度及其波长位置,忽略低于某个波长的激光峰值真实数据。

我试过这样的

df=pandas read file ['....']

column_names = ['a','b',....]

def find_max(x, y, xMax):
    return np.max(y[x < xMax])

xMax = 1.9

for i in range(len(column_names)):
    max_int_val = find_max(df['eV'], df[column_names[i]], xMax)
    max_wav_index = df[column_names[i]].idxmax(max_int_val)
    max_wav_val = df["Wavelength"].iloc[max_wav_index]
    max_eV_val = df["eV"].iloc[max_wav_index]

然而 max_int_val 似乎是正确的,但 max_wav_index、max_wav_val 和 max_eV_val 似乎是错误的。

我相信正在发生的事情是索引正在使用整个列,而不是在查找索引时被截断的列。

【问题讨论】:

    标签: python indexing max


    【解决方案1】:

    我们可以通过以下方式找到:

    • 按顺序查找高于阈值的索引列表
    • 在这些索引中查找最大值

    代码

    import pandas as pd
    import numpy as np
    
    def find_max(a, lower_bound):
        ' Finds max above threshold '
        
        # Find indexes which are above threshold
        valid_idx = np.where(a >= lower_bound)[0]
        
        if valid_idx.size > 0:
            # Find maximum from these indexes
            max_idx = valid_idx[a[valid_idx].argmax()]
            return max_idx, a[max_idx]     # return index and max value
    

    测试

    data = [(1, 1), (2, 0), (10, 2), (5, 0)]
    df = pd.DataFrame(data, columns  = ['a','b'])
    print("DataFrame\n", df)
    print()
    
    # Find max in each column of DataFrame above lower bound
    lower_bound = 8
    for (column_name, column_data) in df.iteritems():
        found_max = find_max(column_data, lower_bound)
        if found_max:
            print(f'Column {column_name}: max index {found_max[0]}, max_value: {found_max[1]}')
        else:
            print(f'Column {column_name}: No max found')
    

    输出

    DataFrame
         a  b
    0   1  1
    1   2  0
    2  10  2
    3   5  0
    
    Column a: max index 2, max_value: 10
    Column b: No max found
    

    【讨论】:

      【解决方案2】:

      我不确定我是否理解你的问题,但我想出了这个

      def findMax(tab,maxColumn,minimum): #maxColumn is the column you want to use,intensity in your case
          maximum=minimum
          index=-1#if it's still -1 no element was found
          for i in range(0, len(tab[maxColumn])):
              if tab[maxColumn]>maximum :
                  maximum=tab[maxColumn]
                  index=maxColumn
          return(maximum, index)
      
      #then you can use index to get the wavelength with something like that : tab[wavelengthColumn][index]
      

      如果您有多个强度列,您可以为每个列调用此函数并构建一个数组,其中包含您将再次发送到此函数的结果

      类似的东西:

      array=[........]
      intensityColumns=1
      maximums=[[][]]
      for i in range (0,intensityColumns):
          maximum,index=findMax(array,FIRST_INTENSITY_COLUMN+i,MINIMUM)#here I suppose every intensity column is following the first one
          maximums[0].append(array[wavelengthColumn][index])
          maximums[1].append(maximum)
      resultMax,resultIndex=findMax(maximums,1,MINIMUM)
      

      【讨论】:

        猜你喜欢
        • 2017-05-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-17
        • 2016-02-24
        • 1970-01-01
        • 2012-11-25
        相关资源
        最近更新 更多