繁体   English   中英

将字节数组转换为 numpy 数组的最快方法

[英]Fastest way to convert a bytearray into a numpy array

我有一个字节数组,我想将其转换为bytearrayint16数组以执行 FFT 操作。 bytearray 来自 UDP 套接字,所以首先我使用 struct.unpack 将两个连续字节转换为int16 ,然后使用struct.unpack将其转换为np.asarray数组。

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

目前,我正在这样做:

temp1 = self.data_buffer[0:FRAME_LEN_B]
self.temp_list = np.asarray(struct.unpack('h' * (len(temp1) // 2), temp1))

你可以试试np.frombuffer 这可以将任何支持缓冲区协议的 object (bytearray明确执行)包装到一个数组中:

arr = np.frombuffer(self.data_buffer, dtype=np.int16, size=FRAME_LEN_B // 2)

之后,您可以随心所欲地操作数组:切片、整形、转置等。

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

dt = np.dtype(np.int16)
dt.newbyteorder('>')
arr = np.frombuffer(self.data_buffer, dtype=dt, size=FRAME_LEN_B // 2)

如果订单是非本地的,则对数组的操作可能需要更长的时间,因为每次都必须即时交换数据。 因此,如果是这种情况,您可以提前就地更改字节顺序:

arr.byteswap(inplace=True)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM