首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用python将结果保存为YAML文件

使用python将结果保存为YAML文件
EN

Stack Overflow用户
提问于 2016-11-19 17:35:01
回答 3查看 6.2K关注 0票数 4

在搜索之前的答案一个小时后,我陷入了这个小问题。我想将代码中的矩阵存储在.yaml文件中

我从代码中获得了什么

代码语言:javascript
复制
Matrix
[[  1.00665266e+03   0.00000000e+00   5.08285432e+02]
 [  0.00000000e+00   1.01086937e+03   3.45995536e+02]
 [  0.00000000e+00   0.00000000e+00   1.00000000e+00]]

我如何尝试保存这个矩阵(在我的代码中mtx是较短的名称)

代码语言:javascript
复制
fname = "calibrationC300.yaml"

data = dict(
    Matrix = mtx,
)

with open(fname, "w") as f:
    yaml.dump(data, f, default_flow_style=False)   

但是我在YAML文件中读取的是完全错误的(仅仅是错误的转换?)

代码语言:javascript
复制
Matrix: !!python/object/apply:numpy.core.multiarray._reconstruct
  args:
  - &id001 !!python/name:numpy.ndarray ''
  - !!python/tuple [0]
  - b
  state: !!python/tuple
  - 1
  - !!python/tuple [3, 3]
  - !!python/object/apply:numpy.dtype
    args: [f8, 0, 1]
    state: !!python/tuple [3, <, null, null, null, -1, -1, 0]
  - false
  - !!binary |
    cWM87e1YkEAAAAAAAAAAAIUEEyb5SH1AAAAAAAAAAACp/Z3yc2qQQFv0vPqb5nZAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAPA/

这是我第一次使用Yaml文件,我哪里做错了?有没有方法可以在yaml文件中获得简单形式的矩阵(就像我从代码中获得的那样)?提前谢谢你

EN

回答 3

Stack Overflow用户

发布于 2018-09-21 09:36:07

不同之处在于float和numpy.float64。Yaml使用更复杂的方式来表示numpy.float64。如果您喜欢可读性更好的yaml,您可以将其更改为float。请参见以下示例:

代码语言:javascript
复制
print(yaml.dump({'test': 1, 'data':float(0.2)}, default_flow_style=False))
print(yaml.dump({'test': 2, 'data':numpy.float64(0.2)}, default_flow_style=False))

输出为:

代码语言:javascript
复制
data: 0.2

test: 1

data: !!python/object/apply:numpy.core.multiarray.scalar
- !!python/object/apply:numpy.dtype
  args:
  - f8
  - 0
  - 1
  state: !!python/tuple
  - 3
  - <
  - null
  - null
  - null
  - -1
  - -1
  - 0
- !!binary |
  mpmZmZmZyT8=

test: 2
票数 4
EN

Stack Overflow用户

发布于 2016-11-19 20:54:00

这里唯一的错误似乎是您对numpy内部如何以及应该如何转储到YAML的期望。

一个简单的方法是检查你得到的YAML是不是正确的,就是load what you dump-ed:

代码语言:javascript
复制
import ruamel.yaml
import numpy
import pprint

mtx = [[1.00665266e+03, 0.00000000e+00, 5.08285432e+02],
       [0.00000000e+00, 1.01086937e+03, 3.45995536e+02],
       [0.00000000e+00, 0.00000000e+00, 1.00000000e+00],]

data = dict(Matrix=mtx)

yaml_str = ruamel.yaml.dump(data, default_flow_style=False)
data = ruamel.yaml.load(yaml_str)
print(data)

这就给出了:

代码语言:javascript
复制
{'Matrix': [[1006.65266, 0.0, 508.285432], [0.0, 1010.86937, 345.995536], [0.0, 0.0, 1.0]]}

numpy使用的特殊类型是,而不是转储为简单的(和可读的) YAML,不能保证可以重新加载。对于一些构造来说,这可能是可能的,尽管它很容易导致歧义,而AFAIK简化对于任何numpy类型都是不可能的。

当然,您可以在不让numpy提供其恢复信息的情况下转储该YAML,方法是:

代码语言:javascript
复制
ruamel.yaml.round_trip_dump(data, sys.stdout)

这就给出了:

代码语言:javascript
复制
Matrix:
- - 1006.65266
  - 0.0
  - 508.285432
- - 0.0
  - 1010.86937
  - 345.995536
- - 0.0
  - 0.0
  - 1.0

更具可读性,但当您再次从其YAML表示中load()它时,它不会自动成为numpy.multiarray。

票数 3
EN

Stack Overflow用户

发布于 2016-11-19 17:59:31

我也不是专家,但是生成的yaml似乎是正确的。您可以看到,默认情况下原始类型呈现得很好。对于其他人,你可能不得不采取一些行动。在documentation上阅读这里。

祝好运!

)我没有足够的代表。发表评论,否则我会留下这篇文章作为评论。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40691311

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档