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

时间:2018-05-14 20:12:22

标签: python arrays numpy memory numexpr

我有两个相当大的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 个答案:

答案 0 :(得分:3)

假设您的意思是np.sum(arr1[..., None]*arr2, axis = 2)...代替:,那就是dot

arr3 = arr1.dot(arr2)

这应该比明确实现arr1[..., None]*arr2更有效,但我不确切知道它分配的中间产品。

您还可以使用einsum表达计算。同样,这应该比明确实现arr1[..., None]*arr2更有效,但我不确切知道它分配的内容。

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