Для задачи анализа данных я хочу найти пересечения нулей в массиве numpy, полученном в результате свертки с сначала подобным ядру ядром, а затем с ядром мексиканской шляпы.Пересечение нуля позволяет мне обнаруживать границы в данных.
К сожалению, данные немного шумят, и я хочу найти только пересечения нуля с минимальным размером скачка, 20
в следующем примере:
import numpy as np
arr = np.array([12, 15, 9, 8, -1, 1, -12, -10, 10])
Должно привести к
>>>array([1, 3, 7])
или
>>>array([3, 7])
, где 3
- индекс -1
, непосредственно перед серединой первого прыжка и 7
это индекс -10
Я попытался изменить следующий код (источник: Эффективно обнаруживать изменения знака в python )
zero_crossings = np.where(np.diff(np.sign(np.trunc(arr/10))))[0]
Какиеправильно игнорирует небольшие скачки, но ставит пересечения нуля на [1,5,7]
Какой эффективный способ сделать это?
Определение минимального прыжка не является строгим, но результаты должны соответствовать моему вопросу.
Редактировать: Для уточнения
arr = np.array([12, 15, 9, 8, -1, 1, -12, -10, 10])
arr_floored = np.trunc(arr/10)
>>>>np.array([10, 10, 0, 0, 0, 0, -10, -10, 10])
sgn = np.sign(arr_floored)
>>>>array([ 1, 1, 0, 0, 0, 0, -1, -1, 1])
dsgn = np.diff(sgn)
>>>>array([ 0, -1, 0, 0, 0, -1, 0, 2])
np.where(dsgn)
>>>>(array([1, 5, 7], dtype=int64),)
Другие случаи:
arr = [10,9,8,7,6,5,4,3,2,1,0,-1,-2,-3,-4,-5,-6,-7,-8,-9,-10]
Должно привести к
>>> np.array([10])
Также только что заметил: проблема может быть некорректной (в математическом смысле).Я уточню это позже сегодня.