Как найти локальный максимум массива

There exists a bulit-in function argrelextrema that gets this task done:

import numpy as np
from scipy.signal import argrelextrema
    
a = np.array([1,2,3,4,5,4,3,2,1,2,3,2,1,2,3,4,5,6,5,4,3,2,1])

# determine the indices of the local maxima
max_ind = argrelextrema(a, np.greater)

# get the actual values using these indices
r = a[max_ind]  # array([5, 3, 6])

That gives you the desired output for r.

As of SciPy version 1.1, you can also use find_peaks. Below are two examples taken from the documentation itself.

Using the height argument, one can select all maxima above a certain threshold (in this example, all non-negative maxima; this can be very useful if one has to deal with a noisy baseline; if you want to find minima, just multiply you input by -1):

import matplotlib.pyplot as plt
from scipy.misc import electrocardiogram
from scipy.signal import find_peaks
import numpy as np

x = electrocardiogram()[2000:4000]
peaks, _ = find_peaks(x, height=0)
plt.plot(x)
plt.plot(peaks, x[peaks], "x")
plt.plot(np.zeros_like(x), "--", color="gray")
plt.show()

enter image description here

Another extremely helpful argument is distance, which defines the minimum distance between two peaks:

peaks, _ = find_peaks(x, distance=150)
# difference between peaks is >= 150
print(np.diff(peaks))
# prints [186 180 177 171 177 169 167 164 158 162 172]

plt.plot(x)
plt.plot(peaks, x[peaks], "x")
plt.show()

enter image description here

A Python implementation, with a couple of points

  • Avoids using a reduce to make it easier to see the algorithm
  • First and last items are considered peaks (this can be a requirement, e.g. in interviews)
  • All values in the plateau are added
  • Can start or end on an plateau
def findPeaks(points: List[int]) -> List[int]:
    peaks, peak = [], []

    if points[0] >= points[1]:  # handle first
        peak.append(points[0])

    for i in range(1, len(points)):
        prv = points[i - 1]
        cur = points[i]

        if cur > prv:  # start peak
            peak = [cur]
        elif cur == prv:  # existing peak (plateau)
            peak.append(cur)
        elif cur < prv and len(peak):  # end peak
            peaks.extend(peak)
            peak = []

    if len(peak) and len(peak) != len(points):  # ended on a plateau
        peaks.extend(peak)

    return peaks

if __name__ == "__main__":
    print(findPeaks([1, 2, 3, 4, 5, 4, 3, 2, 1]))   # [5]
    print(findPeaks([1, 2, 1, 2, 1]))               # [2, 2]
    print(findPeaks([8, 1, 1, 1, 1, 1, 9]))         # [0, 6]
    print(findPeaks([1, 1, 1, 1, 1]))               # []
    print(findPeaks([1, 6, 6, 6, 1]))               # [6, 6, 6]

1 / 1 / 0

Регистрация: 16.10.2011

Сообщений: 45

1

Вывести все локальные максимумы массива

29.10.2011, 10:49. Показов 9103. Ответов 7


Студворк — интернет-сервис помощи студентам

Доброго времени суток !
Ребят, помогите набросать код

Вот задача: ввести длину массива и массив типа инт. Вывести все локальные максимумы (локальный максимум — это элемент массива, который имеет значение больше чем его правый и левый сосед)

Заранее спасибо !



0



amor1k

Студент

148 / 148 / 64

Регистрация: 18.01.2011

Сообщений: 469

29.10.2011, 10:58

2

правильно?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
using namespace std;
 
int main()
{
    setlocale(LC_ALL,"rus");
    int n;
    int * a;
    cin >> n;
    a = new int[n];
    for(int i = 0; i < n; i++)
    {
        cin >> a[i];
    }
    int max = a[0];
    for(int i = 1; i < n - 1; i++)
    {
        if(a[i] > a[i+1] && a[i] > a[i-1])
        {
            max = a[i];
            cout << "Локальные максимумы: " << max << endl;
        }
    }
}



0



1 / 1 / 0

Регистрация: 16.10.2011

Сообщений: 45

29.10.2011, 11:15

 [ТС]

3

Я уже набросал программу. Код такой же как у вас, но у вас ест ошибки.
Один только вопрос: мне нужно вести символы в массив, не могу вспомнить оператор ! getch(massiv) ??? А вывод вроде putch(massive) ? Это для библиотеки стдио



0



2554 / 1319 / 178

Регистрация: 09.05.2011

Сообщений: 3,086

Записей в блоге: 1

29.10.2011, 11:24

4



0



wind_mill

1 / 1 / 0

Регистрация: 16.10.2011

Сообщений: 45

29.10.2011, 15:37

 [ТС]

5

gets and puts из библиотеки стдио ?

Добавлено через 4 часа 11 минут
помогите найти ошибку !

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
#include <conio.h> //для getch()
void main ()
{
    int i; // переменная, которая задает размер массива
    printf("enter i:t");
    scanf("%d", &i);
    int m[i]; //сам массив
    printf("enter symbols:n");
    for(int a=0; a<=i; a++) //заполняем массив цыфрами
        scanf("%d", &m[a]);
    for(int j=1; j<i; j++) {    //проверка на локальный максимум
            if(m[j]>m[j-1] && m[j]>m[j+1])
                printf("local max = %dn", &m[j]);
        }
        getch();
        return 0;
}



0



mimicria

return (true);

1976 / 1111 / 221

Регистрация: 19.04.2011

Сообщений: 2,345

29.10.2011, 15:44

6

Цитата
Сообщение от wind_mill
Посмотреть сообщение

помогите найти ошибку !

Цитата
Сообщение от wind_mill
Посмотреть сообщение

int m[i]; //сам массив

Так массив объявлять нельзя, читайте про динамические массивы

Добавлено через 1 минуту
А тут еще и выход за границы массива

C++
1
for(int a=0; a<=i; a++)

Выше же была рабочая программа, правда на ++. Заменить ввод/вывод и new на malloc



0



1 / 1 / 0

Регистрация: 16.10.2011

Сообщений: 45

29.10.2011, 15:55

 [ТС]

7

очень жаль



0



anonimious

14 / 14 / 4

Регистрация: 17.10.2011

Сообщений: 54

29.10.2011, 15:56

8

Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <vector>
using namespace std;
void main(){
        setlocale(LC_ALL,"rus");
        int n; int * a;
        cin >> n; vector<int> mas;
        a = new int[n];
        for(int i = 0; i < n; i++) cin >> a[i];
        int max = a[0];
        for(int i = 1; i < n - 1; i++)
                if(a[i] > a[i+1] && a[i] > a[i-1])
                    mas.push_back(a[i]); 
        cout<<endl;
        for(int i=0;i<mas.size();i++)
            cout<<mas[i]; 
        delete []a; cout<<endl;}



0




This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters

Show hidden characters

Random massive = new Random();
const int massiveSize = 30;
int[] maximum = new int[massiveSize];
for (int i = 0; i < maximum.Length; i++)
{
maximum[i] = massive.Next(0, 1000);
Console.WriteLine(maximum[i]);
}
if (maximum[0] > maximum[1])
{
Console.WriteLine($»nЛокальный максимум первый элемент {maximum[0]}»);
}
if (maximum[maximum.Length — 1] > maximum[maximum.Length — 2])
{
Console.WriteLine($»nЛокальный максимум последний элемент {maximum[maximum.Length — 1]}»);
}
for (int i = 1; i < massiveSize — 1; ++i)
{
if (maximum[i — 1] < maximum[i] && maximum[i + 1] < maximum[i])
{
Console.WriteLine(«nСписок локальных максимумовt» + maximum[i]);
}
}

Нахождение локальных максимумов в одномерном массиве

Есть ли простой способ найти локальные максимумы в 1D-массиве?

Скажем, у меня есть массив:

[ 0,
  1,
  10, <- max
  8,  <- (ignore)
  3,
  0,
  0,
  4,
  6,  <- (ignore)
  10, <- max
  6,  <- (ignore)
  1,
  0,
  0,
  1,
  4,  <- max
  1,
  0 ]

Я хочу, чтобы он нашел 10 и 4, но игнорировал 8 и 6, так как они находятся рядом с 10 секундами. Математически вы могли бы найти, где производная равна нулю, если бы она была функцией. Я не слишком уверен, как это сделать в Javascript.

30 июль 2014, в 22:32

Поделиться

Источник

maxes = []
for (var i = 1; i < a.length - 1; ++i) {
    if (a[i-1] < a[i] && a[i] > a[i+1])
        maxes.push(a[i])
} 

tohava
30 июль 2014, в 21:30

Поделиться

Это вернет массив всех пиков (локальных максимумов) в данном массиве целых чисел, также заботясь о плато:

function findPeaks(arr) {
  var peak;
  return arr.reduce(function(peaks, val, i) {
    if (arr[i+1] > arr[i]) {
      peak = arr[i+1];
    } else if ((arr[i+1] < arr[i]) && (typeof peak === 'number')) {
      peaks.push(peak);
      peak = undefined;
    }
    return peaks;
  }, []);
}

findPeaks([1,3,2,5,3])   // -> [3, 5]
findPeaks([1,3,3,3,2])   // -> [3]
findPeaks([-1,0,0,-1,3]) // -> [0]
findPeaks([5,3,3,3,4])   // -> []

Обратите внимание, что первый и последний элементы массива не считаются пиками, потому что в контексте математической функции мы не знаем, что предшествует или следует за ними, и поэтому не может определить, являются ли они пиками или нет.

Alexander Makarenko
02 март 2017, в 21:46

Поделиться

Этот код обнаруживает локальные экстремумы (min и max, где первый вывод равен 0 и), даже если следующие элементы будут иметь равные значения (не уникальные экстремумы — т.е. 3 ‘выбирается из 1,1,1, 3,3,3,2,2,2)

var GoAsc  = false;      //ascending move
var GoDesc = false;      //descending move
var myInputArray = [];
var myExtremalsArray = [];
var firstDiff;

for (index = 0; index < (myArray.length - 1); index++) {
    //(myArray.length - 1) is because not to exceed array boundary, 
    //last array element does not have any follower to test it

  firstDiff = ( myArray[index] - myArray[index + 1] );

   if ( firstDiff > 0 )   { GoAsc  = true;  }
   if ( firstDiff < 0 )   { GoDesc = true;  }

   if ( GoAsc === true && GoDesc === true )  {  
        myExtremalsArray.push(myArray[index]);
        GoAsc  = false ;     
        GoDesc = false;     
        //if firstDiff > 0 ---> max
        //if firstDiff < 0 ---> min
      }

 }

user3473058
05 сен. 2014, в 09:32

Поделиться

Math.max выполняется для этого, но вместо массива он принимает ряд аргументов.

apply вызывает функцию с аргументами, переданными как массив.

Math.max.apply(null, array) делает трюк.

Joe Maffei
17 дек. 2017, в 18:26

Поделиться

Две ситуации: когда у вас есть пик, который является значением больше предыдущего и больше следующего, и плато, которое является значением, большим, чем предыдущее, и равно следующему (-ым), пока вы не найдете следующее другое значение, которое мне нужно меньше.

поэтому, когда вы нашли плато, временно создайте массив из этой позиции «до конца» и найдите следующее другое значение (Array.prototype. find возвращает первое значение, которое соответствует условию) и убедитесь, что оно меньше первого значения плато.

эта конкретная функция вернет индекс первого значения плато.

function pickPeaks(arr){
  return arr.reduce( (res, val, i, self) => {
    if(
      // a peak when the value is greater than the previous and greater than the next
      val > self[i - 1] && val > self[i + 1] 
      || 
      // a plateau when the value is greater than the previuos and equal to the next and from there the next different value is less
      val > self[i - 1] && val === self[i + 1] && self.slice(i).find( item =>  item !== val ) < val 
    ){
      res.pos.push(i);
      res.peaks.push(val);
    }
    return res;
  }, { pos:[],peaks:[] } );
}

console.log(pickPeaks([3,2,3,6,4,1,2,3,2,1,2,3])) //{pos:[3,7],peaks:[6,3]}
console.log(pickPeaks([-1, 0, -1])) //{pos:[1],peaks:[0]}
console.log(pickPeaks([1, 2, NaN, 3, 1])) //{pos:[],peaks:[]}
console.log(pickPeaks([1, 2, 2, 2, 1])) //{pos: [1], peaks: [2]} (plateau!)

Julian
29 май 2017, в 20:34

Поделиться

более декларативный подход:

const values = [3, 2, 3, 6, 4, 1, 2, 3, 2, 1, 2, 3];

const findPeaks = arr => arr.filter((el, index) => {
  return el > arr[index - 1] && el > arr[index + 1]
});
  
console.log(findPeaks(values)); // => [6, 3]

vitkon
23 дек. 2016, в 17:26

Поделиться

Как насчет простой итерации?

var indexes = [];
var values = [0,1,10,8,3,0,0,4,6,10,6,1,0,0,1,4,1,0];
for (var i=1; i<values.length-1; i++)
    if (values[i] > values[i-1] && values[i] > values[i+1])
        indexes.push(i);

barak manos
30 июль 2014, в 19:59

Поделиться

Ещё вопросы

  • 1Проблемы при построении временных рядов против пользовательских логинов?
  • 0как сообщить, что область видимости обновлена в angularjs?
  • 0Матричный шаблон C ++, неоднозначность между умножением матрицы на матрицу и числом матриц
  • 0Как вычесть месяцы из даты и справиться с переполнением?
  • 0Как прочитать значения 2D массива в php
  • 0Как я могу хранить отдельное изображение в отдельном поле с одним кодом PHP
  • 0PRE и поведение пробелов
  • 1Проблема задержки в нескольких графиках, SVG или HTML5 Canvas?
  • 0JQuery запускающее действие при загрузке страницы
  • 0Доступ к элементу за пределами цели
  • 1Хранимая процедура не выполняется ASP.NET C #
  • 1Питонический способ вставить запятую перед заглавными буквами [Regex] [duplicate]
  • 0Как добавить HTML вокруг строки?
  • 1Java: удаление компонента Runnable Canvas
  • 0Раскрывающийся список привязки в Angular JS, имеющий неправильное значение в опции
  • 1Вывод типа с интерфейсами
  • 0Разбить UL на несколько столбцов
  • 0Как экспортировать DataTable в Excel с выбранным столбцом
  • 0Скрипт запуска Drupal jQuery для .resize ()
  • 1Поднять событие, которое передает другое
  • 1расчет тепловой карты панд на море
  • 0Нужна функция для запуска при выборе опции в выпадающем списке
  • 0Как использовать jQuery и класс span?
  • 0Модуль AngularJS внутри «корневого модуля»
  • 0Лучше ли всегда проверять возвращаемое значение PDOStatement :: execute?
  • 1Удаление плохих пикселей с помощью массива dask
  • 1c # недопустимый символ в пути к файлу
  • 0Ошибка файла не найден при запуске программы в Visual Studio 2010
  • 1WebView не работает с net :: ERR_CACHE_READ_FAILURE
  • 0Значение stream_get_contents не является фактическим значением
  • 0как поставить данные в массив php из внешнего файла?
  • 1найти значение, соответствующее дате в пандах
  • 1Датагрид привязка МВВМ
  • 0Qt Сбой при двойном нажатии на элемент listWidget
  • 1Java-сервлеты: проверка XML на xsd
  • 1Сериализация объекта класса с неправильным XML
  • 0Нажмите кнопку, чтобы установить сортируемый элемент jQuery UI на первую позицию.
  • 0Передача функции шаблона другой функции, которая принимает аргумент typedef
  • 0Выберите, где значение может быть нулевым или нет
  • 0Нужно ли удалять этот объект? (если я не собираюсь когда-либо удаляться)
  • 0Прикрепление набора входных данных флажка к форме перед отправкой, а затем их скрытие
  • 0jQuery Dialog блокирует горячие клавиши Firefox
  • 0Неявное преобразование типов со ссылкой на void *
  • 0назначить адрес узлу * в списке ссылок?
  • 0Ошибки с изменением размеров листа свойств
  • 0Уникальный указатель в связанном списке
  • 0Выполнение запроса занимает более 40 секунд
  • 1Не удается загрузить модуль Rampart в клиентском проекте Axis2
  • 1В то время как цикл с объектами класса, сброс после
  • 0Получить значения из QDialog

Сообщество Overcoder

Понравилась статья? Поделить с друзьями:
  • Как найти хорошего отделочника
  • Как найти площадь одной клеточки тетради
  • Как найти документ на iphone
  • Как можно найти телефон через геолокацию
  • Как найти ширину окантовки