在搜索上一个答案一小时后,我陷入了这个小问题。 我想在我的代码中存储.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 :(得分:3)
这里唯一的错误似乎是你对numpy
内部结构如何能够而且应该被转移到YAML的期望。
轻松检查YAML的内容是否正确,load
是dump
- 编辑:
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 :(得分:1)
我也不是专家,但产生的yaml似乎是正确的。默认情况下,您可以看到基元类型很好地呈现的数据。对于其他人,您可能需要采取一些行动。请阅读documentation。
祝你好运!(我没有足够的代表发表评论,否则我会将此帖留作评论。)
答案 2 :(得分:0)
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))
输出为:
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