2011-08-05 22 views
4

我正在努力工作與大numpy陣列。這是場景。我正在使用300MB - 950MB的圖像,並使用GDAL將它們作爲Numpy陣列讀取。在數組中讀取使用的內存與預期的一樣多,即。 250MB的圖像等250MB ...Numpy.mean,amin,amax,std巨大的回報

我使用numpy獲得平均值,最小值,最大值或標準偏差時發生問題。在main()中,我打開圖像並讀取數組(類型爲ndarray)。然後我調用下面的函數,來獲取標準差,二維數組:

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 

返回浮點STD正如人們所期望。 numpy是否再次讀取數組以執行此計算?我會更好地迭代數組並手動執行計算(s)?如何處理扁平數組?我試過把每個統計調用(numpy.amin(),numpy.amax(),numpy.std(),numpy.mean())放到它們自己的函數中,這樣大數組就會超出範圍,但那裏沒有運氣。我也嘗試將其歸類爲另一種類型,但沒有喜樂。

回答

1

不知道這是否有用,但使用數組方法解決了問題嗎?即

input_array.std() 

,而不是

numpy.std(input_array) 

你形容不作一大堆的意義,我的問題;我經常使用大型數組,但不會遇到類似這些簡單任務的錯誤。還有什麼其他的你可能最終會傳遞數組的副本而不是引用?

+0

只是試圖更改爲input_array.std()並沒有運氣。通過插入raw_input()調用並使用資源監視器,我可以在每次調用時通過數組大小來查看python內存使用情況。我將input_array傳遞給該函數,然後像上面那樣調用它。這[鏈接](http://stackoverflow.com/questions/986006/python-how-do-i-pass-a-variable-by-reference)表明我正確地傳遞變量。 – Jzl5325

+0

這真的很奇怪。你可以直接調用numpy.std()函數來替換函數調用嗎?或者有什麼理由需要用get_array_std()來包裝numpy.std()?我猜你有理由這樣做。根據你告訴我的,我認爲你正確地傳遞了這個變量。當你看到資源消耗跳轉時,在什麼情況下調用get_array_std()你是用簡約的腳本來測試它嗎? – keflavich

1

您確定這是您嘗試使用的所有統計函數的問題,還是僅僅是np.std?

我嘗試以下方法來重現此:

  1. 開始IPython的-cs 0,進口numpy的作爲第二
  2. Q =蘭特(5600,16000),給我一個很好的大型測試陣列。
  3. np.mean(q)中時觀看存儲器使用外部,np.amin(Q),np.amax(Q),np.std(Q)

在這些中,np.std是顯著慢:我的電腦上大多數功能需要0.2秒,而std需要2.3。雖然我沒有確切的內存泄漏,但我的內存使用率在運行除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快兩倍。編寫這樣一個函數可能有更優雅的方式,但這似乎起作用。