Чтение в двоичном файле с dtype вызывает ValueError - PullRequest
0 голосов
/ 03 сентября 2018

У меня есть двоичный файл, который я хочу прочитать с помощью подпрограммы Python. Для этого создается объект dtype, который описывает, как выглядят данные. Объект dtype, который должен быть создан, представляет собой словарь в форме {'field1': ..., 'field2': ..., ...}. obj тогда является кортежем (тип данных, смещение) - (см. документация numpy ). Ошибка теперь возникает, если смещение превышает диапазон C int во время создания dtype.

Минимальный пример для воспроизведения ошибки:

dict_tmp = dict()
offset = 2281832888
dict_tmp['/timedisc/pressure'] = ('(4096, 4096)>f8', offset)
dtype = np.dtype(dict_tmp)

ValueError: целое число не помещается в C int

Если я уменьшу смещение ниже диапазона 32-битного целого числа, ошибка, конечно, исчезнет. Я уже пытался привести значение смещения к int64 или uint32 вручную, но это также не работало. Насколько я вижу, dtype является частью multiarray в numpy, и в этот момент я немного растерялся.

Есть ли возможность загрузить данные и обойти ошибку?

1 Ответ

0 голосов
/ 04 сентября 2018

Типы dty действительно ограничены смещениями int32 (например, <2 ^ 31, см. Также <a href="https://github.com/numpy/numpy/issues/11869#issuecomment-418330815" rel="nofollow noreferrer">https://github.com/numpy/numpy/issues/11869#issuecomment-418330815) Я предполагаю, что вы хотите использовать этот dtype для чтения из файла, используя numpy memmap. Это может быть достигнуто с помощью этого фрагмента:

f = np.memmap(file)
arr1 = np.ndarray(buffer=f, dtype=np.dtype('<f8'), shape=(4096,4096), offset=2281832888)

Построение ndarray, как это на самом деле, делает внутреннее memmap, но в этом решении dtype не должен хранить смещение, но он напрямую передается конструктору ndarray.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...