【问题标题】:Construct a Numpy array from a hexadecimal string从十六进制字符串构造一个 Numpy 数组
【发布时间】:2020-04-01 11:22:42
【问题描述】:

我有一个十六进制字符串"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("-")])
  • 以上字符串的尺寸是多少?
  • @PatrickArtner 这是一个函数,因此将在运行时提供尺寸。它将构造一个以行和列为高度和宽度的二维数组。

标签: python numpy numpy-ndarray


【解决方案1】:

我们可以使用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])

【讨论】:

    【解决方案2】:
    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)
    

    【讨论】:

      【解决方案3】:

      您可以通过破折号split 字符串并将单个base-16 数字转换为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) 是您可以在.reshape((n, m)) 方法np.array 的结果上使用的图像尺寸。

      【讨论】:

        【解决方案4】:

        您可以使用list comprehension 和内置的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('-')])
        

        【讨论】:

          【解决方案5】:

          如果关注内存效率,十六进制数中的两个数字对应于一个无符号的 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 个字节。

          Once 可以通过以下方式将其恢复为原始字符串形式:

          hex_str = '-'.join((format(x, '02x') for x in arr)).upper()
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-08-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-01-15
            • 2021-03-11
            • 1970-01-01
            • 2012-05-30
            相关资源
            最近更新 更多