Построение структурированного скаляра из байтов - PullRequest
0 голосов
/ 30 октября 2018

Недавно я обнаружил, что вместо ctypes для обработки двоичных данных я использовал ntypty dtypes с чем-то вроде:

dt = np.dtype([
    ('header', np.uint16),
    ('points', ([
        ('x', np.int32),
        ('y', np.int32),
    ], (16,))),
])
buffer = file_like.read(dt.itemsize)  # type: bytes

Для целей тестирования можно предположить, что

buffer = bytes(range(dt.itemsize))

Я изо всех сил пытался найти хороший эквивалент ctypes.from_buffer. Вот некоторые варианты, которые я могу придумать:

  1. data = np.array(buffer).view(dt)[()]
  2. data = np.ndarray(shape=(), buffer=buffer, dt=dt)[()]
  3. data = np.frombuffer(buffer, dtype=dt).squeeze(axis=-1)[()]

Все это кажется довольно запутанным - я скучаю по лучшему пути?

1 Ответ

0 голосов
/ 30 октября 2018

data = np.void(buffer).view(dt) обладает желаемыми свойствами:

  • Short
  • Возвращает скаляр
  • Броски ValueError: new type not compatible with array. если len(buffer) != dtype.itemsize
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...