将字节类型转换为浮点型

时间:2019-06-05 23:13:29

标签: python python-3.x numpy

我有一个numpy数组:

import numpy as np
Boolval = np.array([b'false',b'true',b'false',b'false',b'false',b'false',b'false',b'false'])

我正在尝试将每个值转换为值为0或1的整个数组(例如[0, 1, 0, 0, 0, 0, 0])。

我尝试了以下操作:

import struct
print(struct.unpack('f',Boolval))

它引发错误:struct.error: unpack requires a buffer of 4 bytes

我只尝试了一个值

print(struct.unpack("f", Boolval[1]))

它给出(7.24431922380234e+22,)的值。不是1或0。

2 个答案:

答案 0 :(得分:4)

它们不是字节值,而是二进制字符串。尝试类似

>>> [int(b == b'true') for b in Boolval]
[0, 1, 0, 0, 0, 0, 0, 0, 0]

这将检查项目是否等于b'true'并将真值(TrueFalse)转换为int

答案 1 :(得分:2)

In [253]: Boolval = np.where([0,1,0,0,1,0,1],b'true',b'false')                                         
In [254]: Boolval                             # the repr display                                                         
Out[254]: 
array([b'false', b'true', b'false', b'false', b'true', b'false', b'true'],
      dtype='|S5')
In [255]: print(Boolval)                 # the str display                                                              
[b'false' b'true' b'false' b'false' b'true' b'false' b'true']

In [256]: Boolval!=b'false'                                                                            
Out[256]: array([False,  True, False, False,  True, False,  True])
In [257]: Boolval==b'true'                                                                             
Out[257]: array([False,  True, False, False,  True, False,  True])

我们可以将其转换为布尔数组,并与字节串进行比较:

In [256]: Boolval!=b'false'                                                                            
Out[256]: array([False,  True, False, False,  True, False,  True])
In [257]: Boolval==b'true'                                                                             
Out[257]: array([False,  True, False, False,  True, False,  True])

并转换为经过astype转换的整数数组:

In [258]: (Boolval!=b'false').astype(int)                                                              
Out[258]: array([0, 1, 0, 0, 1, 0, 1])

In [259]: np.where(Boolval==b'true')                                                                   
Out[259]: (array([1, 4, 6]),)

列表理解方法:

In [260]: [int(b == b'true') for b in Boolval]                                                         
Out[260]: [0, 1, 0, 0, 1, 0, 1]

如果我们从列表开始,列表理解通常会更快。但是从数组开始可能会比较慢。尽管这里的样本很小,并且字符串相等性测试的速度不如数值运算快。