【问题标题】:Numpy array: how to undo zero-padding without copying array?Numpy数组:如何在不复制数组的情况下撤消零填充?
【发布时间】:2020-07-15 15:54:44
【问题描述】:

我正在使用深度学习进行 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 非常大(464,928,928,928,10),我在执行 unpadding 时遇到内存不足。我想unpadding分配新内存?我对吗?我该如何继续,以便没有分配新的内存?换句话说,让 index 指向未填充的元素,而不复制元素?

可能有帮助的信息:以上行在函数中执行,并返回处理数组

【问题讨论】:

  • 如果它是一个函数,那么它已经是一个副本。

标签: python numpy zero-padding


【解决方案1】:

也许你的内存用完了,因为一旦你用这个数组调用函数,就会在函数内部创建一个副本,这会使你的内存加倍。所以,不要创建额外的数组。

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

import gc

global processedArray # before all your assignment starts

在 my_process() 中

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_process 调用更多的库函数来复制处理数组,你仍然会耗尽内存。尝试在全局数组上应用每个操作而不进行任何复制。

【讨论】:

    【解决方案2】:

    内存问题的一个可能解决方案是使用 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
    

    【讨论】:

      猜你喜欢
      • 2020-06-06
      • 2016-11-06
      • 1970-01-01
      • 2023-03-16
      • 2018-10-05
      • 2017-10-24
      • 2016-06-15
      • 1970-01-01
      • 2021-10-07
      相关资源
      最近更新 更多