2016-11-19 15 views
2

私は前の答えを検索した後、この小さな問題に悩まされています。 私は私のコード私はこの行列を保存しようとした方法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は私のコードで短い名前である)

から入手何.yamlファイルに自分のコードから

を行列を保存したいです

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は、これらの3つのすべてを優先します。私のnumpyスクリプトの入力のために、私はnumpy.savezで解決しました – marcoresk

答えて

1

私はエキスパートではありませんが、生成されたyamlは正しいようです。プリミティブ型がデフォルトでうまく描画されていることがわかります。他の人にとっては何らかの行動を取らなければならないかもしれません。 documentationでここをクリックしてください。

幸運を祈る!

(私は十分に担当者を持っていません。コメントを、そうでなければ、私はコメントとしてこのポストを残すでしょう。)唯一のことは、ここで間違っnumpy内部が及びダンプしなければならないことができる方法のあなたの期待であるように思わ

+0

@あなたのリンクを見てみるつもりです、ありがとう。私のコードで取得したのと同じ形式で行列を保存する方法があるかどうか知っていますか? (私はあなたの答えをアップアップしてコメントするほどの評判を持っています!) – marcoresk

+0

ドキュメントからは、yaml.YAMLObjectの独自のサブクラスを作成し、__repr__、__init__、yaml_tagを指定する必要があるようです。私はそれがどこかで既に利用可能だと思うだろう...しかし、私はそれを見つけることができません。 シリアル化したいだけの場合は、行列をネストされたリストに変換することができますか? –

+0

あまりにも例が見つかりません。私は行列を別のスクリプトに読み込むために行列として保存したい。私はYAMLが正しい選択ではないのか疑問に思います... – marcoresk

3

YAMLに

簡単なチェックはYAMLが正しいとあなたが得ているものを、あなたdumpは-ed何loadにあることを確認します

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供給がその情報を復元せずにダンプすることができます。これまでとなります

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

はるかに読みやすいではなく、何かを:与え

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

numpy.multiarray あなたがload()になったときに再びYAML表現から。

関連する問題