파이썬 넘파이(Numpy) 파일 입출력 (파일 저장 및 불러오기, npy, npz, txt, csv)
이 글에서는 파이썬 넘파이(Numpy) 배열 데이터를 파일로 저장하고 불러오는 방법에 대해서 바이너리 형식(npy, npz)부터 엑셀 호환 텍스트 형식(csv, txt)까지 예제와 함께 정리해 보도록 하겠습니다.
01. 넘파이 전용 바이너리 파일 (npy, npz)
넘파이 자체 형식(npy, npz)으로 저장하게 되면, 텍스트 형식(txt, csv 등)에 비해 빠르고 용량도 작으면서, 나중에 다시 데이터를 불러올 때 배열의 형태(shape)와 데이터 타입(dtype)등 배열 정보가 함께 저장되어 편리하고 효율적으로 사용할 수 있습니다.
1) 배열 저장하기
단일 배열 데이터 저장시에는 np.save( ) 함수를 사용하여 .npy 확장자로 저장하며, 여러 개의 배열을 저장할 때에는 np.savez( ) 함수를 사용하여 .npz 확장자로 저장합니다.
-
np.save(file, arr) : 단일 배열 저장
- file : 파일명 (확장자 .npy를 붙이지 않아도 자동으로 추가됩니다.)
- arr : 저장할 데이터(배열)입니다. -
np.savez(file, *args, **kwds) : 여러 개의 배열 저장
- file : 파일명 (확장자 .npz를 붙이지 않아도 자동으로 추가됩니다.)
- *args : 파일에 저장할 배열들 (이름을 지정하지 않으면 arr_0, arr_1, ... 과 같은 이름으로 저장됩니다.)
- **kwds : 저장할 배열에 이름을 붙이기 위한 키워드 인자
2) 배열 불러오기
배열을 불러올 때는 .npy, .npz 확장자 모두 np.load( ) 함수를 사용하여 불러옵니다.
-
np.load(file) : 배열 불러오기
- file : 불러들일 파일명
- .npy 확장자인 경우 : 단일 배열이 반환됨
- .npz 확장자인 경우 : 키(key)를 통해 여러 배열에 접근할 수 있는 NpzFile 객체가 반환됨
-
저장된 배열의 이름 확인 방법
- .files 속성을 사용하면 저장된 키(key) 목록을 확인할 수 있습니다.
import numpy as np
d1 = np.array([1, 2, 3])
d2 = np.array([4, 5, 6])
np.save("d1.npy", d1) # 저장(하나)
np.savez("d12.npz", d1, d2) # 저장(여러개)
np.savez("d12f.npz", a1=d1, a2=d2) # 저장(여러개, 파일명 지정)
ld1 = np.load("d1.npy")
print(ld1) # 결과: [1 2 3]
ld2 = np.load("d12.npz")
print(ld2.files) # 결과: ['arr_0', 'arr_1']
print(ld2['arr_0']) # 결과: [1 2 3]
print(ld2['arr_1']) # 결과: [4 5 6]
ld3 = np.load("d12f.npz")
print(ld3.files) # 결과: ['a1', 'a2']
print(ld3['a1']) # 결과: [1 2 3]
print(ld3['a2']) # 결과: [4 5 6]
02. 텍스트 파일 (txt, csv)
만약 데이터를 엑셀이나 메모장에서도 열어서 확인해야 한다면 텍스트 형식을 사용해야 합니다.
1) 텍스트 파일 저장하기
넘파이 배열을 텍스트 형식으로 저장할 때는 np.savetxt( ) 함수를 사용하여 .txt 또는 .csv 파일로 저장할 수 있습니다.
-
np.savetxt(fname, X, fmt='%.18e', delimiter=' ') :
배열을 텍스트 형식으로 저장하는 함수
- fname : 저장할 파일명
- X : 저장할 배열 (1차원 or 2차원 배열)
- fmt : 데이터 저장 포맷 (%d : 정수, %.2f : 소수점 둘째 자리까지, %s : 문자열)
- delimiter : 데이터 사이를 구분할 문자 (기본값은 공백, CSV 파일은 ',' 사용)
2) 텍스트 파일 불러오기
np.savetxt( )로 저장된 파일이나 텍스트 파일(txt, csv)을 읽어서 넘파이 배열로
불러올 때는 np.loadtxt( ) 함수를 사용합니다.
-
np.loadtxt(fname, dtype=<class 'float'>, delimiter=None,
skiprows=0, usecols=None) : 텍스트 파일 불러오기
- fname : 읽어올 파일명
- dtype : 불러온 배열의 데이터 타입 (기본값 float)
- delimiter : 데이터 사이의 구분자 (기본값은 공백, CSV 파일은 ','로 설정)
- skiprows : 파일의 앞부분에서 무시할 행의 개수
- usecols : 읽어올 열(col)의 번호 지정 (ex, usecols=(0, 2)는 1번째와 3번째 열만 가져옴)
import numpy as np
d = np.array([[1, 1, 1.1111], [2, 4, 4.4444], [3, 5, 5.5555]])
np.savetxt("d.txt", d, delimiter=',', fmt=['%d', '%d', '%.2f'])
load_txt = np.loadtxt("d.txt", delimiter=',', usecols=(0,2))
print(load_txt) # 결과: [[1. 1.11][2. 4.44][3. 5.56]]
