python - 如何将 bytes 对象分配给 NumPy 数组切片?

标签 python arrays numpy byte

我想使用 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)将字节解码为字符。对于 bytearraymemoryview,意味着每个字节都是独立的。

关于python - 如何将 bytes 对象分配给 NumPy 数组切片?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56566984/

相关文章:

python - 在 App Engine NDB 模型中,是否需要显式缓存对相关模型的引用以最小化查询成本并优化性能?

python - 如何让 numpy 不以科学记数法打印

arrays - 在 Go 中,如何将 [16]float32 转换为 *float32

python - 堆叠一个方形 DataFrame 以仅保留上/下三角形

python - 为什么在 numpy `nan == nan` 中为 False 而 [nan] 中的 nan 为 True?

python - 为什么 Spyder 不获取全局变量?

python - R 和 Python 中 `medcouple()` 实现的区别

python - VideoCapture Opencv 中的 icvOpenAVI_XINE() 错误

C# 使用数组编码(marshal)结构

arrays - 如何从 int[][] 中提取行作为 postgres 中的 int[]