Python 从布尔Numpy数组的位高效地构建整数

Python 从布尔Numpy数组的位高效地构建整数,python,numpy,bit-manipulation,Python,Numpy,Bit Manipulation,我正在寻找一种更有效的方法来做类似的事情 myarray * (2**arange(len(myarray)) 本质上,我追求的是像numpy.packbits这样的东西,它将位打包成一个整数,用于任何合理大小的myarray生成一个适当大小的整数。我可以使用numpy.packbits实现这一点,但我想知道已经有一个内置的可以实现这一点。三个版本: from numpy import * from numba import jit myarray=random.randint(0,2,64

我正在寻找一种更有效的方法来做类似的事情

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允许很大的改进。

你说的“内置”是什么意思?使用
numpy.packbits
有什么问题?Numba解决方案的最终结果几乎就是这样。我在循环中使用位运算而不是算术运算。两者之间没有明显的速度差异。