Python, 找到数组中高于特定值的最大值及其索引

Python, finding the max value of an array above a specific value and it's index

python 的新手,我需要找到数组下限以上的最大值, 示例 [1,2,3,4,5 6] 找到大于 3 的最大值及其索引位置。实际上,我有一列是 wavelength/energy(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 似乎是错误的。

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

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

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)

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

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

代码

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