Скользящая сумма по массиву в Python - PullRequest
0 голосов
/ 10 октября 2018

Мне дан массив X, и меня просят вернуть другой массив Y, где y [t] = x [t] + x [t-1] и y [0] = 0 без использования цикла for в Python.

Я могу подумать об использовании скользящей суммы, но я не уверен, является ли это самым быстрым способом, поскольку мне нужно преобразовать x в массив данных / серию для перехода к работе.Есть ли более быстрый способ сделать это?Спасибо!

df = pd.DataFrame(X).rename(columns={0: 'X'})
df['Y'] = df['X'].rolling(2).sum().fillna(0)
Y = df['Y'].values

Ответы [ 3 ]

0 голосов
/ 10 октября 2018

В случае, если вы ищете однострочник, он может не дать наилучших результатов

from toolz.itertoolz import sliding_window
[0]+map(sum,list(sliding_window(2, [1, 2, 3, 4]))) # [0, 3, 5, 7]
0 голосов
/ 10 октября 2018

Ну, вы можете использовать numpy, хотя это все равно превращает список в массив.

y = x + np.roll(x, 1)
y[0] = 0    

Это быстро, коротко, довольно прозрачно и не использует (явно) for loop.

Вы также можете использовать map, что почти совпадает с пониманием списка и не требует никаких внешних библиотек.

y = 0 + map(lambda (a, b): a+b, zip(x, x[1:]))

В Python3 это не такт, и вместо этого вам нужно будет написать:

y = [0] + list(map(lambda a: a[0]+a[1], zip(x, x[1:])))

или

y = [0] + list(map(sum, zip(x, x[1:])))
0 голосов
/ 10 октября 2018

Вы можете использовать понимание списка и zip :

x = [1, 2, 3, 4]
y = [0] + [c + n for c, n in zip(x, x[1:])]
print(y)

Вывод

[0, 3, 5, 7]

Этот подход основан на встроенномфункций, поэтому нет необходимости импортировать внешний модуль, такой как pandas.

...