Как назначить байтовый объект на фрагмент массива NumPy? - PullRequest
1 голос
/ 12 июня 2019

Я хочу использовать массивы NumPy для эффективной работы с большими байтовыми массивами. К сожалению, присвоение объекта bytes срезу массива NumPy не работает так, как я ожидал:

import struct
import numpy as np

array = np.zeros(10, dtype=np.uint8)

# Store 65535 into the first two bytes
array[0:2] = struct.pack('<H', 65535)            # does not work

print(array)

Это приводит к следующему исключению:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xff in position 0: ordinal not in range(128)

В этом примере объект bytes является результатом вызова struct.pack. При переносе результата в bytearray все работает так, как задумано, но я думаю, что при этом будет выполняться ненужная операция копирования (а это не то, что мне нужно):

array[0:2] = bytearray(struct.pack('<H', 65535)) # works

Почему объект bytes здесь не работает? Тот факт, что bytearray является изменяемым, тогда как bytes не является изменением, здесь не должен иметь значения.

Я использую NumPy версии 1.16.4.

1 Ответ

2 голосов
/ 12 июня 2019

Вы можете создать memoryview, который ссылается на базовый буфер.Это должно избегать создания копии.

array[:2] = memoryview(struct.pack('<H', 65535))
array
# array([255, 255,   0,   0,   0,   0,   0,   0,   0,   0], dtype=uint8)

Кажется, вы не можете назначить строку байтов напрямую, поскольку NumPy пытается декодировать байты в символы в соответствии со схемой кодирования (которая объясняет UnicodeDecodeError) перед назначением,С bytearray или memoryview подразумевается, что каждый байт является отдельным.

...