Вхідні та вихідні масиви numpy до h5py


100

У мене є код Python, вихід якого є введіть тут опис зображенняматрицею розміру, записи якої мають усі типи float. Якщо я збережу його з розширенням, .datрозмір файлу має розмір близько 500 МБ. Я читав, що використання h5pyзначно зменшує розмір файлу. Отже, скажімо, у мене названий 2D масив numpy A. Як зберегти його у файлі h5py? Крім того, як я читаю один і той же файл і розміщую його як нумерований масив в іншому коді, як мені потрібно робити маніпуляції з масивом?


4
Як ви зберігаєте його за допомогою .datрозширення?
jorgeca

@jorgeca: для цього я просто займаюсяnp.savetxt("output.dat",A,'%10.8e')
lovespeed

3
Спасибі (розширення одне не означає багато, воно може зберігатися як бінарне, ascii ...). Якщо вам не потрібні додаткові функції hdf5, я б просто скористався тим, np.save('output.dat', A)що збереже його у двійковому форматі (набагато швидше, значно менше місця використовується).
jorgeca

@jorgeca, але чи зможе інший скрипт python читати його як двовимірний масив, коли я його називаюA = np.loadtxt('output.dat',unpack=True)
lovepeed

2
так h5pyщо не створюється файлів менше, ніж вони np.save? це h5pyшвидше , ніж np.saveдля масивів розміру даного в питанні?
dbliss

Відповіді:


131

h5py надає модель наборів даних та груп . Перший - це в основному масиви, а останній можна розглядати як каталоги. Кожен названий. Слід переглянути документацію API та приклади:

http://docs.h5py.org/en/latest/quick.html

Простий приклад, коли ви створюєте всі дані заздалегідь і просто хочете зберегти їх у файлі hdf5, виглядає приблизно так:

In [1]: import numpy as np
In [2]: import h5py
In [3]: a = np.random.random(size=(100,20))
In [4]: h5f = h5py.File('data.h5', 'w')
In [5]: h5f.create_dataset('dataset_1', data=a)
Out[5]: <HDF5 dataset "dataset_1": shape (100, 20), type "<f8">

In [6]: h5f.close()

Потім ви можете завантажити ці дані за допомогою: '

In [10]: h5f = h5py.File('data.h5','r')
In [11]: b = h5f['dataset_1'][:]
In [12]: h5f.close()

In [13]: np.allclose(a,b)
Out[13]: True

Однозначно перевірте документи:

http://docs.h5py.org

Запис у файл hdf5 залежить від h5py або pytables (кожен має інший API python, який розташовується поверх специфікації файлу hdf5). Ви також повинні ознайомитись з іншими простими бінарними форматами, наданими нумером, наприклад np.save, np.savezтощо:

http://docs.scipy.org/doc/numpy/reference/routines.io.html


Btw. якщо ви не знаєте назви набору даних заздалегідь, читаючи, ви повинні проаналізувати файл hdf, подібний до цього .
Триларіон

@JoshAdel, якщо я хочу додати стовпець до набору даних. мій набір даних - це багатовимірний np.array, індексований як [img_id, рядки, стовпці, канали]. і я зберегла його, використовуючи метод, описаний у вашій відповіді. Я отримую доступ до всіх точок у наборі даних за допомогою h5f ['database_1'] [img_id]. те, що я хочу, це спосіб додати ще один стовпець, який скаже «мій стовпець» ... відповідний кожному img_id у наборі даних. як слід додати до цього ще один стовпець, щоб я міг зробити h5f ['mycolumn'] [img_id]?
іраджаш

Якщо я записую такі матриці, то я не можу їх бачити за допомогою HDFView 2.11 - я можу відкрити файл, бачу, що набір даних data.h5існує, але я не можу переглянути його за допомогою HDFView. Я можу читати вміст з h5py, але не перевіряти його за допомогою HDFView. Будь-яка ідея чому?
Мартін Тома

104

Більш чіткий спосіб роботи з відкриттям / закриттям файлів та уникнення витоків пам'яті:

Підготовка:

import numpy as np
import h5py

data_to_write = np.random.random(size=(100,20)) # or some such

Написати:

with h5py.File('name-of-file.h5', 'w') as hf:
    hf.create_dataset("name-of-dataset",  data=data_to_write)

Прочитайте:

with h5py.File('name-of-file.h5', 'r') as hf:
    data = hf['name-of-dataset'][:]

2
Не потрібно закривати файл?
ricoamor

23
@DrDeSancho ні, з заявою
Леонід

1
особливо корисно під час роботи в інтерактивному режимі (оскільки в іншому випадку можна ризикувати отримати виняток з h5py про вже відкритий файл, коли він перезаписує той самий код, не замикаючись належним чином у першій спробі)
Андре Хольцнер

The withОсобливість Python відома як менеджер контексту. Він переконається, що файл буде закритий після його використання. Більше інформації можна отримати в офіційній документації: docs.python.org/3/library/contextlib.html
Марк
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.