gpt4 book ai didi

python - 有效地计算 python/numpy 中许多位串的平均位?

转载 作者:太空宇宙 更新时间:2023-11-03 11:20:42 26 4
gpt4 key购买 nike

我有几千个位串存储为 longs。每个位串为 1024 位。我想创建一个比率数组,每个位都是 1。

例如(伪代码):

bs = [
1 0 0 0,
0 1 1 0,
1 1 0 0,
0 0 0 0
]
ratios(bs) => [0.5, 0.5, 0.25 0.0]

我当前的慢代码是:

def mean_signature(bitstrings, bit_count):
means = []
for b in range(bit_count):
m = sum((x >> b) & 1 for x in bitstrings) / len(bitstrings)
means.append(m)
return means

我正准备修改代码,使外循环结束 bitstrings,但我想我一定遗漏了一些东西。也许使用 numpy 位数组。

最佳答案

这是您可以做到的一种方法,但这可能不是最有效的方法。

为了演示,我将使用 8 位整数,但它也适用于您的 1024 位整数。

In [28]: bs = [0b11110000, 0b11111100, 0b11000000, 0b11111110, 0b00001100]

In [29]: bs
Out[29]: [240, 252, 192, 254, 12]

In [30]: nbits = 8

In [31]: bits = np.array([list(np.binary_repr(b, width=nbits)) for b in bs], dtype=np.uint8)

In [32]: bits
Out[32]:
array([[1, 1, 1, 1, 0, 0, 0, 0],
[1, 1, 1, 1, 1, 1, 0, 0],
[1, 1, 0, 0, 0, 0, 0, 0],
[1, 1, 1, 1, 1, 1, 1, 0],
[0, 0, 0, 0, 1, 1, 0, 0]], dtype=uint8)

bits 是包含每个值的二进制表示的位的数组。您想要的比率是列的平均值:

In [33]: bits.mean(axis=0)
Out[33]: array([ 0.8, 0.8, 0.6, 0.6, 0.6, 0.6, 0.2, 0. ])

这些值的顺序是从最高位到最低位。结果的索引与通常的位索引匹配可能更自然。为此,只需反转结果:

In [34]: bits.mean(axis=0)[::-1]
Out[34]: array([ 0. , 0.2, 0.6, 0.6, 0.6, 0.6, 0.8, 0.8])

关于python - 有效地计算 python/numpy 中许多位串的平均位?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43468847/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com