Я столкнулся с проблемой памяти и скорости, используя NumPy, но моя проблема довольно проста.Как эффективно умножать список видов NumPy с соответствующими весами?
A
- большой массив NumPy изH * W
целых чисел.V
- это список, содержащийN
виды большого массиваA
, каждый вид, как то же(Hv, Wv)
форму.K
- еще один список, содержащийN
плавающие грузы, соответствующие представлениям.
Hv
являются Wv
почти равны H
и W
, но меньше. Поскольку NumPy views не являются копиями, это хорошо для управления памятью, даже если N
большой.
Теперь я хочу, чтобы вычислить новый массив, используя для вещания скорости: B = V * K + ... + V N * K N
Этот приведет к созданию нового взвешенного массива Hv * Wv
.
Проблема в том, что я не знаю, как выполнить такую операцию, не создавая промежуточные массивы в памяти (что и происходит, когда представление умножается на соответствующий вес) и при этом выигрывает от широковещательных операций.
import numpy as np
H = W = 1000
Hv = Wv = 900
N = 100
A = np.arange(H * W).reshape(H, W)
V = [A[i:Hv + i, i:Wv + i] for i in range(N)]
K = np.random.rand(N)
# It neither uses speed broadcast nor low memory!
B = sum(v*k for v, k in zip(V, K))
Может ли кто-нибудь помочь мне разумно использовать NumPy, пожалуйста?
Кажется, что 'A' удерживает вес? Таким образом, было бы разумнее использовать образец с случайными числами в нем, а не просто «одни», правильно? – Divakar
Разве вы не упростились с помощью: 'V = [A [: Hv:: Wv] для _ в диапазоне (N)]' как V [0], V [1] и т. Д. То же самое? – Divakar
@ Divakar Я думал, что этого достаточно, чтобы понять проблему, но это правда, что она не выглядит как настоящие данные.Я обновил свой вопрос массивом скользящих диагональных представлений, я надеюсь, что это лучше (но это работает, потому что 'N = H - Hv' и в противном случае приведет к ошибке). – Delgan