连接RAM中的大型numpy数组

时间:2015-07-07 14:09:58

标签: python arrays numpy ram scikit-image

我有一些3D图像数据,想要从单通道堆栈中构建一堆RGB图像,即我尝试将三个形状(358, 1379, 1042)数组连接成一个形状(358, 1379, 1042, 3)的数组。灵感来自skimage.color.gray2rgb我试过

np.concatenate((
    stack1[..., np.newaxis], 
    stack2[..., np.newaxis], 
    stack3[..., np.newaxis]), axis=-1)

然而,即使这些堆栈中的每一个只有大约1GiB,这也会立即填满我的空~12GiB RAM ...所以我试着预先分配一个最终形状的数组,然后用堆栈填充它,比如

rgb_stack = np.zeros(stack1.shape + (3,))
rgb_stack[:,:,:,0] = stack1

一旦我执行第二行,它也耗尽了我的RAM。最后,我尝试通过

明确地将数据从stack1复制到rgb_stack
rgb_stack = np.zeros(stack1.shape + (3,))
rgb_stack[:,:,:,0] = stack1.copy()

具有相同的结果。我做错了什么?

1 个答案:

答案 0 :(得分:0)

总结从问题的评论中可以学到的东西; np.zeros创建一个float64的数组,几乎是12GiB。这本身并不像Linux提交那样填充RAM,只在数组被填充后才设置相应的RAM,在这种情况下,一旦填满了图像数据。

因此,将zeros创建为另一个dtype可以解决问题,例如

rgb_stack = np.zeros(stack1.shape + (3,), dtype=np.uint16)
rgb_stack[:,:,:,0] = stack1.copy()

uint16堆栈一起正常工作。