ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 1. numpy_basic
    school(3)/인공지능 2021. 4. 26. 22:25
    narr = np.array([3,4,5], dtype = float)
    print(narr)

    About NumPy

    NumPy :

    데이터 사이언스등 대규모의 배열데이터를 처리하기 위해서 다차원 배열 처리에 최적화되어있는 라이브러리 파이썬 배열에 비해 더 빠른 처리를 수행가능

     

    Numpy 배열 생성

    기초

    import numpy as np
    
    narr = np.array([1,2,3,4])
    print(narr)

     

    [1 2 3 4]

     

    파이썬 리스트를 넘피 배열로 변환하기

    arr = [1,2,3]
    
    narr = np.array(arr)
    print(narr)

     

    [1 3 5]

     

    실수 배열 만들기

    narr = np.array([3,4,5], dtype = float)
    print(narr)

    [3. 4. 5.]

     

     

    배열의 값을 억세스 하는 방법은 기본적으로 LiST와 유사하다.

    narr = np.array([1,2,3])
    print(narr[0], narr[1])
    
    narr = np.array([[1,2,3], [4,5,6]])
    print(narr[0][0], narr[1][1])

    1 2

    1 5

     

    단 Numpy 는 다차원 배열의 값을 억세스 할때 다음의 구문도 가능하다.

    narr = np.array([[1,2,3], [4,5,6]])
    print(narr[0,0], narr[0,1], narr[1,0])

    1 2 4

     

     

     

    NumPy 배열과 파이썬 리스트의 차이

    파이썬의 리스트는 자료의 저장에 촛점을 두고 있다면 Numpy 의 배열은 특히 수학적인 행렬의 표현을 더 중시한다. 이는 두 자료형의 기본연산의 차이에서 잘 드러난다.

     

    # 파이썬 배열
    arr1,arr2 = [1,2,3], [4,5,6]
    print( "파이썬 배열 덧셈 :", arr1 + arr2 )
    
    # numpy 배열
    narr1 = np.array(arr1)
    narr2 = np.array(arr2)
    
    print( "numpy 배열 덧셈 :", narr1 + narr2 )
    print( "numpy 배열 곱셈 :", narr1 * narr2 )

    파이썬 배열 덧셈 : [1, 2, 3, 4, 5, 6]

    numpy 배열 덧셈 : [5 7 9]

    numpy 배열 곱셈 : [ 4 10 18]

     

    위에서 보듯이 리스트는 + 연산자가 두 리스트의 합병을 의미하지만 Numpy 는 두 자료형의 값을 합산한 배열을 의미한다.

    또한 Numpy 는 행렬이므로 각 차원의 크기가 일정해야 한다. 예를 들어서 다음의 2차원 리스트는 Numpy 로 변환시

     

    arr1 = [[1,2], [3,4,5]]
    arr2 = [[0,1,2], [3,4,5]]
    
    narr1 = np.array(arr1)
    narr2 = np.array(arr2)
    
    print(narr1)
    print(narr2)

    [list([1, 2]) list([3, 4, 5])]

    [[0 1 2] [3 4 5]]

    위에서 arr1 은 두개의 List길이가 다르기 때문에 2차원 행렬로 변환이 불가능하다. 그래서 narr1은 리스트를 값으로 갖는 1차원 행렬로 변황이 되었지만 narr2 는 2x3 으로 변환이 가능하므로 2차원 행렬로 변환되었다.

     

    Shape , Reshape

    NumPy 배열은 다차원 배열을 기본적으로 지원하며 모든 NumPy 배열은 shape 메소드를 통해 그 차원을 알아볼 수 있다.

    narr1 = np.array([1,2,3])
    narr2 = np.array([[1,2,3]])
    narr3 = np.array([[1],[2],[3]])
    narr4 = np.array([[[1,2],[3,4]]])
    
    for narr in [narr1, narr2, narr3, narr4]:
      print(narr)
      print(len(narr.shape), "차원 배열 -> ",narr.shape )
      print()

    [1 2 3]

    1 차원 배열 -> (3,)

    [[1 2 3]] 2 차원 배열 -> (1, 3)

    [[1]

    [2]

    [3]]

    2 차원 배열 -> (3, 1)

    [[[1 2]

    [3 4]]]

    3 차원 배열 -> (1, 2, 2)

     

    Reshape를 이용하면 배열의 차원이나 형태의 변경이 가능하다. 예를 들어 (2,4) 인 형태의 배열을 (1,8) 이나 (2,2,2) 등으로 변경할 수 있다.

    narr = np.array([1,2,3,4,5,6,7,8])
    print(narr.reshape(1,8), "\n")
    print(narr.reshape(2,4), "\n")
    print(narr.reshape(4,2), "\n")
    print(narr.reshape(2,2,2), "\n")

    배열 초기화

    위에서 나온 np.array([1,2,3]) 처럼 배열을 직접 값을 줘서 만들 수 도 있지만 크기가 큰 배열의 경우 주로 초기화 루틴을 통해 만들 수 있다. 이때 배열의 크기와 형태는 shape 값을 인자로 입력한다.

     

    # 3 x 2 를 0으로 초기화 
    narr = np.zeros((3,2))
    print(narr)

    [[0. 0.]

    [0. 0.]

    [0. 0.]]

     

    특정 값으로 초기화

    # 2 x 4 를 7 초 초기화 
    narr = np.full((2,4), 7)
    print(narr)

    [[7 7 7 7]

    [7 7 7 7]]

    배열의 범위지정

    파이썬의 리스트는 ':' 를 이용한 범위지정이 가능하다.

    l = [1,2,3,4,5]
    print(l[1:4]) 
    -> 2,3,4 

    Numpy 도 이러한 범위지정을 사용할 수 있다

    narr = np.array([1,2,3,4])
    
    print(":   ->", narr[:])
    print("0:1 ->", narr[0:1])
    print("1:  ->", narr[1:] )
    print(":3  ->", narr[:3] )
    print("1:-1->", narr[1:-1] )
    
    :   -> [1 2 3 4]
    0:1 -> [1]
    1:  -> [2 3 4]
    :3  -> [1 2 3]
    1:-1-> [2 3]

    이러한 범위지정은 다차원 배열에서 그 활용도가 더욱 커진다.

    narr2 = np.array([[1,2,3], [4,5,6]])
    
    print(narr2[0,0])
    
    print("[:,:] -> \n", narr2[:,:],"\n") 
    print("[0,:] -> ", narr2[0,:]) # 첫째 줄
    print("[:,1] -> ", narr2[:,1]) # 둘째 열
    
    1
    [:,:] -> 
     [[1 2 3]
     [4 5 6]] 
    
    [0,:] ->  [1 2 3]
    [:,1] ->  [2 5]

    이러한 범위지정을 이용해 배열의 일부에 대해 원하는 값을 대입할 수도 있다.

    narr = np.zeros((10,10))
    narr[:,0] = 1
    print(narr)
    
    
    [[1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
     [1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
     [1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
     [1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
     [1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
     [1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
     [1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
     [1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
     [1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
     [1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]]

     

     

     

    연습문제 1-1 : 반복문 없이 다음과 같은 Numpy 배열을 만들기

     

    [[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
     [0. 1. 1. 1. 1. 1. 1. 1. 1. 0.]
     [0. 1. 2. 2. 2. 2. 2. 2. 1. 0.]
     [0. 1. 2. 2. 2. 2. 2. 2. 1. 0.]
     [0. 1. 2. 2. 2. 2. 2. 2. 1. 0.]
     [0. 1. 2. 2. 2. 2. 2. 2. 1. 0.]
     [0. 1. 2. 2. 2. 2. 2. 2. 1. 0.]
     [0. 1. 2. 2. 2. 2. 2. 2. 1. 0.]
     [0. 1. 1. 1. 1. 1. 1. 1. 1. 0.]
     [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]]
     
     
     narr = np.zeros((10,10))
    #연습문제 1-1 을 여기에 작성해보세요
    
    narr[1:9,1:9]=1
    narr[2:8,2:8]=2
    print(narr)
    
    [[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
     [0. 1. 1. 1. 1. 1. 1. 1. 1. 0.]
     [0. 1. 2. 2. 2. 2. 2. 2. 1. 0.]
     [0. 1. 2. 2. 2. 2. 2. 2. 1. 0.]
     [0. 1. 2. 2. 2. 2. 2. 2. 1. 0.]
     [0. 1. 2. 2. 2. 2. 2. 2. 1. 0.]
     [0. 1. 2. 2. 2. 2. 2. 2. 1. 0.]
     [0. 1. 2. 2. 2. 2. 2. 2. 1. 0.]
     [0. 1. 1. 1. 1. 1. 1. 1. 1. 0.]
     [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]]

    연습문제 1-2 : 반복문 없이 임의의 짝수크기 배열의 홀수 위치만 0으로 변환

    예: [1,2,3,4,5,6] -> [1,0,3,0,5,0]

    참고 : 배열 길이의 반 = int( len(arr) / 2)

    [40]

     

    narr = np.array([1,2,3,4,5,6,7,8,9,10,11,12])
    
    l = int( len(narr) / 2 ) 
    #연습문제 1-2 풀이를 작성해보세요
    narr[0::2]=0
    print(narr)
    
    
    
    [ 0  2  0  4  0  6  0  8  0 10  0 12]

     

    Matplotlib 를 사용한 배열 시각화

    Matplotlib 는 파이썬에서 표, 이미지, 히스토그램등 다양한 기능을 이용해 데이터를 시각화 할 수 있는 라이브러리이다. 특히 그중에 pyplot 라이브러리를 자주 사용하는데 다음과 같이 불러온다.

     

    배열을 점, 선으로 표현하기

    가장 기초적인 1차원 배열을 시각화하는 방법의 예제가 아래에 나와있다.

    narr = np.array([1,3,2,5,4])
    plt.plot(narr)
    plt.show()
    
    

     

    여러 그래프를 겹쳐서 그릴 수도 있다.

    narr1 = np.array([5,1,3,4,2])
    narr2 = np.array([1,3,2,5,4])
    plt.plot(narr1)
    plt.plot(narr2)
    plt.show()

     

    배열을 연결이 아니라 점으로 표현 할 수도 있다.

    narr = np.array([1,3,2,5,4])
    plt.plot(narr, 'o')
    plt.show()

    다음은 데이터를 히스토그램으로 표현할 수도 있다.

    narr = np.array([1,1,2,2,3,4,4,4,5,5,4])
    plt.hist(narr, 3) # 3은 데이터 영역을 3개의 영역으로 나눈다는 뜻
    plt.show()

    1차원 데이터를 plot 을 사용하여 도식화 할 경우 x 축은 자동적으로 채워진다. 하지만 두개의 배열을 넣으면 각각을 x와 y값으로 간주한다.

    y = np.array([1,3,2,5,4])
    x = np.array([1,1,2,3,3])
    plt.plot(x, y, 'o') 
    plt.show()

     

    연습문제 1-3 : x,y가 인접해 배치된 배열의 점 그리기

    [x1,y1, x2,y2, x3,y3 .. ] 으로 구성된 짝수 크기의 배열의 각점 (x1,y1), (x2,y2), .. 를 화면에 그려보자.

     

    narr = np.array([1,1,1,2,1,3,1,4,1,5,2,2,3,3,4,4,5,1,5,2,5,3,5,4,5,5]) # 예제용 배열
    #연습문제의 풀이를 작성해보세요
    l = int( len(narr) / 2 ) 
    narr=narr.reshape(l,2)
    print(narr)
    print(narr[:,0],narr[:,1])
    plt.plot(narr[:,0],narr[:,1],'.')
    plt.show()

    배열을 이미지로 표현하기

    plt.imshow 는 2차원 배열을 이미지로 화면에 표현한다. 아래에는 100x100 의 값을 이미지로 화면에 표시하는 예제가 나와있다. cmap = 'gray' 는 각 수치를 흑백명도로 표현하라는 뜻이며 이 옵션이 없으면 세번째 그림처럼 수치마다 랜덤 색상을 배정한다.

     

    narr = np.zeros((100,100))
    plt.imshow(narr, cmap = 'gray')
    plt.show()
    
    narr[10:-10, 10:-10] = 255
    plt.imshow(narr, cmap = 'gray')
    plt.show()
    
    
    narr[30:-30, 30:-30] = 100
    plt.imshow(narr)
    plt.show()

    연습문제 1-4 : 반복없이 세로줄 만들기

    100x100 의 배열이 있을때 반복문 없이 배열의 reshape를 이용하여 다음과 같은 이미지를 만들어보자

     

    narr = np.zeros((100,100))
    # 연습문제의 코드를 작성하세요 
    
    narr.reshape(10,1000)
    narr[:,5]=255
    narr= narr.reshape(10,100,10)
    narr[:,:,4] = 255
    narr= narr.reshape(10,10,100)
    narr[:,2,:] = 255
    narr=narr.reshape(100,100)
    plt.imshow(narr, cmap = 'gray')
    plt.show()
    

    하지만 width x height x 3 으로 각 칫수마다 3개의 숫자로 이뤄진 경우 컬러 이미지로 간주하고 컬러로 표시된다.

     

     

     

    narr = np.full((100,100,3), [255,0,0])  # 100x100x3 의 배열을 [255,0, 0] 으로 체우고
    narr[20:-20, 20:-20] = [100,0,0] # 가운대 40개의 점을 [100,0,0] 으로 채운다. 
    plt.imshow(narr)



Designed by Tistory.