Преобразовать тип байта в число с плавающей точкой - PullRequest
1 голос
/ 06 июня 2019

У меня есть массив 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 ]

4 голосов
/ 06 июня 2019

Это не байтовые значения, это двоичные строки. Попробуйте что-то вроде

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

Это проверит, равен ли элемент b'true', и преобразует значение истинности (True или False) в int.

2 голосов
/ 06 июня 2019
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]

Если мы начнем со списка, его понимание часто происходит быстрее. Но, начиная с массива, он, скорее всего, будет медленнее. Хотя здесь пример небольшой, и тест на равенство строк не так быстр, как числовые операции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...