Lecture 강의

Undergraduates 학부 Graduates 대학원 Lecture 역학 Lecture 설계 Lecture IT(IoT, AI) Lecture SAP2000 Lecture 아바쿠스 Lecture 파이썬 Lecture 엑셀 VBA Lecture 마이다스 Lecture 이탭스

[03. 패키지 - NumPy] (6) 파일 입출력(np.savetxt,np.loadtxt), (7) 구조체 배열, (8) 기타

작성자 : kim2kie

(2023-02-19)

조회수 : 1085

[참조]

 

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

 

 (6) 파일 입출력
  1) 텍스트(text) 파일
  2) 이진수(binary) 파일

 (7) 구조체 배열  
  1) 데이터 타입
  2) compound(합성) 타입과 구조체(structured) 배열

 (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.4000000e-01   8.8196305e-04   8.1919938e-03  -4.1484255e-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" 파일에 저장된 결과는 다음과 같다.
    0.000000000000000000e+00 1.000000000000000000e+00
    2.000000000000000000e+00 3.000000000000000000e+00


    1차원 배열(즉, 벡터)은 n*1 형태로 저장된다
    파일에서 n*1이나 1*n은 모두 1차원 벡터로 읽힌다.

     

  • 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) 구조체 배열

 

  • 구조체 배열(Structured array)의 요소는 여러 타입을 모은 compound(합성) 타입이다.
  • 구조체 배열은 (name,type)의 쌍으로 구성한다.

 

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

    dtype = [('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 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','<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 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()


     

  • 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