2016-11-19 105 views
2

我在搜索上一个答案一个小时后陷入了这个小问题。 我想存储从我的代码矩阵中.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文件中简单形式的矩阵(就像我从代码中获得的那样)? 谢谢你提前

+0

您的目标是什么 - 获得适合输入到numpy脚本的东西,适合输入到不同工具的便携式东西,或者人类可读的东西? –

+0

@JohnCarter更喜欢所有这三样东西。对于我的numpy脚本的输入,我刚刚用numpy.savez解决了 – marcoresk

回答

1

我不是专家,但产生的yaml似乎是正确的。你可以看到dat的基本类型默认呈现良好。对于其他人,你可能需要采取一些行动。在这里阅读documentation

祝你好运!

(我没有足够的代表,发表评论,否则我会离开这个岗位的评论。)

+0

@我会试着看看你的链接,谢谢。你知道是否有一种方法可以将我的矩阵保存为与我在代码中获得的形式相同的形式? (我上传了你的答案,所以现在你有足够的声望来评论!) – marcoresk

+0

从文档看来,你必须制作你自己的yaml.YAMLObject的子类,并指定__repr__,__init__和yaml_tag。我认为它已经可以在某处找到......但是我找不到它。 如果你只是想序列化,你可能会将矩阵转换为嵌套列表? –

+0

我也找不到例子。我想将矩阵保存为矩阵,以便将其加载到另一个脚本中。我开始怀疑YAML是不是正确的选择... – marcoresk

3

的唯一的事情错在这里似乎是你如何numpy内部可以而且应该被倾倒预期到YAML。

一个简单的检查,看看什么你已经得到的YAML是正确的,是loaddump -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表示。

相关问题