2010-12-23 3 views
6

숫자가 부울 값 배열 (G.adj.dtype == bool)으로 표시된 그래프가 있습니다. 이것은 내 자신의 그래프 라이브러리를 작성하는 숙제이므로 networkx를 사용할 수 없습니다. 나는 그것을 파일로 덤핑하여 파일을 만들 수 있도록하고 싶지만, 저의 삶을 위해 나는 numpy를 복구 가능한 방식으로 덤프하는 법을 배울 수 없습니다.부울 행렬을 numpy에 덤프하는 방법은 무엇입니까?

저는 True/False의 한 줄로 올바르게 그래프를 작성한() 시도했습니다. 그러나 fromfile barfs는 이것을 읽고 1x1 배열을주고, loadtxtValueError: invalid literal for int을 발생시킵니다. np.savetxt은 작동하지만 행렬을 0/1 수레 목록으로 저장하고 loadtxt(..., dtype=bool)가 동일한 ValueError로 실패합니다.

마지막으로, 나는 networkx.write_dot으로 networkx.from_numpy_matrix을 시도했지만 도트 소스에 각 끝의 [weight=True]은 각 networkx.read_dot을 기록했습니다.

답변

4

저장하려면 :

numpy.savetxt('arr.txt', G.adj, fmt='%s') 

가 복구하려면 :

G.adj = numpy.genfromtxt('arr.txt', dtype=bool) 

HTH를!

4

이 내 테스트 케이스이다 :

m = numpy.random(100,100) > 0.5 

공간 효율성

numpy.savetxt('arr.txt', obj, fmt='%s')는 54 킬로바이트 파일을 만듭니다.

numpy.savetxt('arr.txt', obj, fmt='%d')은 훨씬 작은 파일 (20 kB)을 생성합니다. 이를 40kB 파일을 생성

cPickle.dump(obj, open('arr.dump', 'w')),

시간 효율

numpy.savetxt('arr.txt', obj, fmt='%s') 45 MS

numpy.savetxt('arr.txt', obj, fmt='%d') 10 MS

cPickle.dump(obj, open('arr.dump', 'w')) 2.3 MS

결론

savetxt, 사람의 가독성이 필요한 경우 텍스트 형식 (%s)을 사용하십시오. 공간 고려 사항이있는 경우 savetxt 숫자 형식 (%d)을 사용하고 시간이 문제 인 경우 cPickle을 사용하십시오.

+0

이 경우 'obj'는 무엇입니까? 'm'입니까? – petRUShka

4

메타 데이터 (DTYPE, 치수)를 포함하여 배열을 저장하는 가장 쉬운 방법은 numpy.save()numpy.load()을 사용하는 것입니다

a = array([[False, True, False], 
      [ True, False, True], 
      [False, True, False], 
      [ True, False, True], 
      [False, True, False]], dtype=bool) 
numpy.save("data.npy", a) 
numpy.load("data.npy") 
# array([[False, True, False], 
#  [ True, False, True], 
#  [False, True, False], 
#  [ True, False, True], 
#  [False, True, False]], dtype=bool) 

a.tofile()numpy.fromfile()이 잘 작동하지만, 메타 데이터를 저장하지 않습니다. dtype=boolfromfile()으로 전달해야하며 원 모양으로 reshape()d가되어야하는 1 차원 배열이 생성됩니다.

1

저는 그 질문이 꽤 오래되었지만 파이썬 3 벤치 마크를 추가하고 싶습니다. 이전과 약간 다릅니다.

첫째 I는 메모리에 많은 데이터를로드 할 수있는 값으로 만 0 1과 함께 int8 NumPy와 배열로 변환 한 다음 두 가지 방법을 사용하는 HDD를 덤프.

from timer import Timer 
import numpy 
import pickle 

# Load data part of code is omitted. 

prime = int(sys.argv[1]) 

np_table = numpy.array(check_table, dtype=numpy.int8) 
filename = "%d.dump" % prime 

with Timer() as t: 
    pickle.dump(np_table, open("dumps/pickle_" + filename, 'wb')) 

print('pickle took %.03f sec.' % (t.interval)) 

with Timer() as t: 
    numpy.savetxt("dumps/np_" + filename, np_table, fmt='%d') 

print('savetxt took %.03f sec.' % (t.interval)) 

시간

630K np_11.dump 
79M np_29.dump 
110M np_31.dump 
442M np_41.dump 
561M np_43.dump 
875M np_47.dump 
1,6G np_53.dump 

315K pickle_11.dump 
40M pickle_29.dump 
55M pickle_31.dump 
221M pickle_41.dump 
281M pickle_43.dump 
438M pickle_47.dump 
798M pickle_53.dump 

그래서 파이썬 3 pickle 버전을 측정

It took 50.700 sec to load data number 11 
pickle took 0.010 sec. 
savetxt took 1.930 sec. 

It took 1297.970 sec to load data number 29 
pickle took 0.070 sec. 
savetxt took 242.590 sec. 

It took 1583.380 sec to load data number 31 
pickle took 0.090 sec. 
savetxt took 334.740 sec. 

It took 3855.840 sec to load data number 41 
pickle took 0.610 sec. 
savetxt took 1367.840 sec. 

It took 4457.170 sec to load data number 43 
pickle took 0.780 sec. 
savetxt took 1654.050 sec. 

It took 5792.480 sec to load data number 47 
pickle took 1.160 sec. 
savetxt took 2393.680 sec. 

It took 8101.020 sec to load data number 53 
pickle took 1.980 sec. 
savetxt took 4397.080 sec. 

크기 측정은 numpy.savetxt보다 훨씬 빠른 약 2 배 적은 HDD 볼륨을 사용하고 있습니다.

+0

그러나 피클 결과는 최상의 경우에 내 HDD 쇼보다 적기 때문에 상당히 이상합니다. 그래서 저는 pickle과 linux가 백그라운드에서 그랬다고 생각합니다. 그리고 그 작은 시간의 진정한 이유입니다. – petRUShka

관련 문제