2013-06-04 53 views
3

我正在使用GDAL工作在Python柵格上的項目。這些柵格或圖像可能會變得很大,所以我通常在Numpy中使用內存映射來加載它們。目前我想對內存映射的Numpy陣列進行距離變換操作。我試圖使用Scipy的distance_transform_edt函數,但是,這個函數返回結果的一個副本在內存中,我最終得到一個內存錯誤。如何使用Scipy進行高效的距離變換操作?

561, in distance_transform_dataset 
    dest_array = ndimage.distance_transform_edt(source_array) * pixel_size 
File "/usr/local/lib/python2.7/dist-packages/scipy/ndimage/morphology.py", line 2173, 
    in distance_transform_edt 
input = numpy.atleast_1d(numpy.where(input, 1, 0).astype(numpy.int8)) 
MemoryError 
None  

很多次這樣的函數都會有'out'參數來寫結果。這個函數沒有,所以我不能寫入內存映射的numpy數組。

任何想法如何做一個大numpy陣列上的內存有效的距離變換計算將不勝感激。謝謝。

+2

在較小的切片上執行幾個操作或修改代碼以在原地執行操作。 – jfs

回答

4

您使用的是什麼版本的Scipy?在我運行的版本(0.12.0)中,沒有out參數,因爲有兩個輸出參數:distancesindices,它們都可用於輸出。如果提供了這些內容並且是ndarray或子類的實例,則scipy將對它們進行相應的轉換。從文檔:

距離:ndarray,可選

用於距離陣列的輸出,必須是類型float64的。

指數:ndarray,可選

用於指數的輸出,必須是Int32類型的。

注意這裏是文檔中一個錯字,至少在0.12.0:distance應該distances

不幸的是,這似乎並不是你的實際問題。您的實際問題似乎發生在distance_transform_edt的input轉換爲二進制文件,看起來像是複製了input ......您的輸入有多大?

根據scipy版本編寫自己的distance_transform_edt版本可能是值得的。它只有大約50行,其中大多數處理各種輸入/輸出類型。