[numpy #2] numpy의 기초에 대해서 알아보자!

2019. 4. 4. 14:35Programming Tutorial/Python

필자는 Tutorial이라는 영어표현을 굉장히 즐겨쓰고 검색엔진에서 활용하는 편이다.

 

(짧은 말끝 포스팅 첫시도..)

 

역시 오늘도 base를 쌓기 위해서 검색엔진을 활용해서 파이썬 사용시 핵심 라이브러리 중 하나인 numpy의 기초를

 

포스팅을 해보고자 한다.

 

 

 

 

 

1. numpy라는게 대체 머길래..

  - 파이썬의 라이브러리 이다.

 

  - 파이썬에 LIST라는 자료형도 있으나 for문을 사용해야하는 등 효율적인 행렬 data 연산이 불가함.

 

  - numpy는 가능하다. Matlab 느낌이라고 보면 되겠다.

 

2. 그 좋다는 numpy 한번 수입?? 해보자 

In [1]: import numpy
In [2]: import numpy as np

첫번째 줄과 같이 직접 call하게 되면 우리는 numpy라는 full name을 사용할때마다 때려 넣어줘야 한다..

numpy.array([1, 2, 3])

하지만 두번째 줄과 같이 "as np" 라는 표현을 추가하게 되면 굳이 numpy라고 5번 타자를 때릴 필요가 없이

 

np라는 글자까지만 때리면 되서 좀 편하다.

np.array([1, 2, 3])

두번째 줄로 해서 타이핑 양을 직접적으로 줄이는 것이 일반적이라고 할수 있다.

 

3. 앞에서 언급한 numpy와 list 비교로 요놈을 왜 쓰는지 봅시다.

 - 사실 data를 저장하고 인덱스하고 반복하는 부분에서 numpy와 list 두녀석은 비슷하다. 

  

 - 그러나 list 보다 numpy가 적은 메모리를 쓰고 빠르고 편하다. (왜냐고?? 뒤에 예시로 보자)

 

 - 그리고 중요한게 list로는 직접 계산을 못한다. (list로 덧셈하면 list가 연장 될 뿐). numpy는 가능.

 

예시를 하나 까봅시다.

 

 1) 첫번째 예시... 곱셈 : list는 에러가 뜬다..

In [3]: python_list = [1, 2, 3, 4, 5, 6, 7, 8, 9]
In [4]: print((python_list) * 2)
Out[4]: TypeError: unsupported operand type for *:'list' and 'int'
In [5]: numpy_array = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
In [6]: print((numpy_array) * 2)
Out[6]: [2 4 6 8 10 12 14 16 18]

2) 두번째 예시.. 덧셈 : list는 반복연장되서 사이즈만 키울뿐 연산되진 않는다..

In [7]: print(python_list + python_list)
Out[7]: [1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9]
In [8]: print(numpy_array + numpy_array)
Out[8]: [2 4 6 8 10 12 14 16 18]

 

결국은 matlab화 시키기 위한 스팀게임 대박 DLC같은 녀석인셈.. 수입안하고는 머 해볼수가 없는 녀석이다.

 

 

4. numpy로 할수 있는 기초적인 것들?

 예시를 포함하면 더 이해하기 쉽고 기억에도 남을 것 같다.

 

 아주 직관적인 표현들이라 글로 서술은 최대한 줄이겠다.


 a) 코딩을 때리다가 아.. 이 변수에 값이 몇개나 들어있지?. 기억이 안날때.

   

   - size

In [9]: numpy_array = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
In [10]: print(numpy_array.size)
Out[10]: 9

 b) 행렬 변수를 처리하는데 요놈이 몇 x 몇 인지 알수가 없을 때.

 

  - shape

In [11]: numpy_matrix = np.array([(1, 2, 3, 4), (5, 6, 7, 8)])
In [12]: print(numpy_matrix.shape)
Out[12]: (2, 4) 

 c) 행렬 모양을 좀 바꿔서 처리하고 싶을때.

 - reshape..

In [13]: numpy_matrix = np.array([(1, 2, 3, 4), (5, 6, 7, 8)])
In [14]: numpy_matrix = numpy_matrix.reshape(4, 2)
In [15]: print(numpy_matrix)
Out[15]: [[1, 2]
          [3, 4]
          [5, 6]
          [7, 8]]

d) numpy array내 지정된 위치의 값을 추출 하고 싶을때? 이런건 전문용어로 index를 이용해야겠다.

 

 -변수명[rows,columns] 로 하면 되고 python은 이런경우 시작이 0부터라는거는 잊지말자.. 

In [16]: numpy_array = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
In [17]: print(numpy_array[0, 2]) 
Out[17]: 3

 - 한개의 값 말고 여러 값을 추출 하고 싶을때는 .. 아래 표현과 같이 하면 된다.

In [18]: numpy_array = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
In [19]: print(numpy_array[0, 0:4])
Out[19]: [1 2 3 4]

기본이다.. MATLAB과도 유사하고..


e) 그 외 통계적인 보조 표현

 

 max, min, mean, median, var, std (최대,최소,평균,미디안, 분산,표준편차)

 

In [22]: numpy_array = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
In [23]: print(numpy_array.max())
Out[23]: 9
In [24]: print(numpy_array.min())
Out[24]: 1
In [25]: print(numpy_array.sum())
Out[25]: 45


In [26]: numpy_array = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
In [27]: print(numpy_array.mean())
Out[27]: 5
In [28]: print(numpy_array.median())
Out[28]: 5
In [29]: print(numpy_array.var())
Out[29]: 6.666666666666667
In [30]: print(numpy_array.std())
Out[30]: 2.581988897471611

f) 이러한 연산들은 axis 에 한정하여 진행할수도 있다.

 - axis =0 : y축으로 연산

 - axis =1 : x축으로 연산

 - axis = None : 모든 값을 다 연산.

In [31]: print(numpy_matrix)
Out[31]: [[1, 2]
          [3, 4]
          [5, 6]
          [7, 8]]
In [32]: print(numpy_matrix.sum(axis = 0))
Out[32]: [16 20]
In [33]: print(numpy_matrix.sum(axis = 1))
Out[33]: [3 7 11 15]
In [34]: print(numpy_matrix.sum(axis = None))
Out[34]: 36

g) 여러 array들을 연결하는 것도 가능하다. 

 

 - concatenate

In [35]: array_1 = np.array([1,2,3])
In [36]: array_2 = np.array([4,5,6])
In [37]: array_3 = np.array([7,8,9])
In [38]: print(np.concatenate((array_1, array_2, array_3)))    
Out[38]: [1 2 3 4 5 6 7 8 9]
In [39]: array_4 = np.array([[1,2,3],[0,0,0]])
In [40]: array_5 = np.array([[0,0,0],[7,8,9]])
In [41]: print(np.concatenate((array_1, array_2), axis = 1))   
Out[41]: [[1 2 3 0 0 0]
        [0 0 0 7 8 9]]

h) 0이나 1로만 되어있는 array를 만드는 표현이다. matlab과 아주 유사한 느낌을 지울수 없다.

 무료니까 착한 matlab이라고 해야하나..

  - zeros , ones

In [42]: print(np.zeros((1,2)))                   
Out[42]: [[ 0.  0.]] 
In [43]: print(np.zeros((1,2), dtype = np.int)) 
Out[43]: [[0 0]]
In [44]: print(np.ones((1,2)))                   
Out[44]: [[ 1.  1.]] 
In [45]: print(np.ones((1,2), dtype = np.int)) 
Out[45]: [[1 1]]

i) 단위행렬을 만들고 싶다면??

  - identity

  - parameter인 k=1로 표현해서 위쪽으로 이동 표현도 가능하다.. 말로 어찌표현해야될지.. 아래 예제를 보자..

 

In [46]: print(np.identity(3))
Out[46]: [[ 1.  0.  0.]
        [ 0.  1.  0.]
        [ 0.  0.  1.]]
In [47]: print(np.eye(8, 7, k = 1))    
Out[47]: [[ 0.  1.  0.  0.  0.  0.  0.]
          [ 0.  0.  1.  0.  0.  0.  0.]
          [ 0.  0.  0.  1.  0.  0.  0.]
          [ 0.  0.  0.  0.  1.  0.  0.]
          [ 0.  0.  0.  0.  0.  1.  0.]
          [ 0.  0.  0.  0.  0.  0.  1.]
          [ 0.  0.  0.  0.  0.  0.  0.]
          [ 0.  0.  0.  0.  0.  0.  0.]]

j) 행렬문제로 좀 더 들어가보면 행렬곱셈 연산이란 부분도 있다..

 - 내적 dot , 외적 cross... vector에 대해서 공부해보셨다고 보고 추가 코멘트는 생략 하겠다.

 

In [48]: array_6 = np.array([ 1, 2 ])
In [49]: array_7 = np.array([ 3, 4 ])
In [50]: print(np.dot(array_6, array_7))      
Out[50]: 11

In [51]: print(np.cross(array_6, array_7))      
Out[51]: -2