"Pack" 一个 np.array 的 4 个 np.uint16 变成一个 np.unit64

"Pack" a np.array of 4 np.uint16 into a single np.unit64

给出 np.array 的 4 np.uint16

input = np.random.randint(10, size=4, dtype=np.uint16)

如何将它们的二进制表示“打包”成单个 np.uint64

# Example of C code
# output = input[0] | input[1] << 16 | input[2] << 32 | input[3] << 48

4 np.uint16 的包装顺序并不重要(前提是它不是随机的)。

这是一个解决方案:

output = np.bitwise_or.reduce(input << (np.arange(len(input)) * 16))

输出:

>>> output
281483566710792

(Side-note: 不要使用 Python 内置函数的名称(例如 input)作为变量名称。:)

您可以重新解释 个数组的字节 np.view:

input.view(np.uint64) # 844429225558024 on my x86-64 machine

这不执行任何复制或计算。它执行得很快,而且 constant-time。但是,由于 endianness,字节的顺序是 architecture-dependent。它在大多数架构上是 little-endian,包括 x86-64、大多数 ARM 处理器和最近的 POWER 处理器。

注意input.view(np.uint64).view(np.uint16)保证给你这里的输入数组

请注意,关于所需的字节顺序,您可以 swap the bytes Numpy 数组。