gpt4 book ai didi

python - 将二进制 Numpy 数组转换为无符号整数

转载 作者:行者123 更新时间:2023-11-30 22:30:03 27 4
gpt4 key购买 nike

我有一个 Numpy 数组对象的长二维矩阵,其维度为 n x 12。这是该矩阵的前 10 行:

b = ([[0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0],
[0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0],
[0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0],
[0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0],
[0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0],
[0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0],
[0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0],
[0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0],
[0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0],
[0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0]], dtype=uint8)

我想要对这个数组执行的操作是将其转换为无符号整数。据我所知,最快的方法是使用 np.packbits 函数。然而,这个函数只将 8 位打包成整数,而上面的数组每行有 12 位。将上面的数组转换为无符号整数时我期望的是:

250, 248, 248, 250, 248, 248, 248, 248, 248, 248

有人知道如何得到上述结果吗?我还尝试了上面的 np.packbits 将位扩展到 16 (`.view('u2'),结果仍然不符合我的预期。任何反馈将不胜感激。谢谢。

最佳答案

我们可以切出前 4 列和最后 8 列并使用 np.packbits分别对那些。然后,缩放第一个切片以考虑它们是其中最重要的 block ,并添加第二个切片。

因此,实现将是 -

slice0 = np.packbits(b[:,:-8], axis=-1).astype(np.uint16) * 16
slice1 = np.packbits(b[:,-8:], axis=-1).astype(np.uint16)
out = slice0 + slice1

或者,将sum-redcutionmatrix-multiplication结合使用 -

b.dot(2**np.arange(b.shape[1]-1,-1,-1))

示例运行 -

In [1045]: b
Out[1045]:
array([[0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0],
[0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0],
[0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0],
[0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0],
[0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0],
[0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0],
[0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0],
[0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0],
[0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0],
[0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0]], dtype=uint8)

In [1046]: slice0 = np.packbits(b[:,:-8], axis=-1).astype(np.uint16) * 16
...: slice1 = np.packbits(b[:,-8:], axis=-1).astype(np.uint16)
...: out = slice0 + slice1
...:

In [1047]: out.ravel()
Out[1047]: array([1786, 248, 248, 250, 248, 248, 248, 248, 1272, 760])

In [1048]: b.dot(2**np.arange(b.shape[1]-1,-1,-1))
Out[1048]: array([1786, 248, 248, 250, 248, 248, 248, 248, 1272, 760])

关于python - 将二进制 Numpy 数组转换为无符号整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46184684/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com