循环遍历大型 numpy 整数数组时 Python 内存溢出,一次性转换

标签 python python-2.7 numpy

x 是形状 (45000,3,128,128) 图像像素值范围为 0-255 的 numpy 数组。

我想对 x 进行一次性编码,我尝试按以下方式进行:

#x.shape = (45000,3,128,128)
n_frames = x.shape[0]           # (45000)
flatdim  = np.prod(x.shape[1:]) # (49152)
x_flat   = x.reshape((n_frames,flatdim)) # shape=(45000,49152)

x_1h = np.zeros((n_frames,flatdim,256))

for s in xrange(n_frames):
    cur = x_flat[s] # current frame
    for i in xrange(flatdim):
        x_1h[s][i][cur[i]] = 1

x_1h 是一个稀疏矩阵,其中 x 中的每个像素值都由一个 (256,) 数组表示,像素值的对应索引中只有一个 1和其他地方的零。

也许有一种更 pythonic 的方法不需要内存缓存大量数组,但我不知道有更干净的方法,我需要像这样对数组进行编码。

不幸的是,负责此转换的 python 进程很快超出内存并被杀死。

总系统内存(物理):32.00 GB

谁能帮我编写执行我需要的编码的对内存更友好的代码?

编辑,为什么我要这种编码:

该数组将在链接器神经网络中用于图像预测。我不能在原始 x 上使用 softmax 交叉熵,因为 softmax 交叉熵需要概率分布和真值标签。这是我(也许是愚蠢的)尝试将连续实数数组转换为一种伪概率分布。因此,如果一个像素值被预测为 0.53122(约 135.4611),那么 xhat 中相应值的“分布”将在第 135(136)个位置为 0.5389,在第 134 个位置为 0.4611 (135) 位置。然后我将使用下一帧,将二进制编码作为真值标签。

最佳答案

如果您找到一种方法将中间结果存储在某处,您或许可以通过遍历值 (0-255) 来更有效地做到这一点。 大多数时候我是通过 pandas 而不是直接使用 numpy,所以这种语法可能不正确。对于 Python2,使用 xrange 而不是 range

max = 256
for i in range(max):
    x1_h_part = np.zeros((n_frames,flatdim), dtype='bool_')
    x1_h_part[x_flat==i] = 1
    #store x1_h_part

关于循环遍历大型 numpy 整数数组时 Python 内存溢出,一次性转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40883444/

相关文章:

python - python中用点均匀随机填充磁盘的方法

python - 在 linux 中执行 python 文件时权限被拒绝

python - 玩家与敌人碰撞的问题

python - 在 drawChessboardCorners 上使用排序函数时出现打印问题

python - WxPython - 清除事件队列和未决任务

Python scikit-learn - 类型错误

python - 使用 slider 编辑颜色值

python subprocess32 超时,溢出错误

python MySQL : error inserting data

python - Python 中的 all(map) 和 any(map) 输出 bool 值,但 IPython 中输出 true 映射对象