Как использовать numpy.sum для вычисления суммы произведений списка?

Допустим, есть список. В цикле for с количеством итераций равным длине списка минус m, где m равно к примеру 20, а длина списка 80, я могу вычислить сумму произведений X[i]*X[i+m], где X - идентификатор списка, i - переменная счётчик, в списке хранятся значения типа float.

То есть, например:

for i in range(len(X)-m):
    res = res + X[i]*X[i+m] 

Как с помощью numpy.sum() можно решить эту задачу?


Ответы (3 шт):

Автор решения: MarianD

Используйте срезы:

np.sum(X[:len(X) - m] * X[m:])
→ Ссылка
Автор решения: CrazyElf

Поскольку другой ответ на самом деле считает неправильно (индексы неправильно берутся), привожу правильный вариант, с проверкой:

import numpy as np

n = 80
m = 20
X = np.random.rand(n)
res = 0

for i in range(len(X)-m):
    res = res + X[i]*X[i+m] 
print(res)

print(np.sum(np.multiply(X[:-m], X[m:])))
# или тоже самое np.sum(X[:-m] * X[m:])

Можно убедиться, что оба варианта подсчёта дают [почти] одинаковый результат (+/- в последних знаках).

→ Ссылка
Автор решения: MaxU

Эту задачу можно решить вызовом одной функции и без предварительного умножения векторов:

res = np.dot(X[:-m], X[m:])

проверка:

In [40]: np.dot(X[:-m], X[m:])
Out[40]: 16.34584647089808

In [41]: np.sum(np.multiply(X[:-m], X[m:]))
Out[41]: 16.34584647089808

In [42]: np.sum(X[:len(X)-m] * X[m:])
Out[42]: 16.34584647089808
→ Ссылка