大块numpy数组中的重复位

时间:2017-04-12 19:53:06

标签: python numpy bit-manipulation

我有一个大的numpy数组(即大约2 ** 32个位置)的64位无符号整数,我想在这个数组中的每个整数中复制一个位(可以在0到63之间变化)。

示例:

  • 输入数组:array([ 0, 5, 2, 7 ])
  • 复制的位置(从右到左):0

二进制输入是

000  101  010  111

操作完成后,我希望这些位为

0000 1011 0100 1111
  • 结果:array([ 0, 11, 4, 15 ])

如前所述,我的阵列非常庞大,所以我更倾向于使用最少数量的临时/辅助阵列。

我试图在谷歌甚至Bit Twiddling Hacks中找到与它接近的东西而没有运气。

提前致谢!

1 个答案:

答案 0 :(得分:1)

实施

天真的方式对我来说已经非常有效了:

if(condition){x=this}else{x=that}

基准

我按如下方式运行代码:

mask = -1 << (pos + 1)
(x << 1) & mask | x & ~mask

位复制耗时0.95秒(几次运行的平均值)。 由于内存问题,我只使用了2个 27 条目。但我们可以预期2 32 条目的时间为2 32-27 ×0.95 s = 2 5 ×0.95 s = 32×0.96 s = 30.4 s