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

问题描述 投票:2回答:3

在寻找上一个答案一小时后,我陷入了这个小问题。我想在我的代码中存储.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文件中以简单的形式(因为我从代码中获得)获得矩阵?先感谢您

python numpy yaml
3个回答
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,不能保证可以重新加载。对于某些构造可能是有可能的,虽然它很容易导致歧义,并且AFAIK简化它不适用于任何numpy类型。

当然,您可以通过以下方式转储该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

更可读,但是当你从它的YAML表示再次load()时,它不会自动成为numpy.multiarray。


1
投票

我也不是专家,但产生的yaml似乎是正确的。默认情况下,您可以看到基元类型很好地呈现的数据。对于其他人,您可能需要采取一些行动。在这里阅读documentation

祝好运!

(我没有足够的代表发表评论,否则我会将此帖留作评论。)


0
投票

不同之处在于float和numpy.float64之间。 Yaml使用更复杂的方式来表示numpy.float64。如果你喜欢更多可读的yaml,你可以改为浮动。请参阅以下示例:

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))

输出是:

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
© www.soinside.com 2019 - 2024. All rights reserved.