Преобразование строки, содержащей nan, в числовой массив с плавающей запятой

#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])