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

Efficiently build an integer from bits of a boolean Numpy array

我正在寻找一种更有效的方法来完成

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

本质上,我是在追求类似 numpy.packbits 的东西,它将位打包成一个整数,用于任何合理大小的 myarray 产生一个适当大小的整数。我可以使用 numpy.packbits 来实现这个,但我一直在徘徊,那里已经有一个内置函数可以做到这一点。

三个版本:

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 可带来重大改进。