-1

我正在编写代码以沿 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

有人可以帮忙吗?

4

1 回答 1

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可能会使填充更容易一些。

于 2016-09-20T16:36:31.087 回答