从十六进制字符串构建一个Numpy数组

5

我有一个十六进制字符串"89-50-4E-47-0D-0A-1A-0A-00-00-00-0D-49",具体来说,它包含了一张图片的数据。

我想将其转换为Numpy数组,或者可能从该数据重建一个OpenCV图像。

同时提供了宽度和高度,所以Numpy数组的尺寸已知。

如何从上述字符串构造一个Numpy数组?


np.array([int(x, 16) for x in "89-50-4E-47-0D-0A-1A-0A-00-00-00-0D-49".split("-")]) - Olvin Roght
以上字符串的尺寸是多少? - Patrick Artner
@PatrickArtner 这是一个函数,因此维度将在运行时提供。它将构造一个二维数组,其中行和列作为高度和宽度。 - max
5个回答

3
我们可以使用np.fromiter,并使用int中的base参数将单个字符串转换为十六进制,然后使用np.fromiter中的dtype参数将其转换为整数类型:
s = "89-50-4E-47-0D-0A-1A-0A-00-00-00-0D-49"

np.fromiter((int(x, 16) for x in s.split('-')), dtype=np.int32)
# array([137,  80,  78,  71,  13,  10,  26,  10,   0,   0,   0,  13,  73])

1
你可以使用 列表推导式 和内置的 int 模块将分割后的字符串从十六进制转换为十进制:
import numpy as np

hex_string = '89-50-4E-47-0D-0A-1A-0A-00-00-00-0D-49'
np.array([int(x, base=16) for x in hex_string.split('-')])

0
你可以通过破折号将字符串进行分割,并将单个十六进制数转换为int
>>> import numpy as np
>>> hext_str = "89-50-4E-47-0D-0A-1A-0A-00-00-00-0D-49"
>>> np.array([int(x, 16) for x in hex_str.split("-")])
array([137,  80,  78,  71,  13,  10,  26,  10,   0,   0,   0,  13,  73])

假设(n, m)是您的图像的尺寸,您可以使用np.array.reshape((n, m))方法对结果进行处理。


0
import numpy as np
arr = np.array([int(x, 16) for x in "89-50-4E-47-0D-0A-1A-0A-00-00-00-0D-49".split("-")])
print(arr)

0
如果内存效率是一个问题,那么十六进制数中的两个数字对应于无符号8位整数(即0到255之间的数字)。
要返回原始字符串,您可以使用format(number, '02x')(零填充2位十六进制数字符串)。
hex_str = "89-50-4E-47-0D-0A-1A-0A-00-00-00-0D-49"
arr = np.fromiter((int(x, 16) for x in hex_str.split('-')), dtype=np.uint8)
# array([137,  80,  78,  71,  13,  10,  26,  10,   0,   0,   0,  13,  73],
      dtype=uint8)

数组只占用13字节的空间,相比于整数的默认数组类型(np.int64)占用104字节的空间。
可以通过以下方式将其返回到原始字符串形式:
hex_str = '-'.join((format(x, '02x') for x in arr)).upper()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接