Возможно ли 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, как сохранить частичные результаты на диске?
  • Применять функцию n элементов за раз по оси
  • Сортировка массива Python (Numpy)
  • Ошибка памяти в python с использованием массива numpy
  • Цифровой элемент doty
  • Скрытый семантический анализ в несоответствии Python
  • Изображение PIL для массива (массив numpy для массива) - Python
  • Точность потеряна при использовании read_csv в пандах
  • Неожиданная версия «Экспоненциально взвешенная скользящая средняя», эквивалентная pandas.ewm (). Mean ()
  • Туки пять резюме резюме в Python
  • RuntimeError: модуль скомпилирован по версии API версии a, но эта версия numpy равна 9
  • пытается маскировать 2D-массивы numpy на основе значений в одном столбце
  • Python - лучший язык программирования в мире.