首页 > 解决方案 > 使用 Python 从字符串中提取 2 位整数

问题描述

我正在使用 python 通过 UDP 接收字符串。我需要从字符串中的每个字符中提取 4 对位并将它们转换为整数。

例如,如果字符串中的第一个字符是“J”,则这是 ASCII 0x4a 或 0b01001010。因此,我将提取位对 [01, 00, 10, 10],然后将其转换为 [1, 0, 2, 2]。

速度是我在这里的第一要务,所以我正在寻找一种快速的方法来实现这一点。

非常感谢任何帮助,谢谢。

标签: pythonnumpy

解决方案


您可以使用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

推荐阅读