numpy - 배열의 행렬 추출, 추가, 삭제, 병합, 분할

KDG·2021년 2월 9일
1

1. 추출

ar = np.arange(24).reshape(2,3,4)
  -> [[[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]],

      [[12, 13, 14, 15],
       [16, 17, 18, 19],
       [20, 21, 22, 23]]]
       
* ar[0][1][2] = ar[0,1,2]
# ar 첫번째 배열 2행 3열의 값. 콤마 콤마로 나열 가능
   -> 6
   
* 슬라이스 ar[0][:2,:3] = ar[0,:2,:3]
# ar 첫번째 배열 첫 번째 행부터 2번째 행까지, 첫 번째 열부터 3번째 행까지 
   -> array([[0, 1, 2],
             [4, 5, 6]])
             
# 비교 연산자를 이용해서 데이터 추출. 7보다 큰 수만 출력해보자
* ar > 7   # 비교연산자를 이용해 7보다 큰 값은 True, 작은값은 False로 출력
   -> array([[[False, False, False, False],
             [False, False, False, False],
             [ True,  True,  True,  True]],

            [[ True,  True,  True,  True],
             [ True,  True,  True,  True],
             [ True,  True,  True,  True]]])
             
* ar[ar > 7]  # ar이 가진 값 중 7보다 큰 값을 출력(1차원)
   -> array([ 8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23])
   
# 5보다 크고 10보다 작은 값들을 출력해보자
ar[(ar > 5) & (ar < 10)]
   -> array([6, 7, 8, 9])

2. 추가

1) 1차원

  • append(값, 추가할 값)
a = np.arange(3)
 -> [0 1 2]

* np.append(a, 3)
   -> [0 1 2 3]
   
* np.append(a, [3,4,5])
   -> [0 1 2 3 4 5]
   
* np.append(a, np.arange(3,6))
   -> [0 1 2 3 4 5]

* np.append([3,4,5], a)   # [3,4,5]에다가 a를 추가
   -> [3 4 5 0 1 2]
   
* np.append(np.arange(3,6), a)
   -> [3 4 5 0 1 2]
  • insert(값, 인덱스 위치, 추가할 값)
a = np.arange(3)
 -> [0 1 2]

* np.insert(a, 2, 100)  # 인덱스 2 위치에 100을 추가
   -> [  0   1 100   2]
   
* np.insert(a, 2, [100,101,102])
   -> [  0   1 100 101 102   2]

2) 2차원

  • append(값, 추가할 값, 행렬선택)
a_2d = np.arange(6).reshape(2,3)
 -> [[0 1 2]
     [3 4 5]] 

* np.append(a_2d,10)  
   -> [ 0  1  2  3  4  5 10]  # 1차원으로 변경됨
   
# a_2d_res = np.arange(6).reshape(2,3) * 5
* np.append(a_2d, a_2d_res, axis=0)  # axis=0 행으로 값 추가
   -> [[ 0  1  2]
       [ 3  4  5]
       [ 0  5 10]
       [15 20 25]]

* np.append(a_2d, a_2d_res, axis=1) # 열로 값 추가
   -> [[ 0  1  2  0  5 10]
       [ 3  4  5 15 20 25]]
  • insert(값, 인덱스 위치, 추가할 값, 행렬선택)
a_2d = np.arange(6).reshape(2,3)
 -> [[0 1 2]
     [3 4 5]] 

* np.insert(a_2d, 1, 100, axis=0)   
# 인덱스 행이 1인 위치에 100으로 채워진 배열 추가
   -> [[  0,   1,   2],
       [100, 100, 100],
       [  3,   4,   5]]
   
* np.insert(a_2d, 1, 100, axis=1)   
# 인덱스 열이 1인 위치에 100으로 채워진 배열 추가
   -> [[  0, 100,   1,   2],
       [  3, 100,   4,   5]]

* np.append(a_2d, a_2d_res, axis=1) # 열로 값 추가
   -> [[ 0  1  2  0  5 10]
       [ 3  4  5 15 20 25]]
       
# data = np.arange(100,103)
* np.insert(a_2d, 1, data, axis = 0)
    -> [[  0,   1,   2],
        [100, 101, 102],
        [  3,   4,   5]]
  • np.vstack( ( 값, 채울값 ) )
    • 이차원 배열의 행에 추가.
    • 튜플 형식의 인자
    • 기본값과 추가해야 할 값의 shape를 맞춰야 함
a_2d = np.arange(6).reshape(2,3)
 -> [[0 1 2]
     [3 4 5]] 
     
# data = np.arange(100,103)

* np.vstack((a_2d, data))
    -> [[  0,   1,   2],
        [  3,   4,   5],
        [100, 101, 102]]
  • np.hstack( ( 값, 채울값 ) )
    • 이차원 배열의 열에 추가.
    • 튜플 형식의 인자
    • 기본값과 추가해야 할 값의 shape를 맞춰야 함
a_2d = np.arange(6).reshape(2,3)
 -> [[0 1 2]
     [3 4 5]] 
     
# data = np.arange(4).reshape(2,2)

* np.vstack((a_2d, data))  
    -> [[0, 1, 2, 0, 1],
        [3, 4, 5, 2, 3]]

3. 삭제

a_2d = np.arange(12).reshape(3,4)
  -> [[ 0  1  2  3]
      [ 4  5  6  7]
      [ 8  9 10 11]]
     
* np.delete(a_2d,1)   # 1번 인덱스 원소만 삭제(1차원으로 변경)
    -> [ 0  2  3  4  5  6  7  8  9 10 11]
    
* np.delete(a_2d,(0,1,3)   # 0번, 1번, 3번 인덱스 원소 여러개 삭제 가능(1차원으로 변경)
    -> [ 2  4  5  6  7  8  9 10 11]
    
* np.delete(a_2d, 0, axis=0)   # 행 삭제
    -> [[ 4  5  6  7]
        [ 8  9 10 11]]
    
* np.delete(a_2d, 0, axis=1)   # 열 삭제
    -> [[ 1  2  3]
        [ 5  6  7]
        [ 9 10 11]]

4. 병합

두 배열끼리의 병합

a = np.ones((2,3), int)
  -> [[1, 1, 1]
      [1, 1, 1]]
     
b = np.full((2,3), 2)
    -> [[2, 2, 2]
        [2, 2, 2]]
  • concatenate( [배열1, 배열2], axis )
* np.concatenate([a, b], axis=0)  # 행 병합
  -> [[1, 1, 1],
      [1, 1, 1],
      [2, 2, 2],
      [2, 2, 2]]
     
* np.concatenate([a, b], axis=1)   # 열 병합
    -> [[1, 1, 1, 2, 2, 2],
        [1, 1, 1, 2, 2, 2]]
  • stack( [배열1, 배열2], axis )
* np.stack([a, b], axis=0) 
# 배열을 같은 차원으로 병합하지 않고 차원을 늘려 병합
  -> [[[1, 1, 1],
       [1, 1, 1]],

      [[2, 2, 2],
       [2, 2, 2]]]   # 3차원
     
* np.stack([a, b], axis=-1)
# zip과 같은 방식으로 같은 원소에 해당하는 원소끼리 묶어 병합
# 배열을 같은 차원으로 병합하지 않고 차원을 늘려 병합
    -> [[[1, 2],
         [1, 2],
         [1, 2]],

        [[1, 2],
         [1, 2],
         [1, 2]]]
  • block( ), hstack( ), vstack( ), dstack( )
* np.block([a, b])   # 열 병합
  -> [[1, 1, 1, 2, 2, 2],
      [1, 1, 1, 2, 2, 2]]
     
* np.hstack([a, b])   # 열 병합
  -> [[1, 1, 1, 2, 2, 2],
      [1, 1, 1, 2, 2, 2]]

* np.vstack([a, b])   # 행 병합
  -> [[1, 1, 1],
      [1, 1, 1],
      [2, 2, 2],
      [2, 2, 2]]

* np.dstack([a, b])
# zip과 같은 방식으로 같은 원소에 해당하는 원소끼리 묶어 병합
# 배열을 같은 차원으로 병합하지 않고 차원을 늘려 병합
# np.stack([a, b], axis=-1)와 같음
  -> [[[1, 2],
       [1, 2],
       [1, 2]],

      [[1, 2],
       [1, 2],
       [1, 2]]]

5. 분할

배열을 여러개의 배열로 분할

res = np.arange(16).reshape(4,4)
  -> [[ 0,  1,  2,  3],
      [ 4,  5,  6,  7],
      [ 8,  9, 10, 11],
      [12, 13, 14, 15]]
  • split( 배열, 분할개수, axis )
    분할하는 개수가 배열 크기의 약수여야 함
* np.split(res, 2, axis=0)
  -> [array([[0, 1, 2, 3],
             [4, 5, 6, 7]]), 
      array([[ 8,  9, 10, 11],
             [12, 13, 14, 15]])]
            
* np.split(res, 2, axis=1)
  -> [array([[ 0,  1],
             [ 4,  5],
             [ 8,  9],
             [12, 13]]), 
      array([[ 2,  3],
             [ 6,  7],
             [10, 11],
             [14, 15]])]            

* np.split(res,2)[0]
  -> [[0, 1, 2, 3],
      [4, 5, 6, 7]]
  • array_split( 배열, 분할개수, axis )
    분할하는 개수가 배열 크기의 약수가 아니어도 자동 분할
    배열안에 원소 수는 다를 수 있음
* np.array_split(res, 3, axis=0)
  -> [array([[0, 1, 2, 3],
             [4, 5, 6, 7]]), 
      array([[ 8,  9, 10, 11]]), 
      array([[12, 13, 14, 15]])]
            
* np.array_split(res, 3, axis=1)
  -> [array([[ 0,  1],
             [ 4,  5],
             [ 8,  9],
             [12, 13]]), 
      array([[ 2],
             [ 6],
             [10],
             [14]]), 
      array([[ 3],
             [ 7],
             [11],
             [15]])]            
  • vsplit( ), hsplit( )
    분할하는 개수가 배열 크기의 약수여야 함
* vsplit(배열, 분할수)
np.vsplit(res, 2)
  -> [array([[0, 1, 2, 3],
             [4, 5, 6, 7]]), 
      array([[ 8,  9, 10, 11],
             [12, 13, 14, 15]])]
            
* np.hsplit(배열, 분할수)
  -> [array([[ 0,  1],
             [ 4,  5],
             [ 8,  9],
             [12, 13]]), 
      array([[ 2,  3],
             [ 6,  7],
             [10, 11],
             [14, 15]])]         
  • dsplit(배열, 분할수)
    3차원 이상의 배열에서만 사용 가능
    분할하는 개수가 배열 크기의 약수여야 함
a_3d = np.arange(24).reshape(2,3,4)
  -> [[[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]],

      [[12, 13, 14, 15],
       [16, 17, 18, 19],
       [20, 21, 22, 23]]]
            
* np.dsplit(a_3d, 2)
  -> [array([[[ 0,  1],
              [ 4,  5],
              [ 8,  9]],

             [[12, 13],
              [16, 17],
              [20, 21]]]), 
       array([[[ 2,  3],
              [ 6,  7],
              [10, 11]],

             [[14, 15],
              [18, 19],
              [22, 23]]])]        

0개의 댓글