#python #numpy
#python #numpy
Вопрос:
У меня есть такие строки
'[15, 8.0, 5.0, 5.0, nan, nan, nan, nan, nan, nan]'
'[8, 6.0, nan, nan, nan, nan, nan, nan, nan, nan]'
Который я хотел бы преобразовать в числовые массивы с плавающей запятой. Есть ли простая функция преобразования?
Я пробовал json.loads
, но, похоже, это не удается в NaN
s, даже если я заменяю их строкой np.nan
. Я попытался снять скобки и использовать numpy из string, но это тоже не удалось.
Ответ №1:
Быстрое и грязное решение:
from numpy import nan, array
a = '[15, 8.0, 5.0, 5.0, nan, nan, nan, nan, nan, nan]'
arr = array(eval(a))
Это вводит nan
в namescape, а затем вычисляется a
как выражение Python. Результатом является список, который можно легко преобразовать в массив numpy.
Имейте в виду, что использование eval
является рискованным, если ваши строки поступают из ненадежного источника (например, из пользовательского ввода), поскольку это может привести к выполнению произвольного кода. Более безопасная версия будет:
import ast
import numpy as np
def convert(s):
# replace the nan values so that ast.literal_eval() can interpret them
s = s.replace('nan', 'None')
# safely evaluate s as Python expression
l = ast.literal_eval(s)
# replace the Nones back to np.nans
l = [x if x is not None else np.nan for x in l]
return np.array(l)
Затем:
a = '[15, 8.0, 5.0, 5.0, nan, nan, nan, nan, nan, nan]'
convert(a)
ВОЗВРАТ
array([15., 8., 5., 5., nan, nan, nan, nan, nan, nan])