2013-04-08 5 views
3

numpy 배열이 포함 된 중첩 사전을 JSON 파일로 덤프하는 방법을 찾고 있습니다. 실험 및 데이터 전체를 한 곳에서 기록합니다.사전 구조를 유지하면서 중첩 사전의 numpy 배열을 목록으로 변환합니다.

with open('data.txt','w') as fl: 
    json.dump(data,fl) 

I : NumPy와 배열이 직렬화 가능하지 않기 때문에이 코드가 실패 순간

import numpy as np 
data = {'foo': {'bar': np.array([1, 2, 3])}, 'goo': np.array([3,5,7]),'fur': {'dur': {'mur': np.array([7,5,8])}}} 

:

내 사전 (구조 코드가 표시보다 더 중첩 될 수있다) 다음과 같다 tolist() 함수를 사용하는 것이 가능하다는 것을 알고 있지만 데이터 구조를 보존하고 목록을 위해 np.arrays를 교환하는 동안 사전을 어떻게 넘어야할지 모릅니다.

재귀를 사용하여 사전에서 개별 값을 가져 오려고했지만 "사전을 다시 작성하는"방법을 모르겠습니다. (JSON 덤프없이) 순간에 내 코드 :

import numpy as np 

def dict_walk(data): 
    for k, v in data.iteritems(): 
     if isinstance(v, dict): 
      dict_walk(v) 
     else: 
      l = v.tolist() 
      print l 

data = {'foo': {'bar': np.array([1, 2, 3])}, 'goo': np.array([3,5,7]),'fur': {'dur': {'mur': np.array([7,5,8])}}} 
dict_walk(data)  
+0

[pickle] (http://docs.python.org/2/library/pickle)을 사용해보십시오. html)을 사용하면 Python 객체를 직접 저장할 수 있습니다. (질문은 여전히 ​​가치가있다. 물론 당신이 들어 본 적이 없다면 다른 방법을 지적하고 싶다.) – ASGM

+0

@ASGM 제안에 감사드립니다! 제 3 자 소프트웨어와의 호환성을 위해 JSON을 사용하고 있으므로 피클을 사용하기로 결정했습니다. – Matt

답변

7

당신은 json.dumpdefault 기능을 제공 할 수 있습니다; JSON이 처리 방법을 모르는 데이터 유형이라면 다음과 같이 호출됩니다.

def default(obj): 
    if isinstance(obj, np.ndarray): 
     return obj.tolist() 
    raise TypeError('Not serializable') 

with open('data.txt','w') as fl: 
    json.dump(data, fl, default=default) 
+0

@jmetz : 아, 신경 쓰지 마세요. Numpy는 그것의 유형 시스템에 둔감합니다. 'np.array()'는'repr()'출력에서'array'를 이름으로 사용하는'np.nparray()'타입의 객체를 생성합니다. 예. –

관련 문제