Загрузить np.memmap, не зная формы

Можно ли загрузить numpy.memmap не зная форму и до сих пор восстановить форму данных?

data = np.arange(12, dtype='float32')
data.resize((3,4))
fp = np.memmap(filename, dtype='float32', mode='w+', shape=(3,4))
fp[:] = data[:]
del fp
newfp = np.memmap(filename, dtype='float32', mode='r', shape=(3,4))

В последней строке я хочу иметь возможность не указывать фигуру и по-прежнему получать переменную newfp иметь форму (3,4)так же, как это случилось бы с joblib.load, Это возможно? Благодарю.

2 ответа

Решение

Нет, если эта информация не была явно сохранена где-то в файле. Так далеко как np.memmap обеспокоен, файл просто плоский буфер.

Я бы порекомендовал использовать np.save чтобы сохранить пустые массивы, так как это также сохраняет метаданные, определяющие их размеры, dtypes и т. д. Вы также можете загрузить .npy файл в качестве карты памяти, передавая memmap_mode= параметр для np.load,

joblib.dump использует комбинацию травления для хранения общих объектов Python и np.save хранить массивы NumPy.


Инициализировать пустой отображенный в память массив, поддерживаемый .npy файл, который вы можете использовать numpy.lib.format.open_memmap:

import numpy as np
from numpy.lib.format import open_memmap

# initialize an empty 10TB memory-mapped array
x = open_memmap('/tmp/bigarray.npy', mode='w+', dtype=np.ubyte, shape=(10**13,))

Вы можете быть удивлены тем фактом, что это удастся, даже если массив будет больше, чем общее доступное дисковое пространство (у моего ноутбука только 500 ГБ SSD, но я только что создал карту памяти размером 10 ТБ). Это возможно, потому что созданный файл редок.

Кредит на открытие open_memmap следует перейти к предыдущему ответу Кийо здесь.

Ответ от @ali_m совершенно правильный. Я хотел бы упомянуть мои личные предпочтения, на случай, если это кому-нибудь поможет. Я всегда начинаю свои массивы memmap с формы как первые 2 элемента. Сделать это так же просто, как:

# Writing the memmap array
fp = np.memmap(filename, dtype='float32', mode='w+', shape=(3,4))
fp[:] = data[:]
fp = np.memmap(filename, dtype='float32', mode='r+', shape=(14,))
fp[2:] = fp[:-2]
fp[:2] = [3, 4]
del fp

Или еще проще:

# Writing the memmap array
fp = np.memmap(filename, dtype='float32', mode='w+', shape=(14,))
fp[2:] = data[:]
fp[:2] = [3, 4]
del fp

Тогда вы можете легко прочитать массив как:

#reading the memmap array
newfp = np.memmap(filename, dtype='float32', mode='r')
row_size, col_size = newfp[0:2]
newfp = newfp[2:].reshape((row_size, col_size))

Альтернатива numpy.memmap является tifffile.memmap:

from tifffile import memmap
newArray = memmap("name", shape=(3,3), dtype='uint8')
newArray[1,1] = 11
del(newArray)

newArray файл создается со значениями:

0  0  0
0  11 0
0  0  0  

Теперь давайте прочитаем это обратно:

array = memmap("name", dtype='uint8')
print(array.shape) # prints (3,3)
print(array)

печатает:

0  0  0
0  11 0
0  0  0
Другие вопросы по тегам