在一个大的numpy数组中复制位

2024-06-03 05:13:58 发布

您现在位置:Python中文网/ 问答频道 /正文

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


示例:

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

二进制输入是

000  101  010  111

手术后,我想把钻头

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

如前所述,我的数组很大,所以我更喜欢使用数量最少的临时/辅助数组。你知道吗

我试着在Google或者甚至Bit Twiddling Hacks上找到一些与之相近的东西,但运气不好。你知道吗

提前谢谢!你知道吗


Tags: numpy示例数量google二进制bit符号整数
1条回答
网友
1楼 · 发布于 2024-06-03 05:13:58

实施

这种天真的方式在我看来已经相当有效了:

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

基准

我运行代码如下:

import numpy as np
import time

array = np.arange(2 ** 27, dtype=np.uint64)
pos = 5

t = time.process_time()
mask = np.uint64(-1 << (pos + 1))
array = (array << 1) & mask | array & ~mask
print(time.process_time() - t)

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

相关问题 更多 >