我有一个大的 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)来完成此任务?
发生这种情况有一些可能的原因,因为这些功能是解决您评论的问题的一种有效解决方案。如果存在,我会考虑创建另一个更有效的解决方案,但我不确定。
一个可能的解决方案是 从 32 位切换到 64 位 版本的 Python。
的确,32 位软件,如 32 位 CPU,最多可以提供 4 GB 的 RAM (2^32)。但是 64 位将提供 (2^64) 超过 4 GB,它可以提供近 9 GB。
您可以通过输入解释器查看您的版本。
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 版本匹配。