【问题标题】:Convert a binary string into IEEE-754 single precision - Python将二进制字符串转换为 IEEE-754 单精度 - Python
【发布时间】:2014-09-24 13:41:48
【问题描述】:

我有一个由 NumPy 创建的二进制矩阵。该矩阵有 5 行 32 列。

array([[1, 1, ..., 1, 1],
   [0, 1, ..., 0, 1],
   [1, 1, ..., 0, 1],
   [0, 0, ..., 1, 0],
   [1, 1, ..., 0, 1]])

我将矩阵行转换为字符串,并在整数旁边。

str = ''.join(map(str,array[0])).replace(' ','') 
int(str, base=2)

如何将字符串转换为浮点数(float32 - IEEE-754 single)?

【问题讨论】:

    标签: python arrays python-2.7 numpy floating-point


    【解决方案1】:

    使用struct.packstruct.unpack

    >>> a = [0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0,
    ...      1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1]
    >>> i = int(''.join(map(str, a)), 2)
    >>> import struct
    >>> struct.unpack('f', struct.pack('I', i))[0]
    1.100000023841858
    

    import struct
    
    matrix = array(...)
    
    st_i = struct.Struct('I')
    st_f = struct.Struct('f')
    float_values = [
        st_f.unpack(st_i.pack(int(''.join(map(str, a)), 2)))
        for a in matrix
    ]
    

    注意:根据数组的字节序,需要在结构体格式前加上<>

    顺便说一句,覆盖str 不是一个好主意。赋值后不能使用str 函数/类型。

    【讨论】:

      【解决方案2】:

      这有点令人费解,但您可以在单个衬里中获得与原始代码相同的结果:

      In [61]: a = np.random.randint(2, size=(5, 32))
      
      In [62]: for x in a:
         ....:             x_t = ''.join(map(str, x))
         ....:             print x_t, int(x_t, 2)
         ....:
      11111111100000111010110110101100 4286819756
      01001000110000111001000100011110 1220776222
      10101111100100010000111010100111 2945519271
      01101111101100011111101001100110 1873934950
      11001000110101000111010100000011 3369366787
      
      In [63]: np.packbits(a.reshape(-1, 8)).reshape(-1, 4)[:, ::-1].copy().view(np.uint32)
      Out[63]:
      array([[4286819756],
             [1220776222],
             [2945519271],
             [1873934950],
             [3369366787]], dtype=uint32)
      

      【讨论】:

        猜你喜欢
        • 2013-10-04
        • 2011-11-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-31
        • 1970-01-01
        相关资源
        最近更新 更多