파이썬 넘파이 Numpy array 파일로 저장하기, 불러오기

파이썬 넘파이 라이브러리로 배열 (array) 작업을 할 때, 파일로 저장하거나 불러올 수 있다.

지금 공부하는 입문 단계니까 숫자 몇개짜리 4행3열 이런거 만들어서 실습하는거지, 실제로는 수백 수천줄짜리 수집된 데이터를 가지고 요리조리 편집하고 갈무리하는게 일일 것이다.

또 혼자가 아닌 팀으로 작업하는 경우 파일로 데이터를 주고받는 방법도 알아야 한다.

배열 1개 저장하기 불러오기

a = np.random.random((4,3))
a

array([[0.91552556, 0.19589976, 0.83347027],
       [0.52509955, 0.47175881, 0.19360351],
       [0.23246802, 0.478078  , 0.21084812],
       [0.69690912, 0.61760534, 0.36286497]])

🔺 랜덤 배열을 하나 생성하고 저장하기 불러오기를 해보자.

np.save('test.npy', a)

🔺 어레이를 파일로 저장하는 방법은 np.save(‘저장할 파일명’, 어레이명) 형태로 입력한다.

파일명에 확장자는 넘파이라는 뜻으로 npy로 지정해야 하는데, 확장자를 쓰지 않을 경우 자동으로 npy파일로 저장된다.

파일로 저장된 넘파이

🔺 파이썬 실습하고 있는 환경인 구글코랩에서 폴더 아이콘 부분을 눌러보면 이렇게 test.npy 파일이 생긴것을 알 수 있다.

np.load('test.npy')   # 로드를 하면 어레이 내용을 화면에 보여줌
array([[0.91552556, 0.19589976, 0.83347027],
       [0.52509955, 0.47175881, 0.19360351],
       [0.23246802, 0.478078  , 0.21084812],
       [0.69690912, 0.61760534, 0.36286497]])


aa = np.load('test.npy')   # 이후에 사용을 위해서 새로운 변수명으로 어레이 받기
aa

array([[0.91552556, 0.19589976, 0.83347027],
       [0.52509955, 0.47175881, 0.19360351],
       [0.23246802, 0.478078  , 0.21084812],
       [0.69690912, 0.61760534, 0.36286497]])


aa = np.load('test')    # 확장자 누락
aa

FileNotFoundError: [Errno 2] No such file or directory: 'test'

🔺 배열을 그냥 로드만 하면 화면에 한번 출력해주고 끝일 뿐이므로 두번째 예시와 같이 사용할 다른 변수명으로 받아놓고 이후에 작업을 계속 진행하면 된다.

불러올 때는 np.load(‘파일명’) 형태로 입력하는데, 만약 확장자를 써주지 않으면 두번째와 같이 FileNotFoundError가 발생한다. 저장할때는 알아서 .npy로 만들어주지만 불러올 때는 확장자까지 정확하게 써주어야 로드가 된다.

여러배열 저장하기 불러오기

a = np.random.random((4,3))
a

array([[0.91552556, 0.19589976, 0.83347027],
       [0.52509955, 0.47175881, 0.19360351],
       [0.23246802, 0.478078  , 0.21084812],
       [0.69690912, 0.61760534, 0.36286497]])


b = np.random.random((3,4))
b

array([[0.57823555, 0.06601417, 0.6744676 , 0.46173457],
       [0.48212158, 0.23041538, 0.21705087, 0.98147965],
       [0.23046854, 0.78978004, 0.32640739, 0.34112003]])

🔺 배열 a, b 두개를 가지고 저장&로드 하는 방법을 살펴본다.

np.savez('test2.npz')

🔺 여러개 배열의 저장은 np.savez 함수를 이용해서 해준다. 이때 배열이 여러개면 확장자가 .npz인데 마찬가지로 입력하지 않더라도 자동으로 지정된다.

배열 여러개 저장

🔺 test2.npz 파일이 생성된 것을 알 수 있다.

np.savez('test2', first=a, second=b)

🔺 그런데 배열이 여러개면 파일로 저장해놓고 나중에 불러와서 그 안에 어떤 배열을 쓸지 분간이 안간다. 그래서 저장할 때 이렇게 배열마다 변수명을 하나씩 지정해줄 수 있다.

test2 = np.load('test2.npz')
test2
<numpy.lib.npyio.NpzFile at 0x7f2296219150>


aa = test2['first']
bb = test2['second']

aa
array([[0.7911335 , 0.48193955, 0.28275589],
       [0.31918767, 0.6709289 , 0.23894683],
       [0.46386797, 0.59256892, 0.20263481],
       [0.96591337, 0.71745162, 0.4015094 ]])

bb
array([[0.03312052, 0.94137015, 0.7907403 , 0.0912815 ],
       [0.61975818, 0.00502572, 0.65535165, 0.7769214 ],
       [0.7644989 , 0.32790997, 0.1082848 , 0.21680369]])


test2.files
['first', 'second']

🔺 저장했던 파일을 불러와서 test2에 받은 다음, test2안에서 first, second를 각각 또 변수를 하나씩 할당해서 받아주었다. 그러면 하나의 어레이처럼 출력할 수 있게 된다. 

만약 저장할 때 이렇게 어레이별로 호출할 키를 지정하지 않았다면 파일을 불러온 다음 각각을 어떻게 띄워서 작업할지 방법이 없다. 내가 모르는 것일수도 있는데, 일단은 여러개 어레이 입출력 시엔 키워드 지정해준다고 알아두어야 겠다.

이렇게 해서 numpy array에 대한 가장 기초적인 부분들에 대해 복습을 완료했다. 판다스로 (Pandas) 넘어가면서 넘파이는 추가로 특정 기능에 대한 심화학습이라던지, 실습 예제 위주로 계속 공부해야겠다.