Загрузить 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