[Home] Python으로 돌아가기

NumPy-3 (6) 파일 입출력(np.savetxt,np.loadtxt), (7) 구조체 배열, (8) 기타

[참조]

 

NumPy는 과학 컴퓨팅을 위한 기본 패키지이다. 
다차원 배열 외에도 이산 푸리에 변환, 선형대수, 통계, 난수(random number) 등 다양한 기능을 가지고 있다.

목차

(6) 파일 입출력

(7) 구조체 배열

(8) 기타


 

(6) 파일 입출력

1) 텍스트(text) 파일

  • Ex)

    
    import numpy as np

    np.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.4000e-01 8.8196e-04 8.1919e-03 -4.1484e-03
    

    Ex)

    
    import numpy as np

    X = np.arange(4).reshape(2,2) np.savetxt('2x2.txt',X) Y = np.loadtxt('2x2.txt')

    Ex-결과)

    "2x2.txt" 파일에 저장된 결과는 다음과 같다.
    1차원 배열(즉, 벡터)은 n*1 형태로 저장된다
    파일에서 n*1이나 1*n은 모두 1차원 벡터로 읽힌다.

    
    0.000000000000000000e+00 1.000000000000000000e+00
    2.000000000000000000e+00 3.000000000000000000e+00

    Ex)

    
    import numpy as np
    
    X1 = 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 np
    
    A1 = 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 np
    
    acc = np.random.random(1024)  # 1024 points in [0,1.0)
    dt = 60.0
    station = 3
    
    np.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) 구조체 배열

    1) 데이터 타입

    Ex)

    
    import numpy as np
    
    Xi = 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) 문자열

    
    dtype = [('name','S10'),('age',''),('height','')]
    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'는 바이트 문자열이다.
    
    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 np
    
    dtype = [('name','S10'),('age','int32'),('weight','float64')]  
    # 위 예와 동일
    

    Ex) 여러 개의 리스트 데이터를 구조체 배열로 저장

    
    import numpy as np
    
    name = ['Alice', 'Bob', 'Doug']
    age = [25, 45, 37]
    height = [173.,181.,165.]
    
    dtype = [('name','S10'),('age',''),('height','')]< span="">')]<>
    
    X = np.zeros(3,dtype=dtype)
    X['name'] = name
    X['age'] = age
    X['height'] = height
    

    (8) 기타

    1) NaN 값 처리

    Ex) nan (not a number)

    
    import matplotlib.pyplot as plt
    
    x = [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()
    
    C NumPy-3.png

    2) 무한대 값 처리

    Ex) inf (infinite)

    
    import numpy as np
    
    data = [0,1,2,3]
    maximum = -np.inf # maximum: -inf
    for x in data:
        if x > maximum:
            maximum = x # maximum: 3