将结果保存在Python的YAML文件中
问题描述:
我在搜索上一个答案一个小时后陷入了这个小问题。 我想存储从我的代码矩阵中.yaml文件将结果保存在Python的YAML文件中
我从我的代码
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
是较短的名字在我的代码)
fname = "calibrationC300.yaml"
data = dict(
Matrix = mtx,
)
with open(fname, "w") as f:
yaml.dump(data, f, default_flow_style=False)
但是我在YAML文件中读取是完全错误的(仅仅只有不好的转换?)
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文件中简单形式的矩阵(就像我从代码中获得的那样)? 谢谢你提前
答
我不是专家,但产生的yaml似乎是正确的。你可以看到dat的基本类型默认呈现良好。对于其他人,你可能需要采取一些行动。在这里阅读documentation。
祝你好运!
(我没有足够的代表,发表评论,否则我会离开这个岗位的评论。)
答
的唯一的事情错在这里似乎是你如何numpy
内部可以而且应该被倾倒预期到YAML。
一个简单的检查,看看什么你已经得到的YAML是正确的,是load
你dump
-ed:
import ruamel.yaml
import numpy
import pprint
mtx = numpy.multiarray = [[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)
这给:
{'Matrix': [[1006.65266, 0.0, 508.285432], [0.0, 1010.86937, 345.995536], [0.0, 0.0, 1.0]]}
特殊类型的numpy
使用的是而不是转储为简单(且可读)的YAML,但不保证可以重新加载。对某些结构可能是可能的,尽管它很容易导致模糊,并且对于任何numpy
类型AFAIK简化都没有完成。
当然,你可以转储YAML无需numpy
供应的恢复信息,这样做:
ruamel.yaml.round_trip_dump(data, sys.stdout)
这给:
Matrix:
- - 1006.65266
- 0.0
- 508.285432
- - 0.0
- 1010.86937
- 345.995536
- - 0.0
- 0.0
- 1.0
更可读,但不是东西,会不会成为一个numpy.multiarray 自动当你load()
它再次从它的YAML表示。
您的目标是什么 - 获得适合输入到numpy脚本的东西,适合输入到不同工具的便携式东西,或者人类可读的东西? –
@JohnCarter更喜欢所有这三样东西。对于我的numpy脚本的输入,我刚刚用numpy.savez解决了 – marcoresk