从布尔Numpy数组的位有效地构建一个整数

时间:2016-01-31 11:03:07

标签: python numpy bit-manipulation

我正在寻找一种更有效的方法来做相同的

myarray * (2**arange(len(myarray))

基本上我是在numpy.packbits之类的东西,它将这些位打包成一个整数,用于任何合理大小的myarray,产生一个合适的大小整数。我可以使用numpy.packbits来实现这一点,但我在那里徘徊已经有了内置功能。<​​/ p>

1 个答案:

答案 0 :(得分:2)

三个版本:

from numpy import *
from numba import jit

myarray=random.randint(0,2,64).astype(uint64) 

def convert1(arr) : return (arr*(2**arange(arr.size,dtype=uint64))).sum()

pow2=2**arange(64,dtype=uint64)
def convert2(arr) : return (arr*pow2[:arr.size]).sum()

@jit("uint64(uint64[:])")
def convert3(arr):
    m=1
    y=0
    for i in range(arr.size):
        y=y + pow2[i] * arr[i]
    return y

有时间:

In [44]: %timeit convert1(myarray)
10000 loops, best of 3: 62.7 µs per loop

In [45]: %timeit convert2(myarray)
10000 loops, best of 3: 11.6 µs per loop

In [46]: %timeit convert3(myarray)
1000000 loops, best of 3: 1.55 µs per loop

预计算和Numba可以带来很大的改进。