【问题标题】:Why numpy tobytes() method return not only hex digits, but also additional characters?为什么 numpy tobytes() 方法不仅返回十六进制数字,还返回其他字符?
【发布时间】:2020-11-01 06:17:36
【问题描述】:

当我使用 numpy .tobytes() 方法并打印我得到的字符串时: b'\x1d\x00\xd8\xff=\x00\xa6\xff\x9b\x00\xc0\xfe\x03\n\x9b\x13\x04\x15k\x17. (...)

我知道对于每个字节,我都会得到 \x 2 个十六进制数字,但我也会得到更长的输入,例如 \xff=。在这种情况下,= 是什么意思?如何解释更长的序列,如$\x1fv!2$\x11%\x88

【问题讨论】:

  • A `b'...' 是一个字节串。我不确定是否值得尝试“阅读”它,至少对于非 ascii 值而言。

标签: python-3.x string numpy


【解决方案1】:

这不是 numpy 特定的行为,请查看 Pythons encoding guide,其中详细描述了 Python 3 的一般行为。

为了允许与任何 Unicode 字符一起表示人类可读的文本,字节表示二进制数据或原始字节序列。这意味着标准/可打印的 ASCII 字符不表示为十六进制数字,它们只是按原样添加到字符串

请看下面的例子:

>>> "résumé".encode("utf-8")
b'r\xc3\xa9sum\xc3\xa9'
>>> "El Niño".encode("utf-8")
b'El Ni\xc3\xb1o'

>>> b"r\xc3\xa9sum\xc3\xa9".decode("utf-8")
'résumé'
>>> b"El Ni\xc3\xb1o".decode("utf-8")
'El Niño'

如您所见,只有 ñé 等非标准/可打印的 ASCII 字符被编码为十六进制值。

【讨论】:

    【解决方案2】:

    对于 ascii 值,tobytes 产生预期的字节串:

    In [272]: np.array(['1','a','A','_'],'S1')
    Out[272]: array([b'1', b'a', b'A', b'_'], dtype='|S1')
    In [273]: _.tobytes()
    Out[273]: b'1aA_'
    

    或者对于一些小数字:

    In [279]: np.arange(9).astype('uint8').tobytes()
    Out[279]: b'\x00\x01\x02\x03\x04\x05\x06\x07\x08'
    

    查看您的示例字符串:

    In [303]: astr = b'\x1d\x00\xd8\xff=\x00\xa6\xff\x9b\x00\xc0\xfe\x03\n\x9b\x13\x
         ...: 04\x15k\x17'
    In [304]: len(astr)
    Out[304]: 20
    

    它可以转换回数组,但我们必须指定dtype:

    In [305]: np.frombuffer(astr,'S1')
    Out[305]: 
    array([b'\x1d', b'', b'\xd8', b'\xff', b'=', b'', b'\xa6', b'\xff',
           b'\x9b', b'', b'\xc0', b'\xfe', b'\x03', b'\n', b'\x9b', b'\x13',
           b'\x04', b'\x15', b'k', b'\x17'], dtype='|S1')
    In [306]: np.frombuffer(astr,'uint8')
    Out[306]: 
    array([ 29,   0, 216, 255,  61,   0, 166, 255, 155,   0, 192, 254,   3,
            10, 155,  19,   4,  21, 107,  23], dtype=uint8)
    In [307]: np.frombuffer(astr,'uint17')
    Traceback (most recent call last):
      File "<ipython-input-307-45de956fd32b>", line 1, in <module>
        np.frombuffer(astr,'uint17')
    TypeError: data type 'uint17' not understood
    
    In [308]: np.frombuffer(astr,'uint16')
    Out[308]: 
    array([   29, 65496,    61, 65446,   155, 65216,  2563,  5019,  5380,
            5995], dtype=uint16)
    

    ===

    '=' 本身就是一个字节,而不是 `\xff' 的一部分:

    In [338]: astr[:6]
    Out[338]: b'\x1d\x00\xd8\xff=\x00'
    In [339]: list(astr[:6])
    Out[339]: [29, 0, 216, 255, 61, 0]
    In [340]: ord('=')
    Out[340]: 61
    

    【讨论】:

      猜你喜欢
      • 2021-08-31
      • 1970-01-01
      • 2016-11-07
      • 1970-01-01
      • 2018-03-08
      • 2013-04-07
      • 2011-07-22
      • 1970-01-01
      • 2020-07-29
      相关资源
      最近更新 更多