gpt4 book ai didi

python - 处理大型 Numpy 数组的技术?

转载 作者:IT老高 更新时间:2023-10-28 20:45:06 24 4
gpt4 key购买 nike

有时您必须对一个或多个大型 Numpy 数组执行许多中间操作。这会很快导致 MemoryErrors。到目前为止,在我的研究中,我发现 Pickling(Pickle、CPickle、Pytables 等)和 gc.collect() 是缓解这种情况的方法。我想知道有经验的程序员在处理大量数据时是否还有其他技术(当然,除了删除策略/代码中的冗余)。

另外,如果有一点我可以肯定,那就是没有什么是免费的。使用其中一些技术,有哪些权衡(即速度、鲁棒性等)?

最佳答案

我感受到了你的痛苦……你有时最终会存储数倍于数组大小的值,这些值稍后将被丢弃。一次处理数组中的一项时,这无关紧要,但在矢量化时可能会杀死您。

我将使用工作中的一个示例来进行说明。我最近编写了描述的算法here使用 numpy。它是一种颜色映射算法,它采用 RGB 图像,并将其转换为 CMYK 图像。对每个像素重复的过程如下:

  1. 使用每个 RGB 值的最高有效 4 位作为 3D 查找表的索引。这将确定 LUT 中立方体的 8 个顶点的 CMYK 值。
  2. 根据上一步的顶点值,使用每个 RGB 值的最低有效 4 位在该立方体内进行插值。最有效的方法需要计算 16 个 uint8 数组,其大小与正在处理的图像的大小相同。对于 24 位 RGB 图像,相当于需要存储图像的 6 倍来处理它。

你可以做几件事来处理这个问题:

1。分而治之

也许您无法一次处理 1,000x1,000 数组。但是,如果您可以使用 python for 循环遍历 10 个 100x1,000 的数组,它仍然会以非常大的优势击败超过 1,000,000 个项目的 python 迭代器!它会变慢,是的,但不会那么慢。

2。缓存昂贵的计算

这与我上面的插值示例直接相关,虽然值得留意,但更难发现。因为我在一个每个维度有 4 位的三维立方体上进行插值,所以只有 16x16x16 个可能的结果,可以存储在 16 个 16x16x16 字节的数组中。所以我可以预先计算它们并使用 64KB 的内存存储它们,并为整个图像逐个查找值,而不是以巨大的内存成本为每个像素重做相同的操作。这已经为小至 64x64 像素的图像带来了返回,并且基本上允许处理像素数量为 x6 倍的图像,而无需分割阵列。

3。明智地使用你的 dtypes

如果您的中间值可以放入单个 uint8,请不要使用 int32 数组!由于静默溢出,这可能会变成一场神秘错误的噩梦,但如果你小心,它可以节省大量资源。

关于python - 处理大型 Numpy 数组的技术?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14351255/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com