在大型整数数组上循环时Python内存溢出,一次热转换

在大型整数数组上循环时Python内存溢出,一次热转换,python,python-2.7,numpy,Python,Python 2.7,Numpy,x是形状(45000,3128128)numpy图像像素值数组,范围为0-255 我想对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.

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

我想对
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,其他地方为零

也许有一种更具python风格的方法可以做到这一点,它不需要对大量数组进行内存缓存,但我不知道有一种更干净的方法,我需要像这样对数组进行编码

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

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

有没有人能帮我编写一些内存友好的代码来执行我需要的编码

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


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

如果您找到一种方法将中间结果存储在某个地方,您可能可以通过迭代值(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

还要提到由于运行此阵列而占用的总内存以及系统上的总ram。您打算如何使用此阵列?使用
sklearn
?还是其他的包裹?添加相关标记。初始数组的数据类型是什么?通过选择能够存储0-255的最小数据类型(
uint8
?),您可以减少所使用的内存。而且,您的x\u1h可以是一个数据类型数组
bool\u1h
45000*49152*256
是527“gigs”,因此,即使每个单元使用一位,也需要66 GB的内存。这可能是不合理的。所以你应该告诉我们你为什么要这么做。