ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • NumPy 한번에 끝내기 03 - 데이터 과학 핵심 도구 (배열 변환/연산)
    빅데이터/NumPy 2022. 1. 18. 18:48

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

     

     

    01 배열 변환

    - 배열 전치 및 축 변경

    print(a2)
    print(a2.T) #.T - 배열 전치 변경
    print()
    print(a3)
    print(a3.T)
    
    [[1 2 3]
     [4 5 6]
     [7 8 9]]
    [[1 4 7]
     [2 5 8]
     [3 6 9]]
    
    [[[ 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]]]
    [[[ 1 10 19]
      [ 4 13 22]
      [ 7 16 25]]
    
     [[ 2 11 20]
      [ 5 14 23]
      [ 8 17 26]]
    
     [[ 3 12 21]
      [ 6 15 24]
      [ 9 18 27]]]
      
      
    print(a2)
    print(a2.swapaxes(1,0)) # .swapaxes - 축 변경
    print()
    print(a3)
    print(a3.swapaxes(1,2))
    
    [[1 2 3]
     [4 5 6]
     [7 8 9]]
    [[1 4 7]
     [2 5 8]
     [3 6 9]]
    
    [[[ 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]]]
    [[[ 1  4  7]
      [ 2  5  8]
      [ 3  6  9]]
    
     [[10 13 16]
      [11 14 17]
      [12 15 18]]
    
     [[19 22 25]
      [20 23 26]
      [21 24 27]]]

     

    - 배열 재 구조화

    # reshape() : 배열의 형상을 변경
    n1 = np.arange(1, 10)
    print(n1)
    print(n1.reshape(3, 3))
    
    [1 2 3 4 5 6 7 8 9]
    [[1 2 3]
     [4 5 6]
     [7 8 9]]
     
     # newaxis() : 새로운 축 추가
    print(n1)
    print(n1[np.newaxis, :5]) #row
    print(n1[:5, np.newaxis]) #col
    
    [1 2 3 4 5 6 7 8 9]
    [[1 2 3 4 5]]
    [[1]
     [2]
     [3]
     [4]
     [5]]

     

    - 배열 크기 변경

    # 배열 모양만 변경 - 배열 크기가 증가 하지만 남은 공간은 0으로 채워 짐
    n2 = np.random.randint(0, 10, (2, 5))
    print(n2)
    n2.resize((5,2))
    print(n2)
    
    [[5 0 7 9 1]
     [6 2 0 6 6]]
    [[5 0]
     [7 9]
     [1 6]
     [2 0]
     [6 6]]
     
     
    n2.resize((5,5))
    print(n2)
    n2.resize((3,3))
    print(n2)
    
    [[5 0 7 9 1]
     [6 2 0 6 6]
     [0 0 0 0 0]
     [0 0 0 0 0]
     [0 0 0 0 0]]
    [[5 0 7]
     [9 1 6]
     [2 0 6]]

     

    - 배열 추가

    # append() : 배열의 끝에 값 추가, axis값을 지정을 하지 않으면 1차원 배열 형태로 변형되어 결합
    a2 = np.arange(1, 10).reshape(3,3)
    print(a2)
    b2 = np.arange(10, 19).reshape(3,3)
    print(b2)
    
    [[1 2 3]
     [4 5 6]
     [7 8 9]]
    [[10 11 12]
     [13 14 15]
     [16 17 18]]
     
    c2 = np.append(a2, b2)
    print(c2)
    c2 = np.append(a2, b2, axis = 0) #axis 값 지정시 0은 세로 1은 가로
    print(c2)
    c2 = np.append(a2, b2, axis = 1)
    print(c2)
    
    [ 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18]
    [[ 1  2  3]
     [ 4  5  6]
     [ 7  8  9]
     [10 11 12]
     [13 14 15]
     [16 17 18]]
    [[ 1  2  3 10 11 12]
     [ 4  5  6 13 14 15]
     [ 7  8  9 16 17 18]]

     

    - 배열 연결

    # concatenate() : 튜플이나 배열의 리스트를 인수로 사용해 배열 연결
    a1 = np.array([1, 3, 5])
    b1 = np.array([2, 4, 6])
    np.concatenate([a1, b1])
    array([1, 3, 5, 2, 4, 6])
    
    
    c1 = np.array([7,8,9])
    np.concatenate([a1, b1, c1])
    array([1, 3, 5, 2, 4, 6, 7, 8, 9])
    
    
    a2 = np.array([[1,2,3],[4,5,6]])
    np.concatenate([a2, a2])
    array([[1, 2, 3],
           [4, 5, 6],
           [1, 2, 3],
           [4, 5, 6]])
           
           
    a2 = np.array([[1,2,3],[4,5,6]])
    np.concatenate([a2, a2], axis = 1)
    array([[1, 2, 3, 1, 2, 3],
           [4, 5, 6, 4, 5, 6]])
           
    
    # vstack() - 수직 스택, 1차원으로 연결
    np.vstack([a2, a2])
    array([[1, 2, 3],
           [4, 5, 6],
           [1, 2, 3],
           [4, 5, 6]])
           
    # hstack() - 수평 스택 - 2차원으로 연결
    np.hstack([a2, a2])
    array([[1, 2, 3, 1, 2, 3],
           [4, 5, 6, 4, 5, 6]])
           
    # dstack() - 깊이 스택 - 3차원으로 연결
    np.dstack([a2, a2])
    array([[[1, 1],
            [2, 2],
            [3, 3]],
    
           [[4, 4],
            [5, 5],
            [6, 6]]])
            
    # stack() - 새로운 차원으로 연결
    np.stack([a2, a2])
    array([[[1, 2, 3],
            [4, 5, 6]],
    
           [[1, 2, 3],
            [4, 5, 6]]])

     

    - 배열 분할

    # split() : 배열을 분할함
    a1 = np.arange(0, 10)
    print(a1)
    b1, c1 = np.split(a1, [5]) #.splic(분할 배열, 자르는 기준 값)
    print(b1, c1)
    b1, c1, d1, e1, f1 = np.split(a1, [2,4,6,8])
    print(b1, c1, d1, e1, f1)
    
    [0 1 2 3 4 5 6 7 8 9]
    [0 1 2 3 4] [5 6 7 8 9]
    [0 1] [2 3] [4 5] [6 7] [8 9]
    
    
    # vsplit() - 수직 분할, 1차원 / hsplit() - 수평 분할, 2차원 / dsplit() - 깊이 분할, 3차원
    a2 = np.arange(1,10).reshape(3, 3)
    print(a2)
    b2, c2 = np.vsplit(a2, [2])
    print(b2)
    print(c2)
    
    [[1 2 3]
     [4 5 6]
     [7 8 9]]
    [[1 2 3]
     [4 5 6]]
    [[7 8 9]]
    
    a2 = np.arange(1,10).reshape(3, 3)
    print(a2)
    b2, c2 = np.hsplit(a2, [2])
    print(b2)
    print(c2)
    
    [[1 2 3]
     [4 5 6]
     [7 8 9]]
    [[1 2]
     [4 5]
     [7 8]]
    [[3]
     [6]
     [9]]
     
     a2 = np.arange(1,28).reshape(3, 3, 3)
    print(a2)
    b2, c2 = np.dsplit(a2, [2])
    print(b2)
    print(c2)
    
    [[[ 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]]]
    [[[ 1  2]
      [ 4  5]
      [ 7  8]]
    
     [[10 11]
      [13 14]
      [16 17]]
    
     [[19 20]
      [22 23]
      [25 26]]]
    [[[ 3]
      [ 6]
      [ 9]]
    
     [[12]
      [15]
      [18]]
    
     [[21]
      [24]
      [27]]]

     

     

    02 배열 연산

    • NumPy의 배열 연산은 벡터화(vectorized) 연산을 사용 → 보통의 프로그래밍 언어에서 배열 연산은 배열 형태의 엘리먼트들을 반복문을 통해 꺼내서 각각 연산을 시키는게 기본 이다. 하지만 'NumPy'가 지원하는 벡터화는 반복문없이 벡터의 같은 인덱스에 위차한 원소들끼리 연산 수행이 가능하게 해준다. 
    • 반복을 최소화하고 범용 함수를 통해 구현이 된다. 
    • 넘파이의 배열 연산에서는 '브로드 캐스팅' 이라는 개념을 알아야 한다.
      배열에서 단순 +5를 하게되면 나머지 배열 부분의 'shape'이 연산하고자 하는 값이 저절로 맞춰지게 되는 것. 즉 사진에서 보는것처럼 자동적으로 캐스팅이 된다는 것.
    a1 = np.array([1,2,3])
    print(a1)
    print(a1 + 5)
    
    [1 2 3]
    [6 7 8]
    
    
    a2 = np.arange(1, 10).reshape(3,3)
    print(a2)
    print(a1 + a2)
    
    [[1 2 3]
     [4 5 6]
     [7 8 9]]
    [[ 2  4  6]
     [ 5  7  9]
     [ 8 10 12]]

     

     

    - 산술 연산

    범용함수를 쓰거나 연산자를 바로 써도 상관이 없다

    a1 = np.arange(1, 10)
    print(a1)
    print(a1 + 1)
    print(np.add(a1, 10))
    print(np.subtract(a1, 2))
    print(np.multiply(a1, 3))
    print(np.divide(a1,2))
    print(np.power(a1, 2))
    print(np.mod(a1, 2))
    
    [1 2 3 4 5 6 7 8 9]
    [ 2  3  4  5  6  7  8  9 10]
    [11 12 13 14 15 16 17 18 19]
    [-1  0  1  2  3  4  5  6  7]
    [ 3  6  9 12 15 18 21 24 27]
    [0.5 1.  1.5 2.  2.5 3.  3.5 4.  4.5]
    [ 1  4  9 16 25 36 49 64 81]
    [1 0 1 0 1 0 1 0 1]

    ▶ 차원에 관계없이 연산자/범용함수가 모두 적용이 가능 하다

     

     

     

    - 절대값/제곱-제곱근/지수와 로그/삼각 함수

    # 절대값 - absolute/abs
    a1 = np.random.randint(-10, 10, size=5)
    print(a1)
    print(np.absolute(a1))
    print(np.abs(a1))
    
    [  6  -6  -2   3 -10]
    [ 6  6  2  3 10]
    [ 6  6  2  3 10]
    
    
    # 제곱 square/sqrt
    print(a1)
    print(np.square(a1))
    print(np.sqrt(a1))
    
    [  6  -6  -2   3 -10]
    [ 36  36   4   9 100]
    [2.44948974        nan        nan 1.73205081        nan]
    
    
    
    # 지수/로그
    a1 = np.random.randint(1, 10, size=5)
    print(np.exp(a1))
    print(np.exp2(a1))
    print(np.a1,2)
    
    print(a1)
    print(np.log(a1)) #log2, log10 등 조절 가능

    - 삼각 함수

    # 삼각함수
    t = np.linspace(0, np.pi, 3) #.linspace(시작값, 끝값, 개수) - 균등하게 배분
    print(t)
    print(np.sin(t))
    print(np.cos(t))
    print(np.tan(t))
    
    [0.         1.57079633 3.14159265]
    [0.0000000e+00 1.0000000e+00 1.2246468e-16]
    [ 1.000000e+00  6.123234e-17 -1.000000e+00]
    [ 0.00000000e+00  1.63312394e+16 -1.22464680e-16]

     

Designed by Tistory.