2012-10-13 30 views
1

我想通過使用內存映射數組來處理我的應用程序中的內存問題。然而,作爲我的計算的一部分,我需要將數組中的某些值設置爲0.不幸的是,數組掩碼將需要額外的內存。有沒有辦法做到以下幾點,使面罩得到乾淨的處理?我可以製作一張numpy內存映射掩碼嗎?

source_array = numpy.memmap(filename, dtype='float32', mode='w+', shape=shape) 
#Load data into memory mapped numpy array 
band.ReadAsArray(buf_obj = source_array) 
#set values == 255 to 0 
numpy.putmask(source_array, source_array >= 255.0, 0.0) 

我相信,隨着source_array >= 255.0最後一行必須在大內存陣列,對不對?除了手動循環每個元素之外,是否有一種有效的內存機制來將source_array中的所有255個值都設置爲0?

+2

Arg!我很親密。首先,我發現['numpy.clip'](http://docs.scipy.org/doc/numpy/reference/generated/numpy.clip.html),它可以讓你幾乎完成這個任務(沒有值替代)。然後,我發現['scipy.stats.threshold'](http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.threshold.html),它可以讓你替換掉 - 範圍值,但*不*工作到位!哦,也許這些鏈接將幫助你找到我不能做的事情。 –

回答

2

對不起,意識到當然,在這裏,mask不是一個最佳的解決方案。 Numpy並沒有太多的幫助循環遍歷數據塊(這將是最清潔的方式),儘管你當然可以親自操作。你可能實際上在numexpr方面取得了一些成功,它總是以大塊計算來加速numpy,但我沒有嘗試過。


我想這是不太你想要什麼:

您可以隨時使用out參數ufunc S和許多其他功能要求numpy的直接結果存儲在該陣列(也一般節省內存)。這意味着,如果你創建一個空的內存映射數組,你可以這樣做:

# You could use tempfile.NamedTemporaryFile. But I will leave that to you: 
mask = np.memmap(tempfile, shape=source_array.shape, dtype=bool, mode='w+') 
np.greater_equal(source_array, 255.0, out=mask) 

然後使用mask陣列putmask。這應該可以解決問題。

+0

謝謝,我認爲這足夠滿足我需要的東西! – Rich