我有一个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。
答案 0 :(得分:4)
它们不是字节值,而是二进制字符串。尝试类似
>>> [int(b == b'true') for b in Boolval]
[0, 1, 0, 0, 0, 0, 0, 0, 0]
这将检查项目是否等于b'true'
并将真值(True
或False
)转换为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]
如果我们从列表开始,列表理解通常会更快。但是从数组开始可能会比较慢。尽管这里的样本很小,并且字符串相等性测试的速度不如数值运算快。