堆叠时的Python MemoryError'阵列

时间:2016-09-20 10:48:17

标签: python arrays numpy memory satellite-image

我正在编写代码以沿numpy数组的长度添加数据(用于组合卫星数据记录)。为了做到这一点,我的代码读取两个数组,然后使用函数

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()函数时出现内存问题。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

我将您的最后一行更改为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可能会使填充更容易。