2016-11-19 2 views
2

이전 답변을 검색 한 후이 작은 문제에 빠져 있습니다. 나는 .yaml 파일에 내 코드에서 행렬을 저장할파이썬으로 YAML 파일에 결과 저장

나는이 행렬 (mtx 내 코드에서 짧은 이름) ​​

을 저장하려고 어떻게 내 코드

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

에서 얻을 무엇

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는이 세 가지를 모두 선호합니다. numpy.savez로 해결 된 나의 numpy 스크립트를위한 입력을 위해 – marcoresk

답변

1

저는 전문가 아니지만 생산 된 yaml이 맞는 것 같습니다. 기본적으로 기본 유형이 잘 렌더링되는지 확인할 수 있습니다. 다른 사람들에게는 약간의 행동을 취해야 할 수도 있습니다. documentation에서 여기를 읽으십시오.

행운을 빈다.

(내가 충분히 담당자가 없습니다. 언급을, 그렇지 않으면 내가 주석으로이 게시물을 떠날 것이다.) 유일한 것은 잘못 여기 numpy 내부가와 덤프해야 할 수있는 방법 당신의 기대 될 것으로 보인다

+0

@ 나는 당신의 연결 고리를 보려고 노력할 것이다, 고마워.내 코드에서 얻은 것과 같은 형식으로 행렬을 저장하는 방법이 있는지 알고 있습니까? (나는 답변을 upvote하므로 주석을 달 수있는 평판이 충분합니다.) – marcoresk

+0

문서에서 yaml.YAMLObject의 하위 클래스를 만들고 __repr__, __init__ 및 yaml_tag를 지정해야하는 것으로 보입니다. 나는 그것이 어딘가에 allready 사용할 수 있다고 생각하지만 ...하지만 그것을 찾을 수 없습니다. 그냥 직렬화하려는 경우 행렬을 중첩 목록으로 변환 할 수 있습니까? –

+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 유형 중 하나에 대해 수행되지 않는 경우가 있습니다. 일부 구성에서는 가능하지만 모호성으로 이어질 수는 있지만 AFAIK 단순화는 가능하지 않습니다. 물론

당신이 수행하여, 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) 

a numpy.multiarray load() 다시 YAML 표현에서.