2016-07-26 3 views
1

То, что я хочу сделать:

Преобразовать строку, представляющую процент хх% к поплавку между 0 и 1Numpy I/O: конвертирование% процент плавать между 0 и 1

Мой код:

#a. general case 
data = "1, 2.3%, 45.\n6, 78.9%, 0" 
names = ("i", "p", "n") 
a = np.genfromtxt(io.BytesIO(data.encode()), names = names, delimiter = ",") 
print (a)   # returns [(1.0, nan, 45.0) (6.0, nan, 0.0)] 
print (a.dtype)  # reason: default dtype is float, cannot convert 2.3%, 78.9% 


#b. converter case 
convertfunc = lambda x: float(x.strip("%"))/100  # remove % and return the value in float (between 0 and 1) 
b = np.genfromtxt(io.BytesIO(data.encode()), names = names, delimiter = ",", converters = {1:convertfunc}) # use indices for 2nd column as key and do the conversion 
print (b) 
print (b.dtype) 

Моя проблема:

в общем случае процент в% будет напечатано как нан. Поскольку тип dtype является float, процентное соотношение в% не может быть преобразовано. Таким образом, я попробовал метод конвертера.

Однако, когда я запускаю код, возникает ошибка:

convertfunc = lambda x: float(x.strip("%"))/100  # remove % and return the value in float (between 0 and 1) 
TypeError: a bytes-like object is required, not 'str' 

Любой знает, что здесь проблема? (Я использую python3.5)

Благодарим за любые ответы.

ответ

1

Вы не можете разделить объект байта как с объектом str viz '%'. Добавьте b в начало строки , чтобы сделать объект байтом.

convertfunc = lambda x: float(x.strip(b"%"))/100 
#         ^

b = np.genfromtxt(io.BytesIO(data.encode()), names = names, delimiter = ",", converters = {1:convertfunc}) 

print(b) 
# array([(1.0, 0.023, 45.0), (6.0, 0.789, 0.0)], 
# dtype=[('i', '<f8'), ('p', '<f8'), ('n', '<f8')]) 

Такие объекты с ведущим b относятся к классу bytes:

>>> type('%') 
<class 'str'> 
>>> type(b'%') 
<class 'bytes'> 
+0

Большое спасибо. Это действительно ответило на мой вопрос. –

 Смежные вопросы

  • Нет связанных вопросов^_^