我想使用 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。
最佳答案
您可以创建 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
,意味着每个字节都是独立的。
关于python - 如何将 bytes 对象分配给 NumPy 数组切片?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56566984/