python-3.x - 如何从字节数组中提取 2-9 位数组?
问题描述
我有一个 100,000 长的字节数组,其中每 16 位行是一个 10 位地址和连接的 6 位计数。我想以数组方式、有效的方式将 16×100,000 数组转换为两个单独的(地址和数据)数组。较短的运行时间对我的应用程序至关重要。
到目前为止我所拥有的是
- 将二进制文件读入 uint16 数组
f = open(curfile, mode="r")
aint = np.fromfile(f, dtype=np.uint16)
- 读取for循环中的每一行
line = '{0:15b}'.format(aint[nn])
- 从二进制中提取整数
addr[nn] = 2**8*return0ifempty(line[0]) + return0ifempty(line[1:9])
count[nn] = line[-6:]
(return0ifempty 在输入 ' ' 时返回 0)
整个 binary => uint16 => binary => uint16 的想法是极其低效的。必须有更好的方法来做到这一点。有什么方法可以像在 matlab 中那样截断数组,例如 A(5:10,:)?
解决方案
假设您想要低 10 位和高 6 位:
low_10 = aint & 1023
high_6 = aint >> 10
如果你想要低 6 位和高 10 位:
low_6 = aint & 63
high_10 = aint >> 6
与 Python 循环不同,它是矢量化的,运行速度要快得多(也不会转换为字符串)。
编辑:看你的例子,你想要 10 高的 addr 和 6 低的计数;所以...
count = aint & 63
addr = aint >> 6
一些解释63
:它是0b111111
,所以& 63
将保留 6 个低位并关闭任何高位。
推荐阅读
- node.js - 我在寻求有关 i118 express node.js 的帮助吗?
- reactjs - 盖茨比 react-spring-3d 问题
- mysql - 列别名上的 MySQL CASE 语句
- javascript - 恢复第二次点击的状态
- javascript - 一个按钮具有两种不同的单击和鼠标按下行为
- next.js - 如何在微应用上下文中集中哨兵配置文件?
- r - 在 Shiny Server 中 60 秒后下载错误
- python - 为列值的周数创建自定义列
- node.js - Visual Studio 2017:命令“gulp”退出,代码为 9009
- javascript - 如何在nodemailer中发送图像并将其作为html中的背景图像?