2015-02-06 153 views
2

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

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方法使其工作尽可能快。

+0

”256位中的哪一位被设置为1“您使用的数字最多为2 ** 32,即32位。当你谈到256位时,我得到的印象更多的是8位数字,最高可达256(无符号)。你的意思是? – 2015-02-06 13:19:50

+0

代码的第一行...它是一个bistring,它是一个包含8个位置的uint32数组,因此是我的256位。 – linhares 2015-02-06 14:35:10

+0

啊,现在明白了。感谢您的澄清。 – 2015-02-06 14:48:18

回答

3

我不确定您是要计算“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的内存。这是处理与内存消耗的经典权衡。 “

+1

位移!当然!我会做一些性能基准测试... 谢谢! – linhares 2015-02-06 16:43:47

1

您可以在python将数字转换成二进制字符串bin

n = 4187390046 
binary_str = bin(n) 

其中产量

Out[7]: '0b11111001100101101000000001011110' 

然后你就可以找到1各项指标在该字符串的东西,如

def find_ones(s): 
    return [i - 2 for i, bit in enumerate(s) if bit == '1'] 

因为二进制字符串具有前导0b您应该调整值相应

+0

谢谢。我会做一些性能基准测试,然后在这里返回一些结果。 – linhares 2015-02-06 12:50:52

3

您可以使用[np.unpackbits] 1,但你必须首先查看阵列np.uint8,并照顾你搞清楚你的​​系统的字节序如何影响结果的自我你:

>>> np.unpackbits(bitstring.view(np.uint8)) 
array([1, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 
     1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 
     0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 1, 
     1, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 
     1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1, 
     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 
     1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 
     1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 1, 
     0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 
     1, 0, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 
     0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 
     0, 0, 0], dtype=uint8) 
+0

我会检查出来,所以一些基准。谢谢! – linhares 2015-02-06 14:36:25

相关问题