python - Numpy:检查数组中的某个位是否设置为 1 或 0?

标签 python numpy bit-manipulation bit bitstring

假设如下:

bitstring = numpy.random.random_integers(0,2**32,size=8).astype(numpy.uint32)

如何找出 256 位中的哪些设置为 1?我知道了……但这太疯狂了,不是吗?

maximum = (2**32)-1
for checkbit in range (256):
    yes = bool(numpy.bitwise_and((2**checkbit)%maximum, bitstring[  (  (checkbit // maximum) + checkbit % maximum ) // 32  ] ) )
    print 'bit', checkbit, 'set to', yes, 'in string', (  (checkbit // maximum) + checkbit % maximum ) // 32

我相信答案可能非常简单,但谷歌根本没有帮助,this related question is referring only to bytes .

由于我需要执行此操作数十亿次,所以我想知道是否有一种 pythonic 方法可以使其尽可能快地运行。

最佳答案

我不确定你是想计算“1”位的数量还是检查是否设置了特定位。

要检查,我想更简单的方法是: bool(n&(1<<b)) ,其中 n 是被测试的数字, b 是位(从 0 开始)。

要计算“1”位的个数,我想没有什么比查找表更快的了。 例如,您可以使用 65k 内存并将 256 位分成 16 组,每组 16 位。然后,您在表中查找计数器的值。

为了生成表格,您可以使用任何其他提到的方法。例如:

table = [bin(i).count('1') for i in xrange(1<<16)]

然后,要计算位数,您可以将表格中的值相加,例如:

n = 0x123456789123456789
cnt = 0
while n > 0:
    cnt += table[n%((1<<16)-1)]
    n >>= 16

如果你有足够的内存,你可以增加你的表。对于 32 位表,您将需要 4GB 内存。这是处理与内存消耗的经典权衡。

关于python - Numpy:检查数组中的某个位是否设置为 1 或 0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28365958/

相关文章:

python - 将 Python 标准 IO 暴露给子进程

python - 如何选择 numpy 记录数组一行的列子集?

python - 为什么不是 numpy.mean 多线程?

c - 如何在不影响其他位的情况下将 uint8_t 放在 uint16_t 中间

python - 如何在Python中仅针对特定数字字符重新格式化字母数字字符串?

python - 尝试解压 simple.txt 文件时出现 ValueError : too many values to unpack,

algorithm - 计算每个位在整数范围内设置的次数

c - 使用按位运算符 ~ 和 & 使 |运算符(operator)

python - 如何将惰性变量传递给函数参数而不对其求值,除非返回

python - 性能:扩大二值图像(形态膨胀)