代码之家  ›  专栏  ›  技术社区  ›  konstant

在这种情况下,绕过“MemoryError”的最佳方法是什么?

  •  1
  • konstant  · 技术社区  · 8 年前

    我有两个 numpy 相当大的数组。首先是 arr1 大小 (40, 40, 3580) 其次是 arr2 大小 (3580, 50) .我想要实现的是

    arr_final = np.sum(arr1[..., None]*arr2, axis = 2)
    

    这样的大小 arr_final 只是 (40, 40, 50) .然而,在执行上述操作时,python可能会缓存内部数组操作,因此我不断得到内存错误。是否有任何方法可以避免内部缓存而只得到最终结果?我已经看过了 numexpr ,但我不知道如何才能实现 arr1[..., None]*arr2 ,然后 sum 结束 axis=2 在里面 numexpr 。如有任何帮助或建议,将不胜感激。

    1 回复  |  直到 8 年前
        1
  •  3
  •   user2357112    8 年前

    假设你的意思是 np.sum(arr1[..., None]*arr2, axis = 2) ,带有 ... 而不是 : ,那么 dot :

    arr3 = arr1.dot(arr2)
    

    这应该比显式具体化更有效 arr1[..., None]*arr2 ,但我不知道它到底分配了什么中间产物。

    您还可以使用 einsum 。同样,这应该比显式具体化更有效 arr1[…,无]*arr2 ,但我不知道它到底分配了什么。

    arr3 = numpy.einsum('ijk,kl', arr1, arr2)