In [551]: dt = np.dtype([('a',int),('b','uint8'),('c','float32'),('d','float64')])
In [552]: x = np.ones(10, dt)
In [553]: x.dtype
Out[553]: dtype([('a', '<i8'), ('b', 'u1'), ('c', '<f4'), ('d', '<f8')])
In [554]: x.itemsize
Out[554]: 21
In [555]: x.__array_interface__
Out[555]:
{'data': (40185408, False),
'strides': None,
'descr': [('a', '<i8'), ('b', '|u1'), ('c', '<f4'), ('d', '<f8')],
'typestr': '|V21',
'shape': (10,),
'version': 3}
Каждая запись этого массива занимает 21 байт, 'V21'.
In [557]: f = h5py.File('vtype.h5','w')
In [558]: ds = f.create_dataset('data', data=x)
In [559]: ds
Out[559]: <HDF5 dataset "data": shape (10,), type "|V21">
In [560]: ds.dtype
Out[560]: dtype([('a', '<i8'), ('b', 'u1'), ('c', '<f4'), ('d', '<f8')])
В h5dump
этот набор данных отображается как
DATATYPE H5T_COMPOUND {
H5T_STD_I64LE "a";
H5T_STD_U8LE "b";
H5T_IEEE_F32LE "c";
H5T_IEEE_F64LE "d";
}
Документы на чанкинг-шоукортеж чанкинга с тем же числом элементов, что и у формы массива.
http://docs.h5py.org/en/stable/high/dataset.html#chunked-storage
Здесь я создал 1d массив, поэтому чанкинг, если указан, применяется только к этому измерению, а не ксоставной тип данных.
Для простых массивов доступ к одному полю структурированного массива является относительно быстрым, сравнимым с доступом к столбцу 2-мерного массива или подставке вдоль 1-го массива.Это представление.
Но загрузка из набора данных h5
является копией.В этом небольшом примере загрузка ds[:]
происходит быстрее, чем ds['a']
.И ds[:n]['a']
быстрее, чем ds['a'][:n]
.
Я не представляю, как эти временные характеристики сравниваются с доступом к столбцам простого 2d-массива.И я не знаю, зависит ли время от размера dtype.