将二进制字符串转换为IEEE-754单精度 - Python

时间:2014-09-24 13:41:49

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

我有一个由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)

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

2 个答案:

答案 0 :(得分:4)

使用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
]

注意:根据数组的字节顺序,您需要在结构格式之前添加<>

BTW,覆盖str并不是一个好主意。在分配后,您无法使用str函数/类型。

答案 1 :(得分:1)

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

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)