Как исправить ошибку «Нет эквивалента NumPy для TypeBitfieldID существует» в Python - PullRequest
0 голосов
/ 02 апреля 2019

Я читаю файл .h5 с модулем h5py. Здесь я пытаюсь добиться печати всех групп и всех наборов данных внутри группы, не зная структуру содержимого файла.
Я использую функцию visititems для перебора всех узлов файла.

Сначала мой код работает нормально, пока не выдаст ошибку:

TypeError: Не существует эквивалента NumPy для TypeBitfieldID


Я новичок в модуле h5py, поэтому кто-нибудь может сказать мне, почему это происходит? Этот код работает нормально для запуска итераций цикла, но позже некоторые наборы данных / узлы этого файла вызывают эту ошибку.

Насколько я понимаю, некоторые элементы (наборы данных или группы) из этого .hf-файла не читаются правильно.


Ссылка на этот файл .h5, который я использую:
https://cernbox.cern.ch/index.php/s/wk7SN1qt2O7jbrl

Это мой код:

AWAKE_csv = open('AWAKE_csv.csv', mode='w') 
AWAKE_writer = csv.writer(AWAKE_csv, delimiter=',')
AWAKE_writer.writerow(["GROUP", "DATASET", "SIZE", "SHAPE", "TYPE"])

def visitor_func(name, node):
    if isinstance(node, h5py.Dataset):
        print('Dataset: ' + name)

        out = node.dtype

        AWAKE_writer.writerow([' ', name, node.size, node.shape, out])
    else:
        print('Group: ' + name)
         # node is a group
        AWAKE_writer.writerow([name])


with h5py.File(glob.glob("*.h5")[0],'r') as f:
    f.visititems(visitor_func)


Строка в моем коде, которая выдает эту ошибку:

out = node.dtype

Ответы [ 2 ]

1 голос
/ 03 апреля 2019

С помощью этой функции посещения я могу получить информацию обо всех наборах данных, которые вызывают эту ошибку node.dtype:

def foo1(name,node):
    #print(name)
    if isinstance(node, h5py.Dataset):
        try:
            node.dtype
        except TypeError as err:
            print(name)
            print(node.size, node.shape)
            print(err)

Я получаю пару экранов с типичным дисплеем вроде:

0 (0,)
No NumPy equivalent for TypeBitfieldID exists
AwakeEventData/GD_BPM.AWAKE.TRIUMF/AcquisitionSPS/posOK
1 (1,)
No NumPy equivalent for TypeBitfieldID exists
AwakeEventData/GD_BPM.AWAKE.TRIUMF/GlobalAcquisition/posOK

Так что, если ваша цель - просто посетить все и отобразить информацию, которую вы можете, добавьте try/except, как это к вашей функции посещения.

Дисплей h5dump для одного из этих наборов данных:

2215:~/mypy$ h5dump -d /AwakeEventData/GD_BPM.AWAKE.TRIUMF/AcquisitionSPS/posOK ../Downloads/1541962108935000000_167_838.h5
HDF5 "../Downloads/1541962108935000000_167_838.h5" {
DATASET "/AwakeEventData/GD_BPM.AWAKE.TRIUMF/AcquisitionSPS/posOK" {
   DATATYPE  H5T_STD_B64LE
   DATASPACE  SIMPLE { ( 1 ) / ( H5S_UNLIMITED ) }
   DATA {
   (0): 80:17:00:00:00:00:00:00
   }
   ATTRIBUTE "bitFieldSize" {
      DATATYPE  H5T_STD_I64LE
      DATASPACE  SCALAR
      DATA {
      (0): 14
      }
   }
}
}

При добавлении print(list(node.attrs.values())) отображается атрибут bitFieldSize.

Есть и другие, не питоновские зрители. Я не знаю, может ли pytables или pandas прочитать этот файл или нет.

0 голосов
/ 04 апреля 2019

Да, этот файл представляет интересное любопытство. HDFView не имеет проблем с открытием или просмотром данных (даже проблемных). Я написал небольшой pytables код, чтобы пройтись по иерархии групп и сообщить имена листьев. Выдает это предупреждение для нескольких наборов данных:

DataTypeWarning: Unsupported type for attribute 'exception' in node 'BinningSetting'. Offending HDF5 class: 8

Когда я смотрю на эти наборы данных в HDFView, они показывают

Name: exception
Type: 8-bit enun (FALSE=0, TRUE=1)

К сожалению, я не знаю достаточно о HDF5 или pytables, чтобы объяснить, что происходит. Интересно, что некоторые из этих наборов данных отличаются от упомянутых @hpaulj.

Вот мой код (предупреждение: он создает гору вывода):

import tables as tb

h5f = tb.open_file('1541962108935000000_167_838.h5',mode='r')
for grp in h5f.walk_groups('/') : 
    grp_leaves = grp._v_leaves
    if len(grp_leaves) > 0 :
        print ('Group: ', grp)
        for grp_leaf in grp_leaves :
            print ('\tLeaf:', grp_leaf)

Первые несколько оскорбительных групп:

Group:  /AwakeEventData/XUCL-SPECTRO/BinningSetting
Group:  /AwakeEventData/XUCL-SPECTRO/CameraSettings
Group:  /AwakeEventData/XMPP-STREAK/StreakImage
Group:  /AwakeEventData/TT43.BPM.430308/Acquisition    
Group:  /AwakeEventData/TT41.BTV.412426/Image

Это помогает?

...