Мне нужно «сжать» размер массивов python, которые представляют сигналы. Сигналы выглядят следующим образом.Сжатие сигнала
signal = [
[0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0,1.1], #time values
[1,1,1,2,3,4,4,4,4,2,1,1] #function values
]
После сжатия сигнал должен выглядеть в следующем коде.
signal_compressed = [
[0.0,0.2,0.3,0.4,0.5,0.8,0.9,1.0,1.1], #time values
[1,1,2,3,4,4,2,1,1] #function values
]
Вы видите, если есть области с постоянными значениями, только первое и последнее значение этой области сохраняется.
Я написал следующий алгоритм для этого.
signal_compressed = [[],[]]
old_value = None
for index, value in enumerate(signal[1]):
if value != old_value:
if index > 0:
if signal_compressed[0][-1] != signal[0][index - 1]:
signal_compressed[0].append(signal[0][index - 1])
signal_compressed[1].append(signal[1][index - 1])
signal_compressed[0].append(signal[0][index])
signal_compressed[1].append(value)
old_value = value
if signal_compressed[0][-1] < signal[0][-1]:
signal_compressed[0].append(signal[0][-1])
signal_compressed[1].append(signal[1][-1])
Этот алгоритм отлично работает. А для сигналов с множеством постоянных сегментов он работает довольно быстро. Но если я пытаюсь сжать сигналы без постоянных сегментов (например, синусоидального сигнала или шумового сигнала), алгоритм работает очень медленно.
Как ускорить мой алгоритм и сохранить функциональность?
Спасибо за ваш ответ. Я пробовал свой алгоритм и сравнивал его с моим. Для коротких сигналов ваш алгоритм работает быстрее. Но для больших входов он медленнее, чем у меня. Не могли бы вы, пожалуйста, объяснить решение с помощью «NumPy» более подробно? – wewa
@wewa: Я добавил схему одного такого решения, в котором нет петель Python. – NPE
Я также пробовал этот новый алгоритм с 'NumPy'. Это немного быстрее, чем мое. Но только если вы не преобразуете numpyarrays обратно в списки. Есть ли другая возможность сжать мои данные? – wewa