首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将bytearray转换为numpy数组的最快方法

将bytearray转换为numpy数组的最快方法
EN

Stack Overflow用户
提问于 2020-08-15 00:24:13
回答 1查看 707关注 0票数 1

我有一个要转换为int16的numpy数组的bytearray,以便对其执行快速傅立叶变换操作。字节数组来自UDP套接字,所以我首先使用struct.unpack将两个连续的字节转换为int16,然后使用np.asarray将其转换为numpy数组。

然而,目前的方法太慢了。原始bytearray的长度为1e6字节,因此所提到的每个步骤(struct.unpacknp.asarray)都需要20ms,总共需要40ms。对于我的应用程序来说,这是一个相对较长的帧时间,所以我需要把它缩短一点。

目前,我正在做这件事:

代码语言:javascript
运行
复制
temp1 = self.data_buffer[0:FRAME_LEN_B]
self.temp_list = np.asarray(struct.unpack('h' * (len(temp1) // 2), temp1))
EN

Stack Overflow用户

回答已采纳

发布于 2020-08-15 01:55:58

你可以试试np.frombuffer。这可以将任何支持buffer protocol的对象包装到一个数组中,bytearray明确地做到了这一点:

代码语言:javascript
运行
复制
arr = np.frombuffer(self.data_buffer, dtype=np.int16, size=FRAME_LEN_B // 2)

在此之后,您可以随心所欲地操作数组:切片、重塑、转置等。

如果您的本地字节顺序与您从网络传入的字节顺序相反,您可以交换解释顺序,而不必就地交换数据:

代码语言:javascript
运行
复制
dt = np.dtype(np.int16)
dt.newbyteorder('>')
arr = np.frombuffer(self.data_buffer, dtype=dt, size=FRAME_LEN_B // 2)

如果顺序是非本机的,则阵列上的操作可能需要更长的时间,因为每次都必须在运行时交换数据。因此,如果是这种情况,您可以提前就地更改字节顺序:

代码语言:javascript
运行
复制
arr.byteswap(inplace=True)

这将覆盖原始数据包的内容。如果您想创建单独的副本,只需设置inplace=False,这是默认设置。

票数 3
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63416553

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档