Как извлечь данные из файла HDF? - PullRequest
0 голосов
/ 28 мая 2020

У меня есть файл HDF (.h5), который имеет следующую иерархию enter image description here

Я никогда не работал с такими данными. Я думаю, что «штрих-коды» должны быть моими столбцами, «функции / имена» должны быть моими строками, «данные» должны быть значениями. Как мне извлечь его в виде фрейма данных barcodesXnames, желательно в Python?

Я пробовал это

    filename = "filtered_feature_bc_matrix.h5"

    with h5py.File(filename, "r") as f:
    data = f.get('matrix/data')
    dataset=np.array(data)
    print(dataset)

, но он дает мне массив данных вроде [1 1 1 ... 2 1 2]

Ответы [ 3 ]

0 голосов
/ 28 мая 2020

С наборами данных с именами indptr и indicies, я думаю, что matrix должна быть матрицей scipy.sparse.

Чтобы загрузить это, вам нужно использовать h5py docs и scipy.sparse.csr_matrix docs

csr_matrix((data, indices, indptr), [shape=(M, N)])
    is the standard CSR representation where the column indices for
    row i are stored in ``indices[indptr[i]:indptr[i+1]]`` and their
    corresponding values are stored in ``data[indptr[i]:indptr[i+1]]``.
    If the shape parameter is not supplied, the matrix dimensions
    are inferred from the index arrays.

Примерно тогда:

import h5py
from scipy import sparse

f = h5py.File(...)
gp = f['matrix']
data = gp['data'][:]
indptr = gp['indptr'][:]
indices = gp['indices'][:]
shape = gp['shape'][:]

M = sparse.csr_matrix((data, indices, indptr), shape=shape)

M.A   # dense numpy array equivalent (don't do this is `shape` is large)

data, indptr et c все должны быть numpy массивами. shape также будет массивом, вероятно, 2 числа, например np.array([1000, 2000]).

0 голосов
/ 28 мая 2020

Я собираюсь начать с введения в схему / объекты данных HDF5. Вы должны понимать это, чтобы эффективно работать с данными HDF5. Есть 2 основных c сущностей: 1) Группы и 2) Наборы данных. Они похожи на папки и файлы на вашем компьютере. Группы похожи на папки, а наборы данных похожи на файлы, содержащие данные. (Примечание: ни одно из них не является именами столбцов или строк - вы получаете эту информацию, запрашивая каждый набор данных).

Группы используют значок папки в вашем изображении макета файла. У вас есть 2 группы.
Это:

/matrix
/matrix/features

Наборы данных имеют другой значок. У вас есть 10 наборов данных, по 5 сохраненных в каждой группе.
Это:

/matrix/barcodes
/matrix/data
/matrix/indices
/matrix/indptr
/matrix/shape

/matrix/features/_all_tag_keys
/matrix/features/feature_name
/matrix/features/genome
/matrix/features/id
/matrix/features/name

Я создал простой пример для опроса вашей модели и вывода групп / наборов данных. Кроме того, он выводит dtype и форму для наборов данных. Это должно помочь вам прагматично «увидеть» то, что у вас есть, и сравнить с вашим изображением.

  • Dtype - это типы данных (int, float, string) и имена полей / столбцов (если они определены).
  • Форма зависит от определения набора данных. Для простых массивов NumPy это размерность во всех направлениях. Для смешанных типов данных (массивов записей) это количество строк.

Сегмент кода ниже:

import h5py

def visitor_func(name, node):
    if isinstance(node, h5py.Group):
        print(node.name, 'is a Group')
    elif isinstance(node, h5py.Dataset):
       if (node.dtype == 'object') :
            print (node.name, 'is an Object Dataset')
       else:
            print(node.name, 'is a Dataset')
            print ('Dataset dtype=', node.dtype)
            print ('Dataset shape=', node.shape) 

    else:
        print('Node is unknown type: ', node.name)           

print ('testing hdf5 file')
with h5py.File('filtered_feature_bc_matrix.h5','r') as h5f:
    h5f.visititems(visitor_func) 
0 голосов
/ 28 мая 2020
import h5py
f = h5py.File('filtered_feature_bc_matrix.h5','r') 
f.keys()
f['data']
f.close()
...