codememo

numpy.array() 데이터를 올바르게 저장하고 로드하는 방법은 무엇입니까?

tipmemo 2023. 7. 17. 21:09
반응형

numpy.array() 데이터를 올바르게 저장하고 로드하는 방법은 무엇입니까?

하고 로드하는지 numpy.array정확한 데이터현재 사용 중입니다.numpy.savetxt()들면 있으면 배열이 있으면 배열이 있으면 배열이 경우에는 배열이 있습니다.markers이는 다음과 같습니다.

enter image description here

다음을 사용하여 저장하려고 합니다.

numpy.savetxt('markers.txt', markers)

다른 스크립트에서 이전에 저장한 파일을 열려고 합니다.

markers = np.fromfile("markers.txt")

그게 제가 얻는...

enter image description here

저장된 데이터는 먼저 다음과 같습니다.

0.000000000000000000e+00
0.000000000000000000e+00
0.000000000000000000e+00
0.000000000000000000e+00
0.000000000000000000e+00
0.000000000000000000e+00
0.000000000000000000e+00
0.000000000000000000e+00
0.000000000000000000e+00
0.000000000000000000e+00

그러나 로드된 데이터만 동일한 방법으로 저장할 때, 즉 numpy.savetxt()다음과 같습니다.

1.398043286095131769e-76
1.398043286095288860e-76
1.396426376485745879e-76
1.398043286055061908e-76
1.398043286095288860e-76
1.182950697433698368e-76
1.398043275797188953e-76
1.398043286095288860e-76
1.210894289234927752e-99
1.398040649781712473e-76

내가 무엇을 잘못하고 있습니까? PS에는 내가 수행하는 다른 "백스테이지" 작업이 없습니다.저장과 로딩만 하면 됩니다.잘 부탁드립니다.

은 제가발가확장방실것사다법입니는용하은한견한다▁i▁the것니를 사용하는 것입니다.np.savetxt와 함께np.loadtxt그리고 아닌np.fromfile다으로작이파더적다니합합일에로 작성된 에 더 합니다.tofile.np.fromfile그리고.np.tofile을 쓰고 반면에 메드는이파쓰읽습다니고일을진서▁files▁write▁methods▁whereas▁binary다▁and니읽. 반면에np.savetxt텍스트 파일을 씁니다.예를 들어, 다음과 같습니다.

a = np.array([1, 2, 3, 4])
np.savetxt('test1.txt', a, fmt='%d')
b = np.loadtxt('test1.txt', dtype=int)
a == b
# array([ True,  True,  True,  True], dtype=bool)

또는:

a.tofile('test2.dat')
c = np.fromfile('test2.dat', dtype=int)
c == a
# array([ True,  True,  True,  True], dtype=bool)

속도가 느리고 파일 크기가 큰 경우에도(가끔) 이전 방법을 사용합니다. 이진 형식은 플랫폼에 따라 다를 수 있습니다(예: 파일 형식은 시스템의 엔디안에 따라 다름).

NumPy 어레이를 위한 플랫폼 독립적인 형식이 있으며, 저장하고 읽을 수 있습니다.np.save그리고.np.load:

np.save('test3.npy', a)    # .npy extension is added if not given
d = np.load('test3.npy')
a == d
# array([ True,  True,  True,  True], dtype=bool)
np.save('data.npy', num_arr) # save
new_num_arr = np.load('data.npy') # load

▁use▁should▁the다:를 사용해야 합니다.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]]

확장된 답변:

사람이 읽을 수 있는 형식(Csv 파일로 NumPy 배열 덤프 참조)으로 저장할 수도 있고, 파일이 매우 큰 경우 다른 라이브러리와 함께 저장할 수도 있기 때문에 필요에 따라 달라집니다(확장된 논의를 위해 디스크에 Numpy 배열을 보존하는 가장 좋은 방법 참조).

하지만 (질문에서 "적절하게"라는 단어를 사용했기 때문에 확장을 하는 것) 여전히 즉시 사용하는 numpy 기능(그리고 대부분의 코드!)을 사용하는 것이 대부분의 사용자 요구를 충족시킬 것이라고 생각합니다.가장 중요한 이유는 이미 작동하기 때문입니다.다른 이유로 다른 것을 사용하려고 하면 왜 그것이 작동하지 않는지 파악하고 그것을 강제로 작동시키기 위해 예상치 못하게 긴 토끼 굴에 빠지게 될 수도 있습니다.

피클로 저장하는 것을 예로 들어보겠습니다.열고 제 것을 데 .wb문제를 검색하고, 잠재적인 해결책을 테스트하고, 오류 메시지를 이해하는 등의 작업에 시간이 걸렸습니다.작은 세부 사항이지만 이미 파일을 열어야 한다는 사실이 예상치 못한 방식으로 복잡해졌습니다.여기에 덧붙이자면, 이것을 다시 읽어야 했습니다(이것은 다소 혼란스럽습니다).내장 오픈 함수에서 모드 a, a+, w, w+, r+의 차이?

따라서 사용자의 요구를 충족하는 인터페이스가 있다면 (매우) 타당한 이유가 없는 한 사용하십시오(예: 어떤 이유로 인해 파일을 읽고 Python에서 인쇄하는 것이 정말로 사용자의 요구를 충족시키지 못할 수도 있습니다.게다가, 만약 당신이 그것을 최적화할 필요가 있다면, 당신은 나중에 알게 될 것입니다 (단순한 Numpy 파일을 여는 것과 같은 쓸모없는 것들을 디버깅하는데 시간을 소비하는 것보다).

따라서 인터페이스/numpy 제공을 사용합니다.완벽하지는 않을 수도 있지만, 특히 Numpy만큼 오래된 도서관에는 문제가 없을 것입니다.

나는 이미 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압축되지 않은 형식 사용(문서 참조) 압축되지 않은 단일 파일에 여러 어레이 저장.npz이것을 한다면 ( 것에 버그를 이름 것을 될 수 .기본 이름을 사용하지 않는 한 변수 이름을 사용하여 저장해야 할 수 있습니다.따라서 첫 번째가 이미 작동하는 경우에는 사용하지 마십시오(또는 어떤 작품이든 사용합니다!).
  • 피클은 임의 코드 실행도 허용합니다.보안상의 이유로 사용하지 않으려는 사람도 있을 수 있습니다.
  • 사람이 읽을 수 있는 파일은 만드는 등 비용이 많이 듭니다.아마 그럴 가치가 없을 겁니다.
  • 라는 것이 있습니다.hdf5대용량 파일용.멋지네요! https://stackoverflow.com/a/9619713/1601580

이것은 완전한 답변이 아닙니다.그러나 다른 리소스의 경우 다음을 확인하십시오.

np.fromfile() 을 가지고 있습니다.sep=키워드 인수:

파일이 텍스트 파일인 경우 항목 사이를 구분합니다.빈 구분 기호(")는 파일을 이진으로 처리해야 함을 의미합니다.구분 기호의 공백("")이 0개 이상의 공백 문자와 일치합니다.공백으로만 구성된 구분 기호는 하나 이상의 공백과 일치해야 합니다.

기본값:sep=""는 것을 의미합니다.np.fromfile()에서는 공백으로 구분된 텍스트 파일이 아닌 이진 파일로 읽으려고 하므로 넌센스 값을 반환합니다.사용하는 경우np.fromfile('markers.txt', sep=" ")당신은 당신이 찾고 있는 결과를 얻을 것입니다.

그러나 다른 사람들이 지적했듯이 텍스트 파일을 numpy 배열로 변환하는 방법이 선호되며, 파일이 사람이 읽을 수 있어야 하는 경우가 아니라면 일반적으로 이진 형식(예: 이진 형식)을 사용하는 것).np.load()/np.save()).

언급URL : https://stackoverflow.com/questions/28439701/how-to-save-and-load-numpy-array-data-properly

반응형