Numpy数组:如何在不复制数组的情况下撤消零填充?

2024-09-30 06:21:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在深入学习3D图像分割。基本上,我需要1/填充一个numpy数组,2/处理数组,3/取消填充数组

dataArray = np.pad(dataArray, 25, mode='constant', constant_values=0) # pad
processedArray = my_process(dataArray) # process
processedArray = processedArray[25:-25, 25:-25, 25:-25, :] # unpad

问题是,processedArray非常大(464928928928,10),在执行取消添加时内存不足。我想,新的内存分配?我说得对吗?我如何才能继续,以便不分配新内存?换句话说,索引指向未添加的元素,而不复制元素

可能有帮助的信息:上述行在函数中执行,并返回processedArray


Tags: 内存图像numpy元素modemynp数组
2条回答

可能是内存不足,因为一旦使用此数组调用函数,就会在函数内部创建一个副本,使内存加倍。所以,不要创建额外的数组

您可以保留阵列的全局副本。只需在全局数组上应用这些操作,而无需创建额外副本

import gc

global processedArray # before all your assignment starts

在我的_进程内()

def my_process():
   global processedArray
   # do all operations on processedArray
global processedArray
processedArray = np.pad(dataArray, 25, mode='constant', constant_values=0) # pad
my_process()

del dataArray() # delete not needed arrays to make more space
gc.collect()

global processedArray
processedArray = processedArray[25:-25, 25:-25, 25:-25, :] # unpad

但是,如果my_进程调用更多的库函数来复制processedArray,那么内存仍然会耗尽。尝试在全局数组上应用所有操作,而不进行任何复制

内存问题的一个可能解决方案是使用short而不是float作为numpy数据类型。你可以试试这个

dataArray = np.pad(dataArray, 25, mode='constant', constant_values=0) # pad
processedArray = my_process(dataArray).astype(np.short) # process
processedArray = processedArray[25:-25, 25:-25, 25:-25, :] # unpad
processedArray = processedArray.astype(np.float32) #Converting to float type again

或者,您可以删除dataArray,为processedArray创建空间

dataArray = np.pad(dataArray, 25, mode='constant', constant_values=0) # pad
del dataArray #deleting dataArray to claim memory
processedArray = my_process(dataArray) # process
processedArray = processedArray[25:-25, 25:-25, 25:-25, :] # unpad

相关问题 更多 >

    热门问题