首页 > 解决方案 > Numpy中逐行外部产品的MemoryError

问题描述

我有两个矩阵。我在它们之间制作逐行的外部产品。我最初的目标是提高速度表现。我有关于样本的工作代码,但是当我想用 (+2000, +2000) 形状矩阵做它们时,我得到了MemoryError

我试图将它们转换为稀疏的,但这对于 3D 或 with 是不可能的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, :])

标签: pythonnumpyout-of-memorysparse-matrixmatrix-multiplication

解决方案


推荐阅读