将字节类型转换为浮点数



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

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

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

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

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]

如果我们从一个列表开始,列表理解通常更快。 但是从数组开始可能会更慢。 虽然这里的样本很小,而且字符串相等性测试并不像数字运算那么快。

最新更新