使用大型Numpy阵列的技术?

使用大型Numpy阵列的技术?,第1张

使用大型Numpy阵列的技术?

我感到很痛苦…您有时最终会在数组值中存储几倍的大小,然后将其丢弃。一次处理数组中的一项时,这无关紧要,但是在向量化时可能会杀死您。

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

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

您可以执行以下几项 *** 作:

1.分而治之

也许您不能单次处理1,000x1,000的数组。但是,如果您可以使用python循环遍历10个100x1,000的数组来完成此 *** 作,那么它仍然可以远远超过1,000,000个项目的python迭代器!是的,它会比较慢,但是不会那么快。

2.缓存昂贵的计算

这与我上面的插值示例直接相关,尽管值得关注,但很难理解。因为我要在每个维度上具有4位的三维多维数据集上进行插值,所以只有16x16x16的可能结果,可以将结果存储在16个16x16x16字节的数组中。因此,我可以对其进行预计算并使用64KB的内存进行存储,然后针对整个图像逐一查找这些值,而不用为每个像素重做相同的 *** 作而付出巨大的内存成本。对于小至64x64像素的图像,这已经是值得的,并且基本上可以处理像素数x
6倍的图像,而不必细分数组。

3.
dtypes
明智地使用

如果您的中间值可以放在一个中

uint8
,请不要使用
int32
s数组!由于无提示的溢出,这可能会变成神秘错误的噩梦,但是如果您小心一点,它可以节省大量资源。



欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5653275.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存