2016-09-20 4 views
-1

Я пишу код для добавления данных по длине массива numpy (для объединения записей спутниковых данных). Для того, чтобы сделать это мой код читает два массива, а затем использует функциюPython MemoryError, когда массивы 'stacking'

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) 

В том случае, если массивы Рассматриваемые равны width функция 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! –

Смежные вопросы