ValueError: не удалось преобразовать строку в число с плавающей точкой --- как преобразовать список списков строк в число с плавающей точкой массива типа float? - PullRequest
0 голосов
/ 19 сентября 2018

Похоже, у меня есть неправильно сформированный массив numpy в Python3.x - он был сохранен как список списков строк.

foo = [[7.0352220e-01 5.3130367e-06 1.5167372e-05 1.0797821e-06]
  [1.3130367e-06 2.4584832e-01 2.2375602e-05 7.3299240e-06] [7.2646574e-06 7.1252006e-06 3.0184277e-01 ... 1.0048618e-05 3.1828706e-06 1.0196264e-06]..]

Я получаю следующую ошибку при попытке прочитать эти данные как np.float32 в массив numpy:

np.asarray(foo, dtype=np.float32)

ошибка:

ValueError: could not convert string to float:[[7.0352220e-01 5.3130367e-06 1.5167372e-05 1.0797821e-06][1.3130367e-06 2.4584832e-01 2.2375602e-05 7.3299240e-06] [7.2646574e-06 7.1252006e-06 3.0184277e-01 ... 1.0048618e-05 3.1828706e-06 1.0196264e-06]..]

IЯ пытался явно преобразовать каждый элемент списка в число с плавающей запятой следующим образом:

try2 = np.asarray(map(np.float32, foo))

, но он заключен в скобки:

ValueError: could not convert string to float: [

Какой рекомендуемый способ преобразования списка списковстрок в массив numpy, типа float?

Ответы [ 4 ]

0 голосов
/ 19 сентября 2018

Дано:

foo = [['7.0352220e-01 5.3130367e-06 1.5167372e-05 1.0797821e-06'],
       ['1.3130367e-06 2.4584832e-01 2.2375602e-05 7.3299240e-06'], 
       ['7.2646574e-06 7.1252006e-06 3.0184277e-01 1.0048618e-05']]

Попробуйте разделить каждую строку

foo = [row[i].split() for row in foo for i in range(len(foo[0]))]

Это для смены типа на float.

foo = [[float(row[i]) for i in range(len(foo[0]))] for row in foo]

print(type(foo[0][1]))

>> float

Затем превратите его вмассив numpy:

foo = np.array(foo)

print(type(foo[0][1]))

>> numpy.float64
0 голосов
/ 19 сентября 2018

Если вы замените пробелы запятыми, вы можете использовать json.loads, чтобы прочитать строку в виде списка, и передать ее np.asarray:

import json
import numpy as np

foo = "[[7.0352220e-01 5.3130367e-06 1.5167372e-05 1.0797821e-06] \
[1.3130367e-06 2.4584832e-01 2.2375602e-05 7.3299240e-06]]"

a = np.asarray(json.loads(foo.replace(" ", ",")), dtype=np.float32)
print(a)
#array([[7.0352220e-01, 5.3130367e-06, 1.5167372e-05, 1.0797821e-06],
#       [1.3130367e-06, 2.4584832e-01, 2.2375602e-05, 7.3299240e-06]])

print(a.dtype)
#float32

.ценности.Если это не так, вы можете использовать re.sub для замены нескольких пробелов запятыми:

import re
a = np.asarray(json.loads(re.sub("\s+", ",", foo)))
#array([[7.0352221e-01, 5.3130366e-06, 1.5167372e-05, 1.0797821e-06],
#       [1.3130367e-06, 2.4584831e-01, 2.2375601e-05, 7.3299238e-06]],
#      dtype=float32)
0 голосов
/ 19 сентября 2018

Как формируются ваши строковые данные?Вероятно, самый простой способ - это использовать split () и выполнять итерации по списку.Пример (список списков строк), который работал для меня:

foo = [['7.0352220e-01 5.3130367e-06 1.5167372e-05 1.0797821e-06'],
       ['7.0352220e-01 5.3130367e-06 1.5167372e-05 1.0797821e-06']]
arr = np.array([[value.split() for value in row][0] for row in foo], dtype='<f8')

(Примечание: [0] используется, поскольку split создает сам список. В качестве альтернативы вы можете использовать np.reshape)

РЕДАКТИРОВАТЬ: если это строковое представление (не список строк, как указано в OP):

foo = '[[7.0352220e-01 5.3130367e-06 1.5167372e-05 1.0797821e-06][7.0352220e-01 5.3130367e-06 1.5167372e-05 1.0797821e-06]'
arr=np.array([line.split() for line in foo.replace('[','').replace(']]','').split(']')], dtype='<f8')
0 голосов
/ 19 сентября 2018

Насколько я видел, np.asarray () работает , только если dtype имеет тип данных, отличный от исходного типа данных.Пожалуйста, попробуйте удалить этот аргумент и посмотрите, работает ли он.

...