【问题标题】:How to normalize a large numpy array ? - MemoryError如何规范化大型 numpy 数组? - 内存错误
【发布时间】:2020-01-11 22:28:05
【问题描述】:

我有一个形状数组:(40000, 240, 320)
它是一个图像数组,我想将每个像素值标准化如下:

X = X/255

当我尝试运行上述语句时,它会抛出以下错误:

MemoryError: 无法分配形状为 (40000, 240, 320) 且数据类型为 float64 的数组

在这种情况下如何处理大型 numpy 数组?

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    您可以使用带除法的扩充赋值 (/=),这将在原地修改 X

    X /= 255
    

    您当前的代码尝试分配一个临时对象:

    X = X/255
    
    # Is actually executed like:
    tmp = X / 255  # new object!
    X = tmp
    

    【讨论】:

    • 虽然是in-place操作,但不是创建40000*320*240 float64数组吗?
    • @xanjay,如果X 已经是浮点数和形状40000*320*240 的数组,则不会分配新数组。如果X 是一个整数数组,则将分配一个新的浮点数组(X 指向的对象将被该新数组替换),因为/ 执行“真除法”并始终返回浮点数
    • 以前是 unit8 dtype,现在是 float64。即大小为 3GB 的数组变为 24 GB。有什么方法可以将其就地转换为 float32 dtype 吗?
    • 您可以通过除以float32:X / np.float32(255) 使结果对象成为float32 的数组,但由于原始数组的类型为np.uint8,因此新数组将是生成(和一个释放)。您也可以除以np.float16(255),这将进一步减少所需的内存量,但精度也会急剧下降。
    猜你喜欢
    • 2017-07-16
    • 1970-01-01
    • 1970-01-01
    • 2012-02-12
    • 2016-05-16
    • 2015-06-22
    • 1970-01-01
    • 2017-11-03
    • 2020-01-25
    相关资源
    最近更新 更多