2016-09-20 82 views
-1

我正在編寫用於沿numpy數組長度添加數據的代碼(用於組合衛星數據記錄)。爲了做到這一點我的代碼讀取兩個數組,然後使用函數當'疊加'數組時,Python MemoryError

def swath_stack(array1, array2): 
    """Takes two arrays of swath data and compares their dimensions. 
    The arrays should be equally sized in dimension 1. If they aren't the 
    function appends the smallest along dimension 0 until they are. 
    The arrays are then stacked on top of each other.""" 
    if array1.shape[1] > array2.shape[1]: 
     no_lines = array1.shape[1] - array2.shape[1] 
     a = np.zeros((array2.shape[0], no_lines)) 
     a.fill(-999.) 
     new_array = np.hstack((array2, a)) 
     mask = np.zeros(new_array.shape, dtype=int) 
     mask[np.where(new_array==-999.)] = 1 
     array2 = ma.masked_array(new_array, mask=mask) 
    elif array1.shape[1] < array2.shape[1]: 
     no_lines = array2.shape[1] - array1.shape[1] 
     a = np.zeros((array1.shape[0], no_lines)) 
     a.fill(-999.) 
     new_array = np.hstack((array1, a)) 
     mask = np.zeros(new_array.shape, dtype=int) 
     mask[np.where(new_array==-999.)] = 1 
     array1 = ma.masked_array(new_array, mask=mask) 
    return np.vstack((array1, array2)) 

使兩個中的一個陣列中的線

window_data = swath_stack(window_data, stack_data) 

倘若所考慮的陣列在等於swath_stack()函數的寬度縮減爲np.vstack()。我的問題是在這個階段我一直遇到MemoryError。我知道在算術運算符的情況下,在算術運算時(例如array1 += array2而不是array1 = array1 + array2),它的內存效率更高,但我不知道如何在使用swath_stack()函數時避免這種內存問題。

任何人都可以請幫忙嗎?

+0

你的數組的大小和類型是什麼?你有多少內存? –

回答

0

我改變了你的最後一行np.ma.vstack,並得到了

In [474]: swath_stack(np.ones((3,4)),np.zeros((3,6))) 
Out[474]: 
masked_array(data = 
[[1.0 1.0 1.0 1.0 -- --] 
[1.0 1.0 1.0 1.0 -- --] 
[1.0 1.0 1.0 1.0 -- --] 
[0.0 0.0 0.0 0.0 0.0 0.0] 
[0.0 0.0 0.0 0.0 0.0 0.0] 
[0.0 0.0 0.0 0.0 0.0 0.0]], 
      mask = 
[[False False False False True True] 
[False False False False True True] 
[False False False False True True] 
[False False False False False False] 
[False False False False False False] 
[False False False False False False]], 
     fill_value = 1e+20) 

這將保留您在填充過程中產生的遮蔽。

掩蔽的填充使中間數組的內存使用加倍。

使用2個相同大小的數組時,你會得到內存錯誤嗎?即只有簡單的vstack?沒有辦法進行就地堆疊。它必須創建一個或多個新陣列。數組具有固定的大小,所以不能在原地增長。最後一個數組必須有一個連續的數據緩衝區,所以不能使用原始數據的緩衝區。

它不會使用遮罩,但np.pad可能會使填充更容易一些。

+0

我發現了這個問題,這確實是與數組大小有關(發現有點棘手,但基本上必須處理錯誤的時間戳,導致創建巨大的數組以填補數據中的空白)。分別爲 –

+0

我後來遇到了np.vstack不保留遮罩的問題。我對此的解決方案比上面更笨拙,所以感謝您向我展示np.ma.vstack! –