假设我得到了一个形式为
的numpy整数数组a=np.array([0,0,0,1,1,0,1,0,1,0,1])
现在假设我想从位置i1:i2
中提取该数组的一部分,并将其转换为基数10表示。例如,取i1=4
和i2=8
。然后:
base_2=a[i1:i2] # base_2 = np.array([1,0,1,0])
我希望函数返回10 = 2 + 8。
我的问题如下:在Python中实现这一目标的快速方法是什么?
考虑具有以下签名的函数:
def base_2_to_10_array(my_array,i1,i2):
return """your awesome answer here"""
答案 0 :(得分:3)
一种方式(不知道它是否是最快的)
>>> a=np.array([0,0,0,1,1,0,1,0,1,0,1])
>>> int(''.join(map(str, a[4:8])), 2)
10
答案 1 :(得分:1)
我认为更快(benchmark)的另一种方式是:
def base_2_to_10_array(arr, i1, i2):
res = 0
for bit in arr[i1:i2][::-1]:
res = (res << 1) ^ bit
return res
这可能更快,因为它完全是二进制操作(<<
和^
),它们都很快(^
更快,因为其中一个操作数很小,为0或者1)。
percusse 的答案可能较慢,原因是map
ping str
或者转化为int
(可能不是针对二进制优化)
type_none 的速度可能会因为重复调用lambda
而变慢,乘法而不是移位而是添加而不是oring。
基准测试结果示例:
Size: 10
percusse: 0.016117284998472314
type_none: 0.004335935998824425
pycoder_3rd_fastest: 0.0028656079957727343
pycoder_2nd_fastest: 0.0033370210003340617
pycoder_fastest: 0.0031539250048808753
Size: 100
percusse: 0.13562769599957392
type_none: 0.04904397700011032
pycoder_3rd_fastest: 0.016703221001080237
pycoder_2nd_fastest: 0.021887271002924535
pycoder_fastest: 0.019885091001924593
Size: 1000
percusse: 1.358273936995829
type_none: 0.7615448830038076
pycoder_3rd_fastest: 0.18778558799385792
pycoder_2nd_fastest: 0.20695334099582396
pycoder_fastest: 0.18905453699699137
Size: 10000
percusse: 14.638380388998485
type_none: 7.554422806002549
pycoder_3rd_fastest: 5.3742733830004
pycoder_2nd_fastest: 2.2020759820006788
pycoder_fastest: 1.9534191700004158
其他尝试,在较短的输入上更快,可以在基准链接中找到。
答案 2 :(得分:0)
我在这里使用了reduce
。与其他答案不同,这并不需要转换为字符串。
from functools import reduce # no need for import in python2
import numpy as np
def arrayToInt(l):
return reduce(lambda x,y: (x<<1) + y, l)
a=np.array([0,0,0,1,1,0,1,0,1,0,1])
number = arrayToInt(a[4:8])
print(number)