使用 python 将结果保存在 YAML 文件中

mar*_*esk 8 python yaml numpy

经过一个小时的搜索之前的答案后,我陷入了这个小问题。我想将代码中的矩阵存储在 .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]]
Run Code Online (Sandbox Code Playgroud)

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

fname = "calibrationC300.yaml"

data = dict(
    Matrix = mtx,
)

with open(fname, "w") as f:
    yaml.dump(data, f, default_flow_style=False)   
Run Code Online (Sandbox Code Playgroud)

但我在 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/
Run Code Online (Sandbox Code Playgroud)

这是我第一次使用 Yaml 文件,我做错了什么?有没有一种方法可以在 yaml 文件中以简单形式获取矩阵(正如我从代码中获取的那样)?先感谢您

小智 7

区别在于 float 和 numpy.float64 之间。Yaml 使用更复杂的方式来表示 numpy.float64。如果您喜欢更易读的 yaml,可以更改为 float。请参见以下示例:

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))
Run Code Online (Sandbox Code Playgroud)

输出为:

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
Run Code Online (Sandbox Code Playgroud)


DA-*_*A-- 1

我也不是专家,但生成的 yaml 似乎是正确的。您可以看到默认情况下基本类型渲染得很好。对于其他人,您可能需要采取一些行动。请阅读此处的 文档

祝你好运!

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