内存分配错误将零连接到数组

问题描述 投票:0回答:1

我有一个大的 2D numpy 数组,每个子数组的长度不同,例如:

[[1,2],[3,4,5,6],[7,8,9]]

我想在每个小于最大子数组的末尾添加零,例如:

[[1,2,0,0],[3,4,5,6],[7,8,9,0]]

为此,我创建了以下函数来完成数组

def add_zeroes(arr, limit):
    if len(arr)<limit:
        return np.concatenate([arr, np.zeros(limit-len(arr))])
    else:
        return arr

但是当我将它应用到我的数组(包含 60578 个子数组的列表)时,我得到了内存错误:

MemoryError: Unable to allocate 8.59 MiB for an array with shape (1126400,) and data type float64

我在 Core i7 Windows 11 上运行,内存为 16Gb。

是否有绕过方法(也更像 pythonic)来完成此任务?

python numpy out-of-memory numpy-ndarray
1个回答
0
投票

答案介绍

发生这种情况有一些可能的原因,因为这些功能是解决您评论的问题的一种有效解决方案。如果存在,我会考虑创建另一个更有效的解决方案,但我不确定。

可能的解决方案 1

一个可能的解决方案是 从 32 位切换到 64 位 版本的 Python。

的确,32 位软件,如 32 位 CPU,最多可以提供 4 GB 的 RAM (2^32)。但是 64 位将提供 (2^64) 超过 4 GB,它可以提供近 9 GB。

检查 Python 版本的方法

您可以通过输入解释器查看您的版本。

64 位版本示例为:Python 3.10.1rc1 (tags/v3.10.1rc1:4082f600a5, Jan 1 2023, 16:18:15) [MSC v.1916 64 位 (AMD64)],其中 [ MSC v.1916 64 位 (AMD64)] 表示“64 位 Python”。

在 Windows 中检查版本的另一种方法是在

cmd
中执行下一个命令

python -c "import sys;print(\"%x\" % sys.maxsize, sys.maxsize > 2**32)"

python -c "import sys;print(\"%x\" % sys.maxsize, sys.maxsize > 2**64)"

如果响应是

true
意味着该位数与您的 python 版本匹配。

© www.soinside.com 2019 - 2024. All rights reserved.