首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在python列表中查找局部极大值及其索引

在python列表中查找局部极大值及其索引
EN

Stack Overflow用户
提问于 2022-11-02 15:35:44
回答 1查看 45关注 0票数 1

我有一个很大的数据集,我正在试图找到局部最大值及其索引。我是为了得到当地的极大值而去的,但是我想不出一个方法来得到他们的指数。问题是,我只需要正值的最大值,我们应该忽略负值。换句话说,这就像将列表分割成几个具有正值的段,然后得到这些最大值。

例如,test_data = 2,35,-45,56,5,67,21,320,55,-140,-45,-98,-23,-23,35,67,34,-30,-86,4,-93,35,88,32,98,-6

我的代码是:

代码语言:javascript
复制
def global_peaks(test_data):
    counter1 = []
    index = []
    global_peak = []
    global_idx = []
    for idx, data in enumerate(test_data):
        if data > 0:
            counter1.append(data)
            index.append(idx)                                    
        else:
            if(len(counter1) != 0):
                global_peak.append(max(counter1))
                index.append(idx)
                global_idx.append(index)
            counter1.clear()
            index.clear()
    return global_peak, global_idx

global_peaks(test_data)

代码语言:javascript
复制
([35, 320, 67, 4, 98], [[], [], [], [], []])

当涉及到值时,结果是正确的,而不是指数。

代码语言:javascript
复制
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-02 16:00:23

代码语言:javascript
复制
def global_peaks(test_data):
    counter1 = []
    index = []
    global_peak = []
    global_idx = []
    for idx, data in enumerate(test_data):
        if data > 0:
            counter1.append(data)
            index.append(idx)
        else:
            if(len(counter1) != 0):
                global_peak.append(max(counter1))
                index.append(idx)
                global_idx.append(index)
            counter1.clear()
            index.clear()
        index.append(1) # <-- for demonstration
    return global_peak, global_idx

global_peaks(test_data)

# Output
([35, 320, 67, 4, 98], [[1], [1], [1], [1], [1]])

一个问题是附加一个list (global_idx.append(index)),它是一个可变的对象。您正在添加对此列表的引用,因此输出将在输出时显示该列表中的任何内容。您需要使用的是该列表(index.copy())的副本,尽管这仍然没有给出所需的结果。为什么这些行应该给出相应的索引

代码语言:javascript
复制
index.append(idx)
global_idx.append(index)

这将为您提供相应的索引:

代码语言:javascript
复制
max_idx = index[counter1.index(max(counter1))]

关于您的一般方法的一个注意事项:如果您在一个仅为正值的区域中有2个或更多的局部最大值,则只会找到一个。这就是你想要的吗?

完整代码如下所示:

代码语言:javascript
复制
def global_peaks(test_data):
    counter1 = []
    index = []
    global_peak = []
    global_idx = []
    for idx, data in enumerate(test_data):
        if data > 0:
            counter1.append(data)
            index.append(idx)                                    
        else:
            if(len(counter1) != 0):
                global_peak.append(max(counter1))
                max_idx = index[counter1.index(max(counter1))] # <- changed 
                global_idx.append(max_idx) # <- changed
            counter1.clear()
            index.clear()
    return global_peak, global_idx

#Output
globla_peaks(test_data)
([35, 320, 67, 4, 98], [1, 7, 15, 19, 24])
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74291821

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档