Lecture 강의

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

[03. 패키지 - NumPy] (1) 다차원 배열(np.array), (2) 인덱싱(:)과 합치기(np.concatenate)

작성자 : kim2kie

(2023-02-19)

조회수 : 1033

[참조]

 

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

(1) 다차원 배열(n-dimensional array; ndarray)
 1) 배열(array) 생성
 2) 초기화(initialization)
 3) 배열 덧붙이기(append)
 4) 범위 지정: range()/np.arange()/np.linspace()
 5) shape의 변경 → reshape(), dtype의 변경 → astype()

(2) 인덱싱(indexing)과 합치기 
 1) 인덱스 배열
 2) 불린(boolean) 배열
 3) 합치기



 

(1) 다차원 배열

1) 배열(array) 생성

  • list나 tuple 같은 시퀀스 자료형으로 부터 생성한다. 
     
  • Ex)
    import numpy as np

    X = np.array([0.1, 0.2, 0.3]) # X는 float64(64비트 실수)를 요소로 갖는 크기 3의 1차원 배열
    X.shape    # 배열의 형태 (3,); 요소 개수가 3인 1차원 배열
    X.dtype    # 요소의 데이터 타입, int32, float32 등; dtype('float64')
    X.ndim     # 차원수; 1
    X.size     # 요소의 개수; 3
    X.itemsize # 요소의 데이터 타입 크기(byte 단위); 8

    Y = np.array([[1,2,3][4,5,6]]) # Y는 int32(32비트 정수)을 요소 타입으로 하는 (2,3) 크기의 2차원 배열
       (Note: 행을 바꿀 때, comma(,)를 사용한다)
    Y.shape    # 배열의 형태 (2,3); 2행 3열
    Y.dtype    # 요소의 데이터 타입, int32, float32 등;  dtype('int32')
    Y.ndim     # 차원수; 2
    X.size     # 요소의 개수; 6
    X.itemsize # 요소의 데이터 타입 크기(byte 단위); 4

  • Q) X 배열의 행과 열의 개수를 알고 싶다.
    A) X.shape[0], X.shape[1]

  • Q) M = np.array([[1]])와 M = np.array([1])는 어떻게 다를까?
    M = np.array([1])는 1D array이고
    M = np.array([[1]])는 2D array이다.

  • 비교: size, ndim, shape 
    In[]: XT.size
    Out[]: 8061

    In[]: XT.ndim
    Out[]: 2

    In[]: XT.shape
    Out[]: (2687, 3)

 

2) 초기화(initialization)

  • Ex)
    import numpy as np

    Y = np.zeros([3,3]) # 모든 요소를 실수 0.으로 초기화한 3x3 배열 생성
    Y = np.ones([3,3])  # 모든 요소를 실수 1.으로 초기화한 3x3 배열 생성
    Y = np.ones([3,3],dtype='int32') # 정수형 배열을 생성할 때는 dtype을 int32로 변경
    Z = np.empty([3,3]) # 모든 요소를 초기화 하지 않고 3x3 배열 생성

    S = np.zeros_like(SD, dtype=complex) # Initialize complex arrays S like SD

  • Q) np.zeros([3,1])와 np.zeros(3) 는 어떻게 다를까?

    np.zeros([3,1]는 [[0.], [0.], [0.]]로 3x1인 2D array이며, 
    np.zeros(3)은 [0. 0. 0.]로 3개 요소를 갖는 (행과 열이 구분이 없는) 1D array이다. 

    참고로 1D array a는 transpose(a) - a는 np.zeros(len(a))와 같다.

  • Q) Udw = np.zeros_like(Hw) 는?
    Hw의 size와 type을 갖는 영(0) array인 Udw를 생성한다.
     

3) 배열 덧붙이기(append)

  • Ex)
    import numpy as np

    A = np.array([]) # 요소가 없는 1차원 (실수) 배열 생성
    for i in range(3):  # [0,1,2] 생성
        A = np.append(A,([1,2]) # [1,2]을 3번에 걸쳐 A에 더하여 [1.,2., 1.,2., 1.,2.] 배열 생성

     

 

4) 범위 지정: range()/np.arange()/np.linspace() 

  • range() 대신  np.arange(from,to,step) 또는 np.linspace(from,to,npoints) 사용
     
  • Ex)
    import numpy as np

    np.arange(1,1.5,0.1) # array([ 1. ,  1.1,  1.2,  1.3,  1.4]) 생성
    np.arange(3)  # start = 0(default), step = 1(default); array([0, 1, 2])
    np.arange(3.) # start = 0.(default), step = 1.(default); array([0., 1., 2.])
    np.linspace(0.,20.,5) # 0에서 20까지 5개 점을 생성; array([ 0.,  5., 10., 15., 20.])
    np.eye(3) # 대각요소가 1.인 3x3 단위행렬(identity) 생성

  • Q) 디버깅: np.arrange(30,15,-1)
    A) np.a
    rrange(30,15,-1) -> np.arange(30,15,-1)
    array + range -> a range

 

5) shape의 변경 → reshape(), dtype의 변경 → astype()

  • Ex)
    import numpy as np

    X = np.arange(0,9,1.) # array([0., 1., 2., 3., 4., 5., 6., 7., 8.])
    Y = X.reshape([3,3]) # 3x3 배열로 형태 변경
    # array([  [ 0.,  1.,  2.], [ 3.,  4.,  5.], [ 6.,  7.,  8.]  ])

    A = np.arange(3) # array([0, 1, 2])
    A.astype(int)  # A의 요소 dtype을 정수으로 변경
    A.astype(float) # A의 요소 dtype을 실수으로 변경

  • Q) reshape(-1, 정수) 의 행(row) 위치에 '-1'이 들어있을 경우
    A) 열의 개수에 따라 행의 개수가 가변적으로 정해진다.
    12개의 요소를 가진 x의 경우, 
    x.reshape(-1, 1) = shape(12,1)
    x.reshape(-1, 2) = shape(6, 2)
    x.reshape(-1, 3) = shape(4, 3)
    x.reshape(-1, 4) = shape(3, 4)

  • Q) "M = np.array([1])"를 Column 벡터인 2D array로 어떻게 전환할까?
    A) "
    M2d = M.reshap(-1,1)"

  • Q) 1차원 배열을 2차원 배열로 만들기 
    L =np.array([1,2,3,4,5]) #(5,)
    L15 = L[np.newaxis,:]    #(1,5)
    L51 = L[:,np.newaxis]    #(5,1)

 

(2) 인덱싱(indexing)과 합치기

1) 인덱스 배열 

  • Ex)
    import numpy as np

    A = np.array([1.2, -1.3, 2.2, 5.3, 3.7])
    A[0] # 첫 번째 요소; 1.2
    A[0:3] # 첫 번째부터 (3-1)번째 요소; array([ 1.2, -1.3,  2.2])
    A[-1] # 맨 마지막 요소; 3.7
    A[-2] # 맨 마지막에서 두 번째 요소; 5.3
    A[0:-1] # 첫 번째부터 (마지막번째 - 1)번째 요소;  array([ 1.2, -1.3,  2.2,  5.3])

    idx = [0,3] 
    A[idx] # 첫 번째와 네 번째 요소 배열; array([ 1.2,  5.3])

  • Q) 배열의 시작 index는?
    Python과 C는 0부터 시작하고,
    Matalab과 Fortran은 1부터 시작한다.

  • 축소행렬
    Dr = D[0:nmode]   # Reduced D
    Vr = V[:,0:nmode] # Reduced V

 

2) 불린(boolean) 배열 

  • Ex)
    import numpy as np

    X = np.array([1.2, -1.3, 2.2, 5.3, 3.7])
    X > 2       # 불린 배열 생성; array([False, False,  True,  True,  True])
    idx = X > 2 # 불린 배열 생성; array([False, False,  True,  True,  True])
    X[idx]    # X>2인 요소로 구성된 배열; array([2.2, 5.3, 3.7])
    X[X > 2]  # X>2인 요소로 구성된 배열; array([2.2, 5.3, 3.7])
    np.nonzero(X)   # 0이 아닌 요소의 인덱스 배열; (array([0, 1, 3, 5, 6], dtype=int64),)
    np.nonzero(X>2) # 2보다 큰 요소의 인덱스 배열; (array([2, 3, 4], dtype=int64),)

     

3) 합치기 

  • Ex)
    import numpy as np

    A = np.array([[1, 2], [3, 4]])
    B = np.array([[5, 6]])
    np.concatenate((A, B), axis=0) # axis방향(0: 수직, 1: 수평)으로 행렬을 합침
    # array([  [1, 2], [3, 4], [5, 6]  ])
    np.concatenate((A, B.T), axis=1) # B를 전치(transpose)한 이후에  수평으로 합침
    # array([  [1, 2, 5], [3, 4, 6]  ])

    Ex) 2차원일 경우 np.vstack()과 np.hstack()이 편리
    A = np.array([1,2,3])
    B = np.array([4,5,6])
    np.vstack((A,B)) # vertical 방향 합치기; array([ [1, 2, 3], [4, 5, 6] ])
    np.hstack((A,B)) # horizontal 방향 합치기; array([1, 2, 3, 4, 5, 6])
    C = np.append(A,B) # 배열 덧붙이기; array([1, 2, 3,   4, 5, 6])