在 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
个堆栈。
我有一些 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
个堆栈。