HDF5 для обмена данными между python и R - PullRequest
0 голосов
/ 22 мая 2018

Я работаю над проектом, который должен сохранить и загрузить несколько:

  • Скаляры / Матрицы / Массивы
  • Таблицы (т.е. матрицы с аннотациями столбцов и строк)

Теперь я хотел бы хранить все свои данные в одном файле (или в прозрачном хранилище данных), но я не уверен, как правильно хранить таблицы.Как сохранить метки осей таблицы, сохраняя независимость от языка программирования данных?

  • Панды или PyTables могут получать доступ к файлам HDF5, но, по-моему, они не позволяют хранить простые массивы NumPy.Также я не уверен, что такие специальные таблицы легко загрузить в R.
  • xarray использует формат NetCDF, основанный на HDF5, но как я могу хранить несколько таблиц + массивов в одном файле NetCDF?А как насчет совместимости с R?
  • Самый простой вариант: просто поместите оси в отдельный набор данных, называемый [имя ds] _axis [n]?

1 Ответ

0 голосов
/ 23 мая 2018

Ваш вопрос широк, но я постараюсь развеять некоторые мифы, чтобы вы начали.У меня есть только опыт работы с Python, поэтому мои примеры будут касаться только использования HDF5 с Python.

Панды или PyTables могут получать доступ к файлам HDF5, но, по-моему, они не позволяют хранить простые массивы NumPy.

Вы правы в том, что PyTables не позволяет сохранять простой массив NumPy без каких-либо дополнительных затрат.Но вам не нужно , чтобы использовать PyTables .h5py предлагает NumPy-подобный интерфейс для хранения и доступа к массивам в / из файлов HDF5.

Сохранение массива NumPy

import h5py, numpy as np

arr = np.random.randint(0, 10, (1000, 1000))

f = h5py.File('file.h5', 'w', libver='latest')  # use 'latest' for performance

dset = f.create_dataset('array', shape=(1000, 1000), data=arr, chunks=(100, 100)
                        compression='gzip', compression_opts=9)

Существуют варианты сжатия и разбиения на фрагменты, которые вы можете изучить дополнительно для оптимизации производительности чтения / записи и коэффициентов сжатия в соответствии с вашими требованиями.Однако обратите внимание, что gzip является одним из немногих фильтров сжатия, которые поставляются со всеми установками HDF5.

Сохранение меток осей в качестве атрибутов

Атрибуты аналогичны наборам данныхи позволяет хранить широкий спектр данных, включая скаляры или массивы.

dset.attrs['Description'] = 'Some text snippet'
dset.attrs['X-Labels'] = np.arange(1000)
dset.attrs['Y-Labels'] = np.arange(1000)

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

Стоит отметить, что существуют определенные требования для обеспечения переносимости строк, см. Строки в HDF5 из h5py документы для более подробной информации.

...