将numpy数组的部分转换为base 10的快速方法

时间:2017-12-13 00:38:14

标签: python arrays numpy binary

假设我得到了一个形式为

的numpy整数数组
a=np.array([0,0,0,1,1,0,1,0,1,0,1])

现在假设我想从位置i1:i2中提取该数组的一部分,并将其转换为基数10表示。例如,取i1=4i2=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"""

3 个答案:

答案 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)