我有两个矩阵。我在它们之间制作逐行的外部产品。我最初的目的是提高速度性能。我有样本的工作代码,但是当我想用(+2000,+2000)形状矩阵进行处理时,我得到了MemoryError
。
我试图将它们转换为稀疏,但这对于3D或einsum
(例如参见this comment)来说是不可能的。
有没有办法解决这个问题?
以下是样本矩阵:
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, :])