python.exe创建numpy数组时被压碎

2024-04-19 10:18:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图在x32机器上执行此代码

rows=100000
cols=1000

def create_matrix(rows,cols):
    data = (np.random.rand(rows,cols)*100).astype('uint8')
    return data

但是python.exe被压碎了,原因是什么?(我觉得不是x32内存限制?因为这样的阵列只需要~100 mb)。你知道吗


Tags: 代码机器datadefcreatenprandommatrix
1条回答
网友
1楼 · 发布于 2024-04-19 10:18:44

最终输出只需要大约100MB。但是,最终输出并不是您分配的唯一数组。你知道吗

np.random.rand(rows,cols)

这是一个由1亿个浮点64组成的数组,大约需要800MB。你知道吗

np.random.rand(rows,cols)*100

这是另一个由1亿个浮点64组成的阵列,也需要大约800MB。在计算时,此数组和前一个数组都必须保留在内存中,以获得大约1.6gb的峰值内存使用率,比您预期的高16倍。你知道吗

NumPy似乎没有提供直接生成随机uint8的方法。但是,您可以使用numpy.random.randint生成int32而不是float64s,并跳过临时分配,从而将此函数的峰值内存使用量减少到大约500 MB:

return np.random.randint(0, 100, (rows, cols)).astype('uint8')

如果仍然太高,您可以生成块中的随机数,并将它们分片分配到结果数组中,从而减少需要立即保留在内存中的临时Int32数:

data = np.zeros([rows, cols], dtype='uint8')
for chunk_start in xrange(0, rows, rows/10):
    data[chunk_start: chunk_start+rows/10] = (
            np.random.randint(0, 100, (rows/10, cols)))
return data

此版本的峰值内存使用量应为140 MB左右。你知道吗

相关问题 更多 >