Numpy.mean,amin,amax,std巨额回报

时间:2011-08-05 15:28:00

标签: arrays image-processing numpy

我正在努力使用大型numpy数组。这是场景。我正在使用300MB - 950MB图像并使用GDAL将它们作为Numpy阵列读取。读取数组使用的内存与预期的完全相同,即。 250MB图像等250MB ......

当我使用numpy获取均值,最小值,最大值或标准差时,会出现问题。在main()中,我打开图像并读取数组(类型为ndarray)。然后我调用以下函数,以获得2D数组上的标准偏差:

def get_array_std(input_array):
    array_standard_deviation = numpy.std(input_array, copy=False)
    return array_standard_deviation

这里我经常遇到内存错误(在6GB机器上)。从documentation看起来numpy返回一个与我的输入具有相同形状和dtype的ndarray,从而使内存大小加倍。

使用:

print type(array_standard_deviation)

返回:

numpy.float64

此外,使用:

print array_standard_deviation

按照预期返回一个float std。是否numpy再次读取数组以执行此计算?我会更好地迭代数组并手动执行计算吗?如何使用扁平阵列?

我尝试将每个统计调用(numpy.amin(),numpy.amax(),numpy.std(),numpy.mean())放入它们自己的函数中,这样大数组就会超出范围,但那里没有运气。我也试过将回归投射到另一种类型,但没有快乐。

3 个答案:

答案 0 :(得分:4)

Numpy为std做了一个“天真”的减少操作。它的内存效率很低。 在这里寻找更好的实现: http://luispedro.org/software/ncreduce

答案 1 :(得分:1)

不知道这是否有用,但是使用数组方法解决了这个问题吗?即。

input_array.std()

而不是

numpy.std(input_array)

你描述的问题对我来说并没有多大意义;我经常使用大型数组,但不会遇到像这样的简单任务的错误。你还有什么其他的东西可能会最终传递数组的副本而不是引用吗?

答案 2 :(得分:1)

您确定这是您正在尝试的所有统计功能的问题,还是仅仅是np.std?

我尝试了以下方法来重现这个:

  1. 启动ipython -cs 0,将numpy导入为nd
  2. q = rand(5600,16000),给我一个很好的大型测试阵列。
  3. 在np.mean(q),np.amin(q),np.amax(q),np.std(q)
  4. 期间外部监视内存使用情况

    其中,np.std明显变慢:我的计算机上大多数功能需要0.2秒,而std需要2.3秒。虽然我没有确切的内存泄漏,但我的内存使用率在运行除std之外的所有内容时基本保持不变,但是当我运行std时会增加一倍,然后再回到初始值。

    我编写了以下修改过的std,它运行在给定数量元素的块上(我使用的是100000):

    def chunked_std( A, chunksize ):
        Aflat = A.ravel()
        Amean = A.mean()
        Alen = len(Aflat)
    
        i = np.concatenate( ( np.arange(0,Alen,chunksize), [Alen] ) )
    
        return np.sqrt(np.sum(np.sum(abs(Aflat[x:y]-Amean)**2) for (x,y) in zip(i[:-1],i[1:]))/Alen)
    

    这似乎可以显着减少内存使用量,同时对我来说也是普通np.std的两倍。可能有更优雅的方式来编写这样的功能,但这似乎有效。