У меня есть две матрицы. Я делаю построчную внешнюю продукцию между ними. Моей первоначальной целью было повысить быстродействие. У меня есть рабочий код на образцах, но когда я хочу сделать их с (+2000, +2000) матрицами форм, я получаю MemoryError
.
Я пытался преобразовать их в разреженные, но это невозможно для 3D или с einsum
(см., Например, этот комментарий ).
Есть ли способ решить эту проблему?
Вот примерные матрицы:
A
Out[10]:
array([[1, 1, 1, 1],
[0, 0, 1, 1],
[1, 1, 0, 0],
[1, 0, 0, 0],
[0, 1, 0, 0],
[0, 0, 1, 0],
[0, 0, 0, 1]])
B
Out[11]:
array([[0.25, 0. , 0.5 , 1. , 0. , 0. , 0. ],
[0.25, 0. , 0.5 , 0. , 1. , 0. , 0. ],
[0.25, 0.5 , 0. , 0. , 0. , 1. , 0. ],
[0.25, 0.5 , 0. , 0. , 0. , 0. , 1. ]])
А вот пример выполнения продукта:
A[:, :, None] * B.T[:, None, :]
Out[12]:
array([[[0.25, 0.25, 0.25, 0.25],
[0.25, 0.25, 0.25, 0.25],
[0.25, 0.25, 0.25, 0.25],
[0.25, 0.25, 0.25, 0.25]],
[[0. , 0. , 0. , 0. ],
[0. , 0. , 0. , 0. ],
[0. , 0. , 0.5 , 0.5 ],
[0. , 0. , 0.5 , 0.5 ]],
[[0.5 , 0.5 , 0. , 0. ],
[0.5 , 0.5 , 0. , 0. ],
[0. , 0. , 0. , 0. ],
[0. , 0. , 0. , 0. ]],
[[1. , 0. , 0. , 0. ],
[0. , 0. , 0. , 0. ],
[0. , 0. , 0. , 0. ],
[0. , 0. , 0. , 0. ]],
[[0. , 0. , 0. , 0. ],
[0. , 1. , 0. , 0. ],
[0. , 0. , 0. , 0. ],
[0. , 0. , 0. , 0. ]],
[[0. , 0. , 0. , 0. ],
[0. , 0. , 0. , 0. ],
[0. , 0. , 1. , 0. ],
[0. , 0. , 0. , 0. ]],
[[0. , 0. , 0. , 0. ],
[0. , 0. , 0. , 0. ],
[0. , 0. , 0. , 0. ],
[0. , 0. , 0. , 1. ]]])
Я также пытался сделать продукт следующими способами, с тем же результатом:
np.einsum('ij, ik -> ikj', A, B.T)
и
np.matmul(A[:, :, None], B.T[:, None, :])