在 RAM 中连接大型 numpy 数组

Concatenate large numpy arrays in RAM

我有一些 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()

同样的结果。我做错了什么?

总结从问题的评论中可以学到的东西; np.zeros 创建一个 float64 的数组,几乎有 12GiB 大。这本身不会填充 RAM,因为 Linux 过度提交,并且只会在数组被填充后将相应的 RAM 放在一边,在这种情况下,一旦它被图像数据填充。

因此创建 zeros 作为另一个 dtype 解决了问题,例如

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

适用于 uint16 个堆栈。