"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 数组。
给出 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 数组。