2015-02-06 72 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

相關問題