Numpy中按行外部产品的MemoryError

时间:2018-10-30 18:18:09

标签: python numpy out-of-memory sparse-matrix matrix-multiplication

我有两个矩阵。我在它们之间制作逐行的外部产品。我最初的目的是提高速度性能。我有样本的工作代码,但是当我想用(+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, :])

0 个答案:

没有答案