[03. 패키지 - NumPy] (6) 파일 입출력(np.savetxt,np.loadtxt), (7) 구조체 배열, (8) 기타
작성자 : kim2kie
(2023-02-19)
조회수 : 1810
[참조]
- 공학자를 위한 Python, 조정래, 2022: 3. NumPy
https://wikidocs.net/14569 - Dookie Kim, Python: From Beginning to Application, 2022
https://www.dropbox.com/s/oa86j9ap62esmtz/Python.pdf?dl=0
NumPy는 과학 컴퓨팅을 위한 기본 패키지이다.
다차원 배열 외에도 이산 푸리에 변환, 선형대수, 통계, 난수(random number) 등 다양한 기능을 가지고 있다.
(6) 파일 입출력
1) 텍스트(text) 파일
2) 이진수(binary) 파일
(7) 구조체 배열
1) 데이터 타입
2) compound(합성) 타입과 구조체(structured) 배열
(8) 기타
(6) 파일 입출력
1) 텍스트(text) 파일
-
Ex)
import numpy as npnp.savetxt(fname, X, delimiter=' ', ...)
# np.savetxt()로 텍스트파일로 저장한다.
# 디폴트 구분자(delimiter)로 스페이스를 사용한다. 콤마를 사용하려면 delimiter=','로 지정한다.X = np.loadtxt(fname, delimiter=' ', skiprows=0, comments='#', ...)
# np.loadtxt()로 텍스트파일을 읽는다.
# 빌트인 패키지인 csv와 달리 헤더(header)를 읽지 못한다.
# np.loadtxt()가 skiprows(처음 몇개의 열을 무시할 건지)와 comment 문자를 지정한다.
(Note) np.savetxt()와 np.loadtxt()는 각각 출력과 입력을 나타내는 np 함수이다. -
Q) 양수는 blank로, 음수는 -로 float를 출력하려면?
A) % + blank + .7e
코드) np.savetxt('resp.dat', resp, fmt='% .7e', delimiter=' ', newline='\n')
결과) 2.4000000e-01 8.8196305e-04 8.1919938e-03 -4.1484255e-03
-
Ex)
import numpy as npX = np.arange(4).reshape(2,2)
np.savetxt('2x2.txt',X)
Y = np.loadtxt('2x2.txt') -
Ex-결과)
"2x2.txt" 파일에 저장된 결과는 다음과 같다.
0.000000000000000000e+00 1.000000000000000000e+00
2.000000000000000000e+00 3.000000000000000000e+00
1차원 배열(즉, 벡터)은 n*1 형태로 저장된다
파일에서 n*1이나 1*n은 모두 1차원 벡터로 읽힌다. -
Ex)
import numpy as npX1 = np.array([0,1])
np.savetxt('X1.txt',X1)X2 = np.array([0,1]).reshape(1,2)
np.savetxt('X2.txt',X2)X3 = np.array([0,1]).reshape(2,1)
np.savetxt('X3.txt',X3)Y1 = np.loadtxt('X1.txt') # array( [0., 1.])
Y2 = np.loadtxt('X2.txt') # array( [0., 1.])
Y3 = np.loadtxt('X3.txt') # array( [0., 1.]) -
Ex-결과)
"X1.txt" 파일
0.000000000000000000e+00
1.000000000000000000e+00"X2.txt" 파일
0.000000000000000000e+00 1.000000000000000000e+00"X3.txt" 파일
0.000000000000000000e+00
1.000000000000000000e+00
-
Ex)
import numpy as npA1 = np.array([0,1])
A1.tofile('A.dat') # A1을 (이진수 형태로) 저장
A2 = np.fromfile('A.dat', dtype=int) # 저장했던 (이진수 형태의) A를 A2로 불러들임
A1 == A2 # array( [True,True] )
2) 이진수(binary) 파일
-
save(file,arr,...): arr을 .npy 포맷으로 file에 씀
savez(file,*args,**kwds): args와 kwgs에 주어진 여러 배열을 .npz 포뱃으로 file 에 씀.
**kwds로 저장할 때 주어진 키워드가 사용되고, args로 저장하는 경우 arr_0, arr_1, 등을 키워드를 사용한 것과 같음 -
Ex)
import numpy as npacc = np.random.random(1024) # 1024 points in [0,1.0)
dt = 60.0
station = 3np.savez('acc.npz',acc=acc,dt=dt,station=station) # acc,dt,station를 인자로 acc.npz에 저장
data = np.load('acc.npz') # acc,dt,station인 세 인자로 저장된 acc.npz를 data로 불러 들임
data["acc"] # array( [0.74681048, ..., 0.62417015] )
data["dt"] # array(60.)
data["station"] # array(3)
(7) 구조체 배열
- 구조체 배열(Structured array)의 요소는 여러 타입을 모은 compound(합성) 타입이다.
- 구조체 배열은 (name,type)의 쌍으로 구성한다.
1) 데이터 타입
-
Ex)
import numpy as npXi = np.array([0,1],dtype=np.int16) # 배열의 dtype을 정수형(np.int32)으로 지정
Xf = np.array([0,1],dtype=np.float64) # 배열의 dtype을 정수형(np.float64)으로 지정
2) compound(합성) 타입과 구조체(structured) 배열
-
Ex) 일반 문자열(str) vs 바이트(bytes) 문자열
import numpy as npdtype = [('name','S10'),('age','<i4>'),('height','<f4>')]
X = np.array([('Alice',19,173.),('Bob',20,'181.')],dtype=dtype)
X = np.array([('Alice',19,173.),('Bob',20,'181.')],dtype=dtype)
# b'Alice'처럼 ' '(작은따옴표)나 " "(큰따옴표) 앞에 b를 붙이면 바이트(bytes) 문자열이 된다.
# 'Alice'는 일반 문자열(str)이고, b'Alice'는 바이트 문자열이다.')]</f4></i4>X['name'] # array( [b'Alice', b'Bob'], dtype='|S10' )
X['age'] # array( [19, 20] )
X['height'] # array( [173., 181.], dtype=float32 )
X[0] # (b'Alice', 19, 173.) -
Ex)
import numpy as npdtype = [('name','S10'),('age','int32'),('weight','float64')] # 위 예와 동일
-
Ex) 여러 개의 리스트 데이터를 구조체 배열로 저장
import numpy as npname = ['Alice', 'Bob', 'Doug']
age = [25, 45, 37]
height = [173.,181.,165.]dtype = [('name','S10'),('age','<i4>'),('height','<f4>')]< span="">')]<></f4></i4>
X = np.zeros(3,dtype=dtype)
X['name'] = name
X['age'] = age
X['height'] = height
(8) 기타
-
Ex) nan (not a number)
import numpy as np
import matplotlib.pyplot as pltx = [1,2,3,4]
y1 = [4,7,8,9]
y2 = [2,3,1,np.nan]
# 그림을 그릴 때 nan이 있으면 그 포인트는 그리지 않는다.plt.plot(x,y1)
plt.plot(x,y2)
plt.show()
-
Ex) inf (infinite)
import numpy as npdata = [0,1,2,3]
maximum = -np.inf # maximum: -inf
for x in data:
if x > maximum:
maximum = x # maximum: 3