У меня есть два больших вектора (одинаковой длины), для которых я вычисляю точечный продукт скользящего окна:
import numpy as np
a = np.array([1, 2, 3, 4, 5, 6])
b = np.array([11, 22, 33, 44, 55, 66])
out = np.array(
[[a[0]*b[0]+a[1]*b[1]+a[2]*b[2]],
[a[1]*b[1]+a[2]*b[2]+a[3]*b[3]],
[a[2]*b[2]+a[3]*b[3]+a[4]*b[4]],
[a[3]*b[3]+a[4]*b[4]+a[5]*b[5]],
])
[[154]
[319]
[550]
[847]]
Конечно, я могу вызвать функцию скалярного произведения, но если длина окна / вектора велика, она не так эффективна, как следующий код:
window = 3
result = np.empty([4,1])
result[0] = a[0]*b[0]+a[1]*b[1]+a[2]*b[2]
for i in range(3):
result[i+1] = result[i]-a[i]*b[i]+a[i+window]*b[i+window]
[[154]
[319]
[550]
[847]]
Здесь мы используем тот факт, что скалярное произведение i+1th
аналогично скалярному произведению ith
. То есть,
result[i+1] = result[i]-a[i]*b[i]+a[i+window]*b[i+window]
Как я могу преобразовать мой цикл for в векторизованную функцию, чтобы вычисления могли использовать информацию из шага ith
, чтобы уменьшить вычислительную избыточность при минимизации необходимого объема памяти.
ОБНОВЛЕНИЕ
Мне действительно понадобились:
import numpy as np
a = np.array([1, 2, 3, 4, 5, 6])
b = np.array([11, 22, 33, 44, 55, 66, 77, 88])
out = np.array(
[a[0]*b[0]+a[1]*b[1]+a[2]*b[2]+a[3]*b[3]]+a[4]*b[4]]+a[5]*b[5],
a[0]*b[1]+a[1]*b[2]+a[2]*b[3]+a[3]*b[4]]+a[4]*b[5]]+a[5]*b[6],
a[0]*b[2]+a[1]*b[3]+a[2]*b[4]+a[3]*b[5]]+a[4]*b[6]]+a[5]*b[7],
])
[1001
1232
1463]
Таким образом, a
будет перемещаться по b
, и будут вычислены скалярные произведения.