짧은 대답을 위해서는 np.save
및 을 사용해야합니다 np.load
. 이것의 장점은 numpy 라이브러리의 개발자가 만들고 이미 작동한다는 것입니다.
import numpy as np
from pathlib import Path
path = Path('~/data/tmp/').expanduser()
path.mkdir(parents=True, exist_ok=True)
lb,ub = -1,1
num_samples = 5
x = np.random.uniform(low=lb,high=ub,size=(1,num_samples))
y = x**2 + x + 2
np.save(path/'x', x)
np.save(path/'y', y)
x_loaded = np.load(path/'x.npy')
y_load = np.load(path/'y.npy')
print(x is x_loaded) # False
print(x == x_loaded) # [[ True True True True True]]
확장 된 답변 :
결국에는 사람이 읽을 수있는 형식으로 저장할 수도 있고 (이 NumPy 배열을 csv 파일로 덤프 참조 ) 파일이 매우 큰 경우 다른 라이브러리와 함께 저장할 수도 있기 때문에 사용자의 요구에 따라 달라집니다 ( numpy 배열을 보존하는 가장 좋은 방법 참조). 디스크에 확장 된 토론을위한 ).
그러나 (귀하의 질문에서 "적절하게"라는 단어를 사용했기 때문에 확장) 나는 여전히 numpy 함수를 사용하여 대부분의 사용자 요구를 충족시킬 가능성이 가장 높다고 생각합니다. 가장 중요한 이유는 이미 작동 하고 있기 때문입니다 . 다른 이유로 다른 것을 사용하려고하면 예상치 않게 긴 토끼 구멍에 빠지게되어 작동하지 않는 이유를 파악하고 강제로 작동시킬 수 있습니다.
예를 들어 피클을 사용하여 저장하려고합니다. 나는 재미로 그것을 시도했고, .NET을 사용하여 바이트 모드에서 파일을 열고 읽지 않으면 pickle이 내 물건을 저장하지 않는다는 것을 깨닫는 데 적어도 30 분이 걸렸습니다 wb
. Google에 시간이 걸렸고, 시도하고, 오류 메시지를 이해하는 등 ... 작은 세부 사항이지만 이미 예기치 않은 방식으로 복잡한 파일을 열어야한다는 사실. 추가하려면 이것을 다시 읽어야합니다 (어떤 btw는 일종의 혼란 스럽습니다) . 내장 개방 기능에서 모드 a, a +, w, w + 및 r + 간의 차이점은 무엇입니까?.
따라서 요구 사항을 충족하는 인터페이스가 있으면 ( 매우 ) 좋은 이유 (예 : matlab과의 호환성 또는 어떤 이유로 파일을 읽고 싶어하고 파이썬으로 인쇄하는 것이 실제로 귀하의 요구를 충족시키지 못합니다. 의심 스러울 수 있습니다). 또한 최적화가 필요한 경우 나중에 확인할 수 있습니다 (간단한 numpy 파일을 여는 것과 같은 쓸모없는 것들을 디버깅하는 데 오랜 시간을 소비하는 대신).
따라서 interface / numpy provide . 완벽하지 않을 수도 있습니다. 특히 오래 동안 주변에 있었던 도서관의 경우에는 좋습니다.
나는 이미 numpy로 데이터를 저장하고 로딩하는 데 많은 시간을 보냈으므로 재미있게 즐기십시오.
import numpy as np
import pickle
from pathlib import Path
path = Path('~/data/tmp/').expanduser()
path.mkdir(parents=True, exist_ok=True)
lb,ub = -1,1
num_samples = 5
x = np.random.uniform(low=lb,high=ub,size=(1,num_samples))
y = x**2 + x + 2
# using save (to npy), savez (to npz)
np.save(path/'x', x)
np.save(path/'y', y)
np.savez(path/'db', x=x, y=y)
with open(path/'db.pkl', 'wb') as db_file:
pickle.dump(obj={'x':x, 'y':y}, file=db_file)
## using loading npy, npz files
x_loaded = np.load(path/'x.npy')
y_load = np.load(path/'y.npy')
db = np.load(path/'db.npz')
with open(path/'db.pkl', 'rb') as db_file:
db_pkl = pickle.load(db_file)
print(x is x_loaded)
print(x == x_loaded)
print(x == db['x'])
print(x == db_pkl['x'])
print('done')
내가 배운 것에 대한 몇 가지 의견 :
np.save
예상대로 이미 잘 압축되어 있습니다 ( https://stackoverflow.com/a/55750128/1601580 참조). ), 파일을 열지 않고 즉시 작동합니다. 깨끗한. 쉬운. 실력 있는. 그걸 써.
np.savez
압축되지 않은 형식 (참조 사용하여 문서를 ) Save several arrays into a single file in uncompressed
.npz을 format.
당신은 당신이 원하는하지 않는 한, 그것을 저장 인수 이름을 사용할 필요가 있음을 발견 할 수있다 (당신이 그렇게 버그를 기대합니다! 표준액에서 멀리 갈 경고했다)이 사용하기로 결정한 경우 기본 이름을 사용하십시오. 그러니 첫 번째가 이미 작동한다면 이것을 사용하지 마십시오 (또는 어떤 작품도 그것을 사용합니다!)
- Pickle은 또한 임의의 코드 실행을 허용합니다. 어떤 사람들은 보안상의 이유로 이것을 사용하지 않을 수 있습니다.
- 사람이 읽을 수있는 파일은 만드는 데 비용이 많이 듭니다. 아마도 그만한 가치가 없을 것입니다.
- 라는 무언가가
hdf5
큰 파일은. 멋있는! https://stackoverflow.com/a/9619713/1601580
이것은 완전한 대답이 아닙니다. 그러나 다른 리소스의 경우 다음을 확인하십시오.