Как преобразовать матрицу в виде строки в ndarray? - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть CSV-файл с такой структурой:

id;matrix
1;[[1.2 1.3] [1.2 1.3] [1.2 1.3]]

Я пытаюсь прочитать поле матрицы как numpy.ndarray, используя pandas.read_csv для чтения и делая df.to_numpy() для преобразования матрицы, но результат массива shape в (1,0). Я ждал shape равно (3,2) как:

matrix = [[1.2 1.3] 
          [1.2 1.3]
          [1.2 1.3]]

Я тоже пытался numpy.asmatrix, но результат похож на df.to_numpy()

1 Ответ

1 голос
/ 30 апреля 2020

Решение с pandas

  • Если формат столбца matrix соответствует формату, показанному в примере, замените пробелы на ,, затем используйте literal_eval для превратить строку в список списков, а затем применить np.array.
import pandas as pd
from ast import literal_eval
import numpy as np

# read the data
df = pd.read_csv('file.csv', sep=';')

# replace the spaces
df['matrix'] = df['matrix'].str.replace(' ', ',')

# apply literal_eval
df['matrix'] = df['matrix'].apply(literal_eval)

# apply numpy array
df['matrix'] = df['matrix'].apply(np.array)

print(type(df.iloc[0, 1]))

>>> numpy.ndarray
  • Каждая строка столбца матрицы будет ndarray
  • . Два применимых вызова могут быть объединены в:
    • df['matrix'] = df['matrix'].apply(lambda x: np.array(literal_eval(x)))
  • Или этот горячий беспорядок:
    • df['matrix'] = df['matrix'].str.replace(' ', ',').apply(lambda x: np.array(literal_eval(x)))
    • I лично для ясности кода предпочитаю одно преобразование на строку.
...