我正在努力使用大型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())放入它们自己的函数中,这样大数组就会超出范围,但那里没有运气。我也试过将回归投射到另一种类型,但没有快乐。
答案 0 :(得分:4)
Numpy为std做了一个“天真”的减少操作。它的内存效率很低。 在这里寻找更好的实现: http://luispedro.org/software/ncreduce
答案 1 :(得分:1)
不知道这是否有用,但是使用数组方法解决了这个问题吗?即。
input_array.std()
而不是
numpy.std(input_array)
你描述的问题对我来说并没有多大意义;我经常使用大型数组,但不会遇到像这样的简单任务的错误。你还有什么其他的东西可能会最终传递数组的副本而不是引用吗?
答案 2 :(得分:1)
您确定这是您正在尝试的所有统计功能的问题,还是仅仅是np.std?
我尝试了以下方法来重现这个:
其中,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的两倍。可能有更优雅的方式来编写这样的功能,但这似乎有效。