Подвижной петли с массивом точек данных


У меня есть массив NumPy около 2500 точек данных. Эта функция вызывается, по мере поступления которых 363 точек данных передаются одновременно.

def fcn(data):
    a = [data[i]/np.mean(data[i-2:i+1])-1 for i in range(len(data)-1, len(data)-362, -1)]
    return a

Это занимает около 5 секунд, чтобы убежать. Я думаю, что узким местом является список нарезки. Любые мысли о том, как ускорить этот процесс?



1305
2
задан 2 августа 2011 в 06:08 Источник Поделиться
Комментарии
2 ответа

диапазон возвращает список. Вы можете использовать xrange вместо.


range([start,] stop[, step]) -> list of integers


Возвращает список, содержащий арифметическую прогрессию чисел.

против


xrange([start,] stop[, step]) -> xrange object


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

Другое дело, что меня поражает, так это нарезать в аргумент НП.имею в виду. Срез всегда длины 3. Предполагаю, что это среднее арифметическое, вы могли бы превратить отдел в

(3.0 * data[i] / (data[i - 2] + data[i - 1] + data[i]))

Так что положить его вместе

def fcn(data):
return [(3.0 * data[i] / (data[i - 2] + data[i - 1] + data[i])) - 1
for i in xrange(len(data) - 1, len(data) - 362, -1)]

и вы могли бы оптимизировать суммой последних трех значений, признав, что если

x = a[n] + a[n+1] + a[n+2]

и ты уже вычислен

y = a[n - 1] + a[n] + a[n + 1]

тогда

x = y + (a[n - 1] - a[n + 2])

что помогает, если локальная переменная доступа и назначения быстрее, чем доступ к элементу в серии.

4
ответ дан 2 августа 2011 в 11:08 Источник Поделиться

При использовании библиотеки numpy, вы должны избегать написания циклов. Вместо этого вы должны делать операции на массив.

Нарезка в пакете numpy-это очень дешево, потому что это на самом деле не что-нибудь скопировать.

Самое сложное в устранении цикл прокатки НП.имею в виду(), но увидеть эту веб-страницу код, чтобы помочь устранить то, что: http://www.rigtorp.se/2011/01/01/rolling-statistics-numpy.html

2
ответ дан 3 августа 2011 в 12:08 Источник Поделиться