从布尔 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 可带来重大改进。
我正在寻找一种更有效的方法来完成
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 可带来重大改进。