Возможно ли np.concatenate файлы с отображением памяти?

Я сохранил несколько массивов numpy с помощью np.save (), и они собраны вместе, они довольно огромны.

Можно ли загружать их все в виде файлов с отображением памяти, а затем объединить и разрезать их все без какой-либо загрузки в память?

One Solution collect form web for “Возможно ли np.concatenate файлы с отображением памяти?”

Использование numpy.concatenate видимому, загружает массивы в память. Чтобы этого избежать, вы можете легко создать массив memmap в новом файле и прочитать значения из массивов, которые вы хотите объединить. Более эффективным способом вы можете добавить новые массивы в уже существующий файл на диске.

В любом случае вы должны позаботиться о выборе правильного порядка для массива (row-major или column-major).

Давайте проиллюстрируем это двумя случаями в 2D-массивах.


1) конкатенировать вдоль axis=0

 a = np.memmap('a.array', dtype='float64', mode='w+', shape=( 5000,1000)) # 38.1MB a[:,:] = 111 b = np.memmap('b.array', dtype='float64', mode='w+', shape=(15000,1000)) # 114 MB b[:,:] = 222 

Вы можете определить третий массив, считывающий тот же файл, что и первый массив, который будет конкатенирован (здесь a ) в режиме r+ (чтение и добавление), но с формой конечного массива, который вы хотите достичь после конкатенации, например:

 c = np.memmap('a.array', dtype='float64', mode='r+', shape=(20000,1000), order='C') c[5000:,:] = b 

Конкатенация вдоль axis=0 требует прохождения order='C' потому что это уже порядок по умолчанию.


2) конкатенировать вдоль axis=1

 a = np.memmap('a.array', dtype='float64', mode='w+', shape=(5000,3000)) # 114 MB a[:,:] = 111 b = np.memmap('b.array', dtype='float64', mode='w+', shape=(5000,1000)) # 38.1MB b[:,:] = 222 

Сохраненные на диске массивы фактически сплющены, поэтому, если вы создаете c с mode=r+ и shape=(5000,4000) без изменения порядка массива, 1000 первых элементов со второй строки в a перейдут к первой строке в c . Но вы можете легко избежать этого проходящего order='F' (column-major) в memmap :

 c = np.memmap('a.array', dtype='float64', mode='r+',shape=(5000,4000), order='F') c[:,3000:] = b 

Здесь у вас есть обновленный файл «a.array» с результатом конкатенации. Вы можете повторить этот процесс, чтобы объединиться парами из двух.

Связанные вопросы:

  • Работа с большими данными в python и numpy, не хватает RAM, как сохранить частичные результаты на диске?
  • Отображение памяти Python
  • подсчитайте количество элементов в массиве numpy в пределах дельта каждого другого элемента
  • Matplotlib: как заставить imshow читать x, y координаты из других массивов numpy?
  • Переполнение в exp в scipy / numpy в Python?
  • Разрезать только мелкую копию списка?
  • Обработка повторяющихся индексов в заданиях NumPy
  • Как преобразовать блоки в блокдиагональную матрицу (NumPy)
  • Построение графика с помощью Python
  • Python - лучший язык программирования в мире.