2014-09-24 1 views
2

NumPy로 만든 이진 행렬이 있습니다. 행렬에는 5 행 32 열이 있습니다.이진 문자열을 IEEE-754 단 정밀도로 변환 - Python

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)로 변환 할 수 있습니까? struct.pack를 사용

답변

4

, struct.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을 사용할 수 없습니다.

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) 
관련 문제