如何在python

时间:2018-04-09 16:58:12

标签: python pandas numpy

您好我正在尝试将4x4矩阵从字典加载到np数组中,

u'{"column0":{"x":1,"y":0.0,"z":0.0,"w":-1.0},
   "column1":{"x":0.0,"y":1,"z":0.0,"w":-1.0},
   "column2":{"x":1,"y":1,"z":1.0,"w":-1.0},
   "column3":{"x":-1.0,"y":-1.0,"z":-1.0,"w":-1.0}
  }'

我想将其加载为

array([[ 1,0., 0.,-1 ],
       [ 0.,1,0.,-1 ],
       [ 1,1,1,-1 ],
       [ -1,-1,-1,-1 ]])

目前我正在遍历每个元素,我确信有更好的pythonic方式直接使用pandas或numpy。有什么建议吗?

2 个答案:

答案 0 :(得分:2)

您可以通过numpypandas执行此操作。这两种方法都需要ast.literal_eval

由于字典是无序的,因此每种方法都需要注意确保按需要对列进行排序。

<强>设置

import numpy as np, pandas as pd
from ast import literal_eval

mystr = """{"column0":{"x":1,"y":0.0,"z":0.0,"w":-1.0},
   "column1":{"x":0.0,"y":1,"z":0.0,"w":-1.0},
   "column2":{"x":1,"y":1,"z":1.0,"w":-1.0},
   "column3":{"x":-1.0,"y":-1.0,"z":-1.0,"w":-1.0}
  }"""

d = literal_eval(mystr)

选项1:numpy

res_np = np.array([[v[j] for j in ['x', 'y', 'z', 'w']] for k, v in d.items()])

# array([[ 1.,  0.,  0., -1.],
#        [ 0.,  1.,  0., -1.],
#        [ 1.,  1.,  1., -1.],
#        [-1., -1., -1., -1.]])

选项2:pandas

res_df = pd.DataFrame(d).T.iloc[:, [1, 2, 3, 0]].values

# array([[ 1.,  0.,  0., -1.],
#        [ 0.,  1.,  0., -1.],
#        [ 1.,  1.,  1., -1.],
#        [-1., -1., -1., -1.]])

答案 1 :(得分:1)

您可以使用ast.literal_eval评估字典字符串,将其放入pandas转置数据框(xyz,{{1按照您的列顺序排列),然后使用w

as_matrix