Как использовать 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 шт):
Поскольку другой ответ на самом деле считает неправильно (индексы неправильно берутся), привожу правильный вариант, с проверкой:
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:])
Можно убедиться, что оба варианта подсчёта дают [почти] одинаковый результат (+/- в последних знаках).
Эту задачу можно решить вызовом одной функции и без предварительного умножения векторов:
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