2015-08-04 3 views
0

Я сохранил много файлов данных в формате .npz, чтобы сэкономить место на диске (savez_compressed). Каждый файл сохраняется как один массив, поэтому при использовании функции загрузки numpy он возвращает ключ в словарь, содержащий массив.Быстрый доступ к numpy npz data

Как вы можете быстро сохранить этот массив в виде массива вместо словаря.

Например

data = [] 
datum = np.load('file.npz') 
key = datum.keys()[0] 
data.append([datum[key]]) 

При профилировании это, мой код провел большую часть времени с использованием метода get для словаря.

Если он был сохранен как файл npy, ему не нужен метод get и он намного быстрее.

data = [] 
data.append([np.load('file.npz')]) 

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

ответ

3

np.load использует класс np.lib.npyio.NpzFile для загрузки npz файлов. Его документ:

NpzFile(fid) 

A dictionary-like object with lazy-loading of files in the zipped 
archive provided on construction. 

`NpzFile` is used to load files in the NumPy ``.npz`` data archive 
format. It assumes that files in the archive have a ".npy" extension, 
other files are ignored. 

The arrays and file strings are lazily loaded on either 
getitem access using ``obj['key']`` or attribute lookup using 
``obj.f.key``. A list of all files (without ".npy" extensions) can 
be obtained with ``obj.files`` and the ZipFile object itself using 
``obj.zip``. 

Я думаю, что последний абзац отвечает на ваш вопрос времени. Данные не загружаются, пока вы не сделаете словарь get. Таким образом, это не просто поиск в словарях в памяти - это загрузка файла (без сжатия).

Поиск в словаре Python выполняется быстро - интерпретатор делает все время при доступе к атрибутам объектов. И при простом управлении пространством имен.

Смежные вопросы