【发布时间】:2020-01-11 22:28:05
【问题描述】:
我有一个形状数组:(40000, 240, 320)
它是一个图像数组,我想将每个像素值标准化如下:
X = X/255
当我尝试运行上述语句时,它会抛出以下错误:
MemoryError: 无法分配形状为 (40000, 240, 320) 且数据类型为 float64 的数组
在这种情况下如何处理大型 numpy 数组?
【问题讨论】:
我有一个形状数组:(40000, 240, 320)
它是一个图像数组,我想将每个像素值标准化如下:
X = X/255
当我尝试运行上述语句时,它会抛出以下错误:
MemoryError: 无法分配形状为 (40000, 240, 320) 且数据类型为 float64 的数组
在这种情况下如何处理大型 numpy 数组?
【问题讨论】:
您可以使用带除法的扩充赋值 (/=),这将在原地修改 X:
X /= 255
您当前的代码尝试分配一个临时对象:
X = X/255
# Is actually executed like:
tmp = X / 255 # new object!
X = tmp
【讨论】:
X 已经是浮点数和形状40000*320*240 的数组,则不会分配新数组。如果X 是一个整数数组,则将分配一个新的浮点数组(X 指向的对象将被该新数组替换),因为/ 执行“真除法”并始终返回浮点数
float32:X / np.float32(255) 使结果对象成为float32 的数组,但由于原始数组的类型为np.uint8,因此新数组将是生成(和一个释放)。您也可以除以np.float16(255),这将进一步减少所需的内存量,但精度也会急剧下降。