相关文章推荐
无邪的煎饼  ·  Format Query Results ...·  10 月前    · 
爱听歌的夕阳  ·  SCEP certificate ...·  1 年前    · 
还单身的打火机  ·  android - Copying a ...·  1 年前    · 
坐怀不乱的丝瓜  ·  c# - ASP.NET core - ...·  1 年前    · 
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]
  state: !!python/tuple
  - !!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文件中获得简单形式的矩阵(就像我从代码中获得的那样)?

2 个评论
你的目的是什么--得到适合输入numpy脚本的东西,适合输入不同工具的可移植的东西,还是人类可读的东西?
@JohnCarter 最好是这三样都有。对于我的numpy脚本的输入,我只是用numpy.savez来解决。
python
numpy
yaml
marcoresk
marcoresk
发布于 2016-11-19
3 个回答
Tao Cheng
Tao Cheng
发布于 2016-11-19
已采纳
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:
  state: !!python/tuple
  - null
  - null
  - null
- !!binary |
  mpmZmZmZyT8=
test: 2
    
df.to_dict('records')可以将一个数据框架转换为普通的python字典
Anthon
Anthon
发布于 2016-11-19
0 人赞同

这里唯一错误的地方似乎是你对numpy的内部信息如何能够和应该被转储到YAML的期望。

检查你得到的YAML是否正确的一个简单方法是:loaddump的内容。

import ruamel.yaml
import numpy
import pprint
mtx = [[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)

which gives:

{'Matrix': [[1006.65266, 0.0, 508.285432], [0.0, 1010.86937, 345.995536], [0.0, 0.0, 1.0]]}

替换代码0】使用的特殊类型有not转储为简单的(可读的)YAML,但不能保证它可以被重新加载。对于某些结构体来说,这可能是可行的,尽管它很容易导致歧义,而且AFAIK简化并没有对任何numpy类型进行简化。

当然,你可以转储YAML而不需要numpy提供它的恢复信息,通过这样做。

ruamel.yaml.round_trip_dump(data, sys.stdout)

which gives:

Matrix:
- - 1006.65266
  - 0.0
  - 508.285432
- - 0.0
  - 1010.86937
  - 345.995536
- - 0.0
  - 0.0
  - 1.0

可读性更强,但不会成为numpy.multiarray的东西自动地当你再次从YAML表示中load()它的时候。

moi
在你的例子中,mtx不是一个np.multiarray,而是一个普通的列表(并且np.multiarray被这个列表覆盖)。你肯定是指mtx = numpy.multiarray([[...], ...])
@moi 我当然不是指mtx = numpy.multiarray([[...], ...]),因为那会甩出OP所抱怨的不可读的YAML,不会得到你所提出的结果。当然,mtx不是np.multiarray,为什么它们会是?它们只是在多重赋值语句中被分配了相同的值。当然,你可以争辩说,赋值给np.multiarray在这里没有任何作用,但那是完全不同的东西。
moi
好的,我明白了。因此,如果它没有任何作用,你可能想把它从你的答案中删除,因为它使人们(至少是我)感到困惑。
DA--
DA--
发布于 2016-11-19
0 人赞同