【问题标题】:How to convert a matrix as string to ndarray?如何将矩阵作为字符串转换为ndarray?
【发布时间】:2020-08-14 06:50:12
【问题描述】:

我有一个具有这种结构的 csv 文件:

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

我正在尝试使用pandas.read_csv 将矩阵字段读取为numpy.ndarray 并使用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()

【问题讨论】:

  • 是矩阵列和实际列表还是字符串?此外,您在列表中缺少逗号
  • 这是一个 numpy 数组的 str 显示,它不用于解析。您必须将其转换为列表列表的字符串格式,以及eval。可以处理,但是比较麻烦。
  • 您可能还必须将分隔符指定为空格而不是逗号。
  • 使用test=eval(str('[[1 2 3] [4 5 6] [7 8 9]]')) 进行测试,出现语法错误,@hpaulj。你是这个意思吗?
  • eval('[[1,2,3],[4,5,6]]') 是正确的python。注意逗号。

标签: pandas numpy numpy-ndarray


【解决方案1】:

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
  • 两个 apply 调用可以组合成:
    • 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)))
    • 为了代码清晰,我个人更喜欢每行一个转换。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-16
    • 1970-01-01
    • 2017-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多