Необъяснимое поведение при использовании vlen с h5py

Я использую h5py для создания набора данных. Поскольку я хочу хранить массивы с различным размером строк #of, я использую h5py special_type vlen. Тем не менее, я испытываю поведение, которое я не могу объяснить, может быть, вы поможете мне понять, что происходит:

>>>> import h5py >>>> import numpy as np >>>> fp = h5py.File(datasource_fname, mode='w') >>>> dt = h5py.special_dtype(vlen=np.dtype('float32')) >>>> train_targets = fp.create_dataset('target_sequence', shape=(9549, 5,), dtype=dt) >>>> test Out[130]: array([[ 0., 1., 1., 1., 0., 1., 1., 0., 1., 0., 0.], [ 1., 0., 0., 0., 1., 0., 0., 1., 0., 0., 0.], [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 1.]]) >>>> train_targets[0] = test >>>> train_targets[0] Out[138]: array([ array([ 0., 1., 0., 0., 0., 1., 0., 0., 0., 0., 1.], dtype=float32), array([ 1., 0., 0., 0., 1., 0., 0., 0., 0., 1., 0.], dtype=float32), array([ 0., 0., 0., 1., 0., 0., 0., 0., 1., 0., 0.], dtype=float32), array([ 0., 0., 1., 0., 0., 0., 0., 1., 0., 0., 0.], dtype=float32), array([ 0., 1., 0., 0., 0., 0., 1., 0., 0., 0., 0.], dtype=float32)], dtype=object) 

Я ожидаю, что train_targets[0] будет иметь такую ​​форму, однако я не могу распознать строки в моем массиве. Кажется, что они совершенно беспорядочны, но это непротиворечиво. Под этим я подразумеваю, что каждый раз, когда я пытаюсь train_targets[0] вышеуказанный код, train_targets[0] выглядит одинаково.

Чтобы уточнить: первый элемент в моем train_targets , в данном случае test , имеет форму (5,11) , однако второй элемент может иметь форму (5,38) поэтому я использую vlen.

спасибо за помощь

Мат

One Solution collect form web for “Необъяснимое поведение при использовании vlen с h5py”

я думаю

 train_targets[0] = test 

сохранил ваш (11,5) массив как F упорядоченный массив в ряду train_targets . Согласно (9549,5) форме, это строка из 5 элементов. И поскольку это vlen , каждый элемент представляет собой 1-й массив длиной 11.

Это то, что вы вернетесь в train_targets[0] – массив из 5 массивов, каждая форма (11,) , со значениями, взятыми из test (порядок F).

Поэтому я думаю, что есть 2 вопроса – что означает 2d-форма, и что позволяет vlen.


Моя версия h5py – pre v2.3, поэтому я получаю только строку vlen. Но я подозреваю, что ваша проблема может заключаться в том, что vlen работает только с 1d массивами, расширением, так сказать, байтовых строк.

Имеет ли 5 в shape=(9549, 5,) какое-либо отношение к 5 в test.shape ? Я не думаю, что это так, по крайней мере, не так много, и h5py вижу это.

Когда я делаю файл, следуя примеру строки vlen:

 >>> f = h5py.File('foo.hdf5') >>> dt = h5py.special_dtype(vlen=str) >>> ds = f.create_dataset('VLDS', (100,100), dtype=dt) 

а затем выполните:

 ds[0]='this one string' 

и посмотрите на ds[0] , я получаю массив объектов со 100 элементами, каждая из которых является этой строкой. То есть, я установил целую строку ds .

 ds[0,0]='another' 

это правильный способ установить только один элемент.

vlen – это «переменная длина», а не «переменная форма». Хотя https://www.hdfgroup.org/HDF5/doc/TechNotes/VLTypes.html документация не совсем понятна, я думаю, вы можете хранить 1d массивы с формами (11,) и (38,) с помощью vlen , но не 2d.


Фактически, выход train_targets воспроизводится с помощью:

 In [54]: test1=np.empty((5,),dtype=object) In [55]: for i in range(5): test1[i]=test.T.flatten()[i:i+11] 

Это 11 значений, взятых из транспозиции (порядок F), но сдвинутых для каждого вспомогательного массива.

Interesting Posts
Python - лучший язык программирования в мире.