ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • NumPy 한번에 끝내기 02 - 데이터 과학 핵심 도구 (배열 조회/인덱싱/삽입/수정/삭제/복사)
    빅데이터/NumPy 2022. 1. 18. 15:50

    유투버 '이수안 컴퓨터 연구소'님 강의 참조

     

     

     

     

    01 배열 속성 정보

    import numpy as np
    
    a1 = np.array([1,2,3,4,5])
    a2 = np.array([[1,2,3],[4,5,6],[7,8,9]])
    a3 = np.array([ [ [1,2,3], [4,5,6], [7,8,9] ],
                 [ [10,11,12],[13,14,15],[16,17,18] ],
                 [ [19,20,21],[22,23,24],[25,26,27] ] ])
                 
    def array_info(array):
        print(array)
        print("ndim:", array.ndim) # 차원수 
        print("shape:",array.shape) # 엘리멘트 수
        print("dtype:",array.dtype) # 데이터 타입
        print("size:",array.size) # 배열안의 엘리멘트 총 개수
        print("itemsize:",array.itemsize) # 각 엘리먼트의 사이즈 (byte)
        print("nbytes:",array.nbytes) # size * itemsize = nbytes(전체 사이즈)
        print("strides:",array.strides) # 각각의 엘리멘트가 다음 엘리멘트로 갈때 필요한 바이트 수
    
    array_info(a1)
    [1 2 3 4 5]
    ndim: 1
    shape: (5,)
    dtype: int32
    size: 5
    itemsize: 4
    nbytes: 20
    strides: (4,)
    
    array_info(a2)
    [[1 2 3]
     [4 5 6]
     [7 8 9]]
    ndim: 2
    shape: (3, 3)
    dtype: int32
    size: 9
    itemsize: 4
    nbytes: 36
    strides: (12, 4)
    
    array_info(a3)
    [[[ 1  2  3]
      [ 4  5  6]
      [ 7  8  9]]
    
     [[10 11 12]
      [13 14 15]
      [16 17 18]]
    
     [[19 20 21]
      [22 23 24]
      [25 26 27]]]
    ndim: 3
    shape: (3, 3, 3)
    dtype: int32
    size: 27
    itemsize: 4
    nbytes: 108
    strides: (36, 12, 4)

     

     

     

     

    02 배열 인덱싱 및 슬라이스

    print(a1)
    print(a1[0])
    print(a1[-1])
    [1 2 3 4 5]
    1
    5
    
    print(a2)
    print(a2[0, 0])
    print(a2[2, -1])
    print(a2[1, 2])
    [[1 2 3] 0
     [4 5 6] 1
     [7 8 9]] 2
    1
    9
    6
    
    print(a3)
    print(a3[0, 0, 0])
    print(a3[2, 1, 1])
    [[[ 1  2  3]
      [ 4  5  6]   0
      [ 7  8  9]]
    
     [[10 11 12]
      [13 14 15]   1
      [16 17 18]]
    
     [[19 20 21]
      [22 23 24]   2
      [25 26 27]]]
    1
    23
    • 2차원/3차원으로 넘어가게되면 차원의 순서도 포함 된다. 

     

     

     

    • 슬라이싱 : a[start:stop:step]
    print(a1)
    print(a1[0:2])
    print(a1[::2])
    print(a1[::-1])
    
    [1 2 3 4 5]
    [1 2]
    [1 3 5]
    [5 4 3 2 1]
    
    # 2차원 [가로값, 세로값]
    print(a2)
    print(a2[1])
    print(a2[1, :]) 
    print(a2[:2, :2])
    [[1 2 3]
     [4 5 6]
     [7 8 9]]
    [4 5 6]
    [4 5 6]
    [[1 2]
     [4 5]]
     
    print(a3)
    print(a3[1])
    print(a3[:1, :1, :1])
    [[[ 1  2  3]
      [ 4  5  6]
      [ 7  8  9]]
    
     [[10 11 12]
      [13 14 15]
      [16 17 18]]
    
     [[19 20 21]
      [22 23 24]
      [25 26 27]]]
    [[10 11 12]
     [13 14 15]
     [16 17 18]]
    [[[1]]]

     

     

    • 불리언 인덱싱
    print(a1)
    b1 = [False, True, True, False, True]
    print(a1[b1])
    b1 = [True, False, True, True, False]
    print(a1[b1])
    
    [1 2 3 4 5]
    [2 3 5]
    [1 3 4]
    
    
    print(a2)
    b2 = np.random.randint(0, 2, (3,3), dtype = bool)
    print(b2)
    print(a2[b2])
    
    [[1 2 3]
     [4 5 6]
     [7 8 9]]
    [[ True False False]
     [False  True  True]
     [ True  True False]]
    [1 5 6 7 8]
    • 팬시 인덱싱 - 팬시 인덱싱은 단순 인덱싱과 비슷하지만, 단일 스칼라 대신 인덱스 배열을 전달한다. 이로써 복잡한 배열 값의 하위 집합에 매우 빠르게 접근해 그것을 수정할 수 있다. 한 번에 여러 배열 요소에 접근하기 위해 인덱스의 배열을 전달.
    print(a1)
    print([a1[0], a1[2]])
    idx = [0, 2]
    print(a1[idx])
    
    idx = np.array([[0,1],
                  [2, 0]])
    print(a1[idx])
    
    [1 2 3 4 5]
    [1, 3]
    [1 3]
    [[1 2]
     [3 1]]
     
     
    print(a2)
    row = np.array([0,2]) #(가로값, 세로값)
    col = np.array([1,2])
    print(a2[row, col])
    print(a2[row, :])
    print(a2[:, col])
    
    [[1 2 3]
     [4 5 6]
     [7 8 9]]
    [2 9]
    [[1 2 3]
     [7 8 9]]
    [[2 3]
     [5 6]
     [8 9]]

     

     

     

    03 배열 IUDC

     

    - 삽입

    # insert() : 배열의 특정 위치에 값 삽입. axis 없이 지정시 1차원 배열로 변환
    # 원본 배열에 변경 없이 새로운 값을 넣어 반환
    print(a1)
    b1 = np.insert(a1, 0, 10) #insert(원본배열, 인덱싱값, 원하는 숫자)
    print(b1)
    print(a1)
    c1 = np.insert(a1, 2, 10)
    print(c1)
    
    [1 2 3 4 5]
    [10  1  2  3  4  5]
    [1 2 3 4 5]
    [ 1  2 10  3  4  5]
    
    
    print(a2)
    b2 = np.insert(a2, 1, 10, axis=0)
    print(b2)
    c2 = np.insert(a2, 3, 10, axis=1)
    print(c2)
    
    [[1 2 3]
     [4 5 6]
     [7 8 9]]
    [[ 1  2  3]
     [10 10 10]
     [ 4  5  6]
     [ 7  8  9]]
    [[ 1  2  3 10]
     [ 4  5  6 10]
     [ 7  8  9 10]]

     

    - 수정

    print(a1)
    a1[0] = 3
    a1[3] = 10
    print(a1)
    a1[:1] = 9
    print(a1)
    
    [1 2 3 4 5]
    [ 3  2  3 10  5]
    [ 9  2  3 10  5]
    
    i = np.array([1, 3, 4])
    a1[i] = 0
    print(a1)
    a1[i] += 4
    print(a1)
    
    [9 0 3 0 0]
    [9 4 3 4 4]
    
    print(a2)
    a2[0, 0] = 1
    a2[1, 1] = 3
    a2[0] = 1
    print(a2)
    row = np.array([0,1])
    col = np.array([1,2])
    a2[row, col] = 3
    print(a2)
    
    [[1 1 1]
     [4 3 6]
     [7 8 9]]
    [[1 1 1]
     [4 3 6]
     [7 8 9]]
    [[1 3 1]
     [4 3 3]
     [7 8 9]]

     

    - 삭제

    # delete() : 배열의 특정 위치에 값 삭제. axis를 지정 하지 않으면 1차원 배열로 반환
    # 똑같이 원본 배열 변경없이 새로운 배열 반환. 
    
    print(a1)
    b1 = np.delete(a1, 1)
    print(b1)
    print(a1)
    
    [9 4 3 4 4]
    [9 3 4 4]
    [9 4 3 4 4]
    
    print(a2)
    b2 = np.delete(a2, 1, axis=1)
    print(b2)
    c2 = np.delete(a2, 1, axis=0)
    print(c2)
    
    [[1 3 1]
     [4 3 3]
     [7 8 9]]
    [[1 1]
     [4 3]
     [7 9]]
    [[1 3 1]
     [7 8 9]]

     

    - 복사

    # 배열 복사 - 리스트 자료형과 달리 배열의 슬라이스는 복사본이 아님. 원본의 값도 바뀜
    print(a2)
    print(a2[:2, :2])
    print()
    
    a2_sub = a2[:2, :2]
    print(a2_sub)
    a2_sub[:, 1] = 1
    print(a2_sub)
    print(a2)
    
    
    [[1 0 1]
     [4 0 3]
     [7 8 9]]
    [[1 0]
     [4 0]]
    
    [[1 0]
     [4 0]]
    [[1 1]
     [4 1]]
    [[1 1 1]
     [4 1 3]
     [7 8 9]]
    # copy() : 배열이나 하위 배열 내의 값을 명시적으로 복사
    print(a2)
    a2_sub_copy = a2[:2, :2].copy()
    print(a2_sub_copy)
    a2_sub_copy[:, 1] = 1
    print(a2_sub_copy)
    print(a2)
    
    [[1 1 1]
     [4 1 3]
     [7 8 9]]
    [[1 1]
     [4 1]]
    [[1 1]
     [4 1]]
    [[1 1 1]
     [4 1 3]
     [7 8 9]]
Designed by Tistory.