Как найти точечное произведение больших матриц (но результат будет среднего размера) быстрее в Python? - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть матрица размером 500 на 40К A и вектор с размером элемента 40К q в виде массивов numpy. По оценкам, для вычисления точечного произведения из них на A.dot(q) потребуется 16 минут. Поскольку есть 50K q, с которыми мне нужно выполнить это вычисление (а это много), я хотел бы максимально сократить время вычислений.

Более эффективные и эффективные способы вычисления точки произведение A и q или лучше A и Q = [q1, ..., qn]? Сципи , кажется, предлагает решение в этом , но я не совсем понимаю, как мне подходить к моей проблеме здесь. Кто-нибудь может мне здесь помочь?

from time import process_time
t1 = process_time()
A[0,:].dot(q)
t2 = process_time()
print("Estimated Total Time:", (t2-t1)*A.shape[0]/60)

Ответы [ 2 ]

1 голос
/ 30 апреля 2020

Вот пример того, что вы можете сделать:

Q = np.hstack((q1, q2, q3, q4, ...))
B = np.dot(A, Q)

на выходе, столбец i из B (B[:,i]) является произведением A и q_i , Это должно быть довольно быстро, даже для ваших необходимых размеров массива. Как вы упомянули, это может даже не занять столько времени, сколько минут.

0 голосов
/ 30 апреля 2020

Если у вас достаточно памяти для хранения A и всех векторов q, вычисление этих продуктов не займет 16 минут, если вы поместите все векторы q в массив Q и вызовете A.dot(Q).

Это на ноутбуке с 2,6 ГГц Intel Core i7 и 16 ГБ памяти. Я использую интерактивную Python оболочку ipython:

In [1]: import numpy as np

In [2]: rng = np.random.default_rng()

In [3]: A = rng.normal(size=(500, 40_000)).astype(np.float32)

In [4]: Q = np.ones((40_000, 50_000), dtype=np.float32)

In [5]: %timeit A.dot(Q)
7.79 s ± 235 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

Это меньше 8 секунд - довольно далеко от 16 минут!

Если вы не имеет достаточно памяти, это может занять гораздо больше времени, так как ОС может начать выгружать память на диск.

...