【发布时间】:2018-05-14 20:12:22
【问题描述】:
我有两个相当大的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,1,3580,50) 广播 (40,40,3580,1),生成 (40,40,3580,50) 数组。然后你会总结,减少到(40,40,50)。但是你仍然必须有足够的中间值。您可以尝试迭代大小为 50 的维度。一个大任务的 50 次循环在时间上应该是可以的。
-
这个临时数组很大,但应该是 2GB 大,而不是
MemoryError大。除非您的 dtype 是object(在这种情况下:不要那样做),或者您使用的是 32 位 Python (dittp),或者您使用的是嵌入式平台(好吧,这是个问题)。它仍然值得尝试优化,但也值得尝试弄清楚您是如何耗尽内存的。 -
那种好像就是
dot。 -
arr1[:, None]*arr2实际上不起作用。你的意思是arr1[..., None]*arr2? -
@user2357112 是的,它是
arr1[..., None]*arr2。
标签: python arrays numpy memory numexpr