Nano Hash - криптовалюты, майнинг, программирование

Можно ли np.concatenate отображать файлы в памяти?

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

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


  • Возможный дубликат: объединить массивы Numpy без копирования 08.12.2012
  • Конечно, я пробовал просто np.concatenate() кортеж отображаемых в память массивов, и результат загружается в память и довольно быстро наносит вред моей системе. 09.12.2012
  • Читая другую ветку, то, чего вы хотите достичь, кажется мне совершенно невозможным. Хотя я действительно вижу пользу. Если речь идет только о нарезке, у меня есть одна или две идеи, но они не будут работать с другими утилитами numpy. 09.12.2012
  • Думаю, в данном конкретном случае мне просто придется жить без нарезки, но вы, конечно, можете поделиться идеями, которые у вас есть. 09.12.2012
  • Подходит ли вам h5py? Там вы можете красиво нарезать, не загружая все это. 10.12.2012
  • Я посмотрю на это, cronos, спасибо! 12.12.2012

Ответы:


1

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

В любом случае вы должны выбрать правильный порядок для массива (основной ряд или столбец).

В следующих примерах показано, как выполнить конкатенацию по оси 0 и оси 1.


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' (основной столбец) в memmap:

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

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

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

31.05.2013

2

Возможно, альтернативное решение, но у меня также был один многомерный массив, распределенный по нескольким файлам, которые я хотел только читать. Я решил эту проблему с помощью конкатенации Dask.

import numpy as np
import dask.array as da
 
a = np.memmap('a.array', dtype='float64', mode='r', shape=( 5000,1000))
b = np.memmap('b.array', dtype='float64', mode='r', shape=(15000,1000))

c = da.concatenate([a, b], axis=0)

Таким образом можно избежать хакерского дополнительного дескриптора файла. Затем массив dask можно нарезать и работать с ним почти как с любым массивом numpy, а когда приходит время вычислять результат, вызывается compute.

Обратите внимание, что есть два предостережения:

  1. невозможно выполнить повторное назначение на месте, например. c[::2] = 0 невозможно, поэтому в таких случаях необходимы творческие решения.
  2. это также означает, что исходные файлы больше нельзя обновлять. Чтобы сохранить результаты, следует использовать методы dask store. Этот метод снова может принимать массив memmapped.
26.06.2021

3

Если вы используете order='F', это приведет к другой проблеме, из-за которой, когда вы загрузите файл в следующий раз, он выйдет из строя, даже если вы пройдете order='F. Итак, мое решение ниже, я много тестировал, все работает нормально.

fp = your old memmap...
shape = fp.shape
data = your ndarray...
data_shape = data.shape
concat_shape = data_shape[:-1] + (data_shape[-1] + shape[-1],)
print('cancat shape:{}'.format(concat_shape))
new_fp = np.memmap(new_file_name, dtype='float32', mode='r+', shape=concat_shape)
if len(concat_shape) == 1:
    new_fp[:shape[0]] = fp[:]
    new_fp[shape[0]:] = data[:]
if len(concat_shape) == 2:
    new_fp[:, :shape[-1]] = fp[:]
    new_fp[:, shape[-1]:] = data[:]
elif len(concat_shape) == 3:
    new_fp[:, :, :shape[-1]] = fp[:]
    new_fp[:, :, shape[-1]:] = data[:]
fp = new_fp
fp.flush()
28.11.2018
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..