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()
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()
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 |
|||
правильно?
0 |
1 / 1 / 0 Регистрация: 16.10.2011 Сообщений: 45 |
|
29.10.2011, 11:15 [ТС] |
3 |
Я уже набросал программу. Код такой же как у вас, но у вас ест ошибки.
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 минут
0 |
mimicria return (true); 1976 / 1111 / 221 Регистрация: 19.04.2011 Сообщений: 2,345 |
||||
29.10.2011, 15:44 |
6 |
|||
помогите найти ошибку !
int m[i]; //сам массив Так массив объявлять нельзя, читайте про динамические массивы Добавлено через 1 минуту
Выше же была рабочая программа, правда на ++. Заменить ввод/вывод и 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 |
|||
Решение
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
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