我正在寻找一种更有效的方法来做相同的
myarray * (2**arange(len(myarray))
基本上我是在numpy.packbits
之类的东西,它将这些位打包成一个整数,用于任何合理大小的myarray
,产生一个合适的大小整数。我可以使用numpy.packbits
来实现这一点,但我在那里徘徊已经有了内置功能。</ p>
答案 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可以带来很大的改进。