我有一些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()
具有相同的结果。我做错了什么?
答案 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
堆栈一起正常工作。