2016-02-08 3 views
2

В реализации функции автокорреляции у меня есть термин, какКак красиво обрабатывать [: -0] нарезку?

for k in range(start,N): 
    c[k] = np.sum(f[:-k] * f[k:])/(N-k) 

Теперь все работает отлично, если start = 1, но я хотел бы, чтобы справиться с хорошо старт в 0 случае без условного.

Очевидно, что это не так, потому что f[:-0] == f[:0] и возвращает пустой массив, в то время как мне нужен полный массив в этом случае.

+1

Не 'numpy' уже есть функция автокорреляции? Или это просто «панды»? – DainDwarf

+0

Он имеет функцию корреляции, которую я мог бы использовать, но существуют разные определения автокорреляции, особенно в отношении знаменателя '(N-k) в этом члене. – pip

+0

Я думаю, что у панд есть автокорреляция, где вы можете использовать разные термины для знаменателя, но я не уверен. – DainDwarf

ответ

7

Не используйте отрицательные индексы в этом случае

f[:len(f)-k] 

k == 0 Для возвращает весь массив. Для любого другого положительного k это эквивалентно f[:-k]

0

Существует несколько способов сделать это, проверив, если k==0 перед применением формулы. Это зависит от вас, чтобы найти только тот, который выглядит лучше.

for k in range(start,N): 
    c[k] = np.sum(f[:-k] * f[k:])/(N-k) if k != 0 else np.sum(f * f[k:])/(N-k) 

for k in range(start,N): 
    end_in_list = -k if k != 0 else None 
    start_in_list = k 
    c[k] = np.sum(f[:end_in_list] * f[start_in_list:])/(N-k) 
2

Если к равен нулю использование Ни для среза, например, так:

for k in range(start,N): 
    c[k] = np.sum(f[:-k if k else None] * f[k:])/(N-k) 
+0

приятно знать о' None', но я вообще хотел избежать ветвления, думаю, что решение @Wombatz является самым чистым и быстрым. – pip

+0

Разница в скорости, вероятно, будет завалена другими частями вашей программы, поэтому используйте ту самую идиому, которую вы найдете наиболее читаемой. (В моих тестах разность скоростей составляет всего порядка десятков наносекунд). – RootTwo

+0

Вы правы, учитывая большие наборы данных, над которыми я работаю, я думал, что ненужное 'if' будет заметно, но я просто проверил, и на самом деле это не так. Вероятно, он оптимизирован. Тем не менее, я предпочитаю другое решение, дам +1 к твоему, как только я получу до 15 очков :) – pip

Смежные вопросы