python - 使用 Python 从字符串中提取 2 位整数
问题描述
我正在使用 python 通过 UDP 接收字符串。我需要从字符串中的每个字符中提取 4 对位并将它们转换为整数。
例如,如果字符串中的第一个字符是“J”,则这是 ASCII 0x4a 或 0b01001010。因此,我将提取位对 [01, 00, 10, 10],然后将其转换为 [1, 0, 2, 2]。
速度是我在这里的第一要务,所以我正在寻找一种快速的方法来实现这一点。
非常感谢任何帮助,谢谢。
解决方案
您可以使用np.unpackbits
def bitpairs(a):
bf = np.unpackbits(a)
return bf[1::2] + (bf[::2]<<1)
### or: return bf[1::2] | (bf[::2]<<1) but doesn't seem faster
### small example
bitpairs(np.frombuffer(b'J', 'u1'))
# array([1, 0, 2, 2], dtype=uint8)
### large example
from string import ascii_letters as L
S = np.random.choice(array(list(L), 'S1'), 1000000).view('S1000000').item(0)
### one very long byte string
S[:10], S[999990:]
# (b'fhhgXJltDu', b'AQGTlpytHo')
timeit(lambda: bitpairs(np.frombuffer(S, 'u1')), number=1000)
# 8.226706639004988
推荐阅读
- python - 使用 vJoy 模拟渐变踏板输入
- apache - debian 10 apache子域重定向到主域
- graphql - React-slick 与 gatsby-plugin-image
- facebook - 永久菜单不显示
- list - 如何使用数字和字母正确排序 Flutter 列表
- sql - 注入安全“SELECT FROM table WHERE column IN list;” 使用 python3 和 sqlite3
- ios - 在 Swift 中的 SceneKit 场景中不断渲染新的子节点对象
- android - Android 在 onCreate 活动之外访问视图绑定 val
- sql - 在 Slick 中过滤时单引号会导致问题
- c# - 获得答案后,不再为用户分配相同的问题