我有一个要转换为int16的numpy数组的bytearray,以便对其执行快速傅立叶变换操作。字节数组来自UDP套接字,所以我首先使用struct.unpack将两个连续的字节转换为int16,然后使用np.asarray将其转换为numpy数组。
然而,目前的方法太慢了。原始bytearray的长度为1e6字节,因此所提到的每个步骤(struct.unpack和np.asarray)都需要20ms,总共需要40ms。对于我的应用程序来说,这是一个相对较长的帧时间,所以我需要把它缩短一点。
目前,我正在做这件事:
temp1 = self.data_buffer[0:FRAME_LEN_B]
self.temp_list = np.asarray(struct.unpack('h' * (len(temp1) // 2), temp1))发布于 2020-08-15 01:55:58
你可以试试np.frombuffer。这可以将任何支持buffer protocol的对象包装到一个数组中,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,这是默认设置。
https://stackoverflow.com/questions/63416553
复制相似问题