擅长:python、mysql、java
<p>我感觉到你的痛苦。。。有时,您最终会在以后丢弃的值中存储数倍于数组大小的值。当一次处理数组中的一个项时,这是不相关的,但在矢量化时可能会杀死您。</p>
<p>我将用一个工作中的例子来说明。我最近用numpy编写了<a href="http://www.hpl.hp.com/techreports/98/HPL-98-95.pdf">here</a>描述的算法。这是一种颜色映射算法,它将一个RGB图像转换成一个CMYK图像。对每个像素重复的处理如下:</p>
<ol>
<li>使用每个RGB值中最重要的4位作为三维查找表的索引。这将确定LUT中立方体8个顶点的CMYK值。</li>
<li>基于上一步的顶点值,使用每个RGB值的最低有效4位在该立方体内插值。要做到这一点,最有效的方法是计算16个uint8数组,其大小与正在处理的图像大小相同。对于一个24位的RGB图像,它相当于需要x6倍的存储空间来处理它。</li>
</ol>
<p>你可以做一些事情来处理这个问题:</p>
<h2>一。分而治之</h2>
<p>可能无法在一次过程中处理1000x1000数组。但是,如果您可以使用python for循环遍历10个100x1000数组,那么它仍然会远远超过python迭代器遍历1000000个项目!会比较慢,是的,但不会太慢。</p>
<h2>2。缓存昂贵的计算</h2>
<p>这与我上面的插值示例直接相关,而且更难理解,尽管值得关注。因为我在三维立方体上插值,每个维度有4位,所以只有16x16x16个可能的结果,可以存储在16个16x16x16字节的数组中。因此,我可以使用64KB的内存对它们进行预计算和存储,并逐个查找整个图像的值,而不是以巨大的内存开销对每个像素重复相同的操作。这已经为小到64x64像素的图像带来了回报,并且基本上允许在不需要细分数组的情况下处理像素数为x6倍的图像。</p>
<h2>三。明智地使用你的<code>dtypes</code></h2>
<p>如果中间值可以放在单个<code>uint8</code>中,请不要使用<code>int32</code>s数组!这可能会因为无声的溢出而变成一个神秘错误的噩梦,但是如果你小心,它可以提供很大的资源节约。</p>