1. 소개
① 개요
- 넘파이는 Numerical Python의 합성어. (Numerical : 수의, 수와 관련된, 숫자로 나타낸)
- 이름에서 알 수 있듯이 넘파이는 수와 관련된 부분을 지원하는 라이브러리임을 알 수 있다.
- 주로 행렬이나 다차원 배열을 쉽게 처리하고 고속의 연산을 수행할 수 있도록 지원하는 파이썬 라이브러리이다.
- 그러다보니 머신러닝, 딥러닝, 데이터 분석 및 과학 분야에서 많이 사용된다.
2. import, version, array, shape
① numpy import
| 1 2 3 | # python에서 numpy 임포트 하기 >>> # numpy import >>> import numpy as np | cs | 
② numpy version 확인
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | # 2.2.    numpy version 확인 >>> # numpy import >>> import numpy as np >>> >>> np._version_ Traceback (most recent call last):   File "<pyshell#73>", line 1, in <module>     np._version_   File "C:\Users\web\AppData\Local\Programs\Python\Python38\lib\site-packages\numpy\__init__.py", line 219, in __getattr__     raise AttributeError("module {!r} has no attribute " AttributeError: module 'numpy' has no attribute '_version_' >>>  >>> np.__version__ '1.18.5' >>> | cs | 
③ np.array를 이용하여 numpy array 생성
| 1 2 3 4 5 6 7 8 9 | >>> # numpy를 이용하여 1차원 배열 만들기 >>> ar1 = np.array( [ 1, 2, 3, 4, 5 ] ) >>> ar1 array([1, 2, 3, 4, 5]) # 배열의 모양(형태)을 알 수 있다. >>> ar1.shape (5,) | cs | 
| 1 2 3 4 5 6 7 8 9 | # 파이선 리스트 변수를 만들어 삽입도 가능 >>> lst = [ 6, 7, 8, 9, 10 ] >>> ar2 = np.array(lst) >>> ar2 array([ 6,  7,  8,  9, 10]) >>> ar2.shape (5,) | cs | 
④ shape 명령어로 np.array 형태 확인
| 1 2 3 4 5 6 7 8 9 10 11 12 | # 1차원 np.array 형태 >>> arr1 = np.array( [1, 2, 3] ) >>> arr1.shape (3,) >>> arr2 = np.array( ['a', 'b', 'c'] ) >>> arr2.shape (3,) >>> arr3 = np.array( [1, 2, 3, 'a', 'b', 'c'] ) >>> arr3.shape (6,) | cs | 
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | # 다차원 np.array 형태 >>> arr1 = np.array( [1, 2, 3], [4, 5, 6] ) Traceback (most recent call last):   File "<pyshell#81>", line 1, in <module>     arr1 = np.array( [1, 2, 3], [4, 5, 6] ) TypeError: data type not understood >>> arr1 = np.array( [[1, 2, 3], [4, 5, 6]] ) >>> arr1.shape (2, 3) >>> arr2 = np.array( [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]] ) >>> arr2.shape (3, 4) >>> arr3 = np.array( [[1, 2, 3], [5, 6, 7], [10, 11, 12]] ) >>> arr3.shape (3, 3) | cs | 
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | # 넘파이 배열 출력 >>> arr1 array([[1, 2, 3],        [4, 5, 6]]) >>> arr2 array([[ 1,  2,  3,  4],        [ 5,  6,  7,  8],        [ 9, 10, 11, 12]]) >>> arr3 array([[ 1,  2,  3],       [ 5,  6,  7],        [10, 11, 12]]) >>> print(arr1) [[1 2 3]  [4 5 6]] >>> print(arr2) [[ 1  2  3  4]  [ 5  6  7  8]  [ 9 10 11 12]] | cs | 
3. type, size, ndim
① type
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | # list type과 numpy.ndarray type >>> arr = [ 1, 2, 3, 4 ] >>> arr [1, 2, 3, 4] >>> type(arr) <class 'list'> >>> ndarr = np.array( arr ) >>> ndarr array([1, 2, 3, 4]) >>> type(ndarr) <class 'numpy.ndarray'> >>> ndarr.shape (4,) >>> arr.shape Traceback (most recent call last):   File "<pyshell#147>", line 1, in <module>     arr.shape AttributeError: 'list' object has no attribute 'shape' | cs | 
② size
| 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 | # numpy.array의 size >>> arr1 array([[1, 2, 3],        [4, 5, 6]]) >>> arr1.size 6 >>> arr2 array([[ 1,  2,  3,  4],        [ 5,  6,  7,  8],        [ 9, 10, 11, 12]]) >>> arr2.size 12 >>> arr3 array([[ 1,  2,  3],        [ 5,  6,  7],        [10, 11, 12]]) >>> arr3.size 9 >>> arr3.shape (3, 3) | cs | 
③ ndim
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | # numpy.array의 차원 확인 # 배열의 차원만 알고자 할 때 ndim 사용 >>> a = np.array( [[ 1, 2, 3 ], [ 4, 5, 6 ]] ) >>> a array([[1, 2, 3],        [4, 5, 6]]) # size는 차원에 대한 정보를 전혀 알 수 없음. >>> a.size 6  # shape으로도 알 수 있음. >>> a.shape  (2, 3) # 차원만 출력. >>> a.ndim  2 | cs | 
④ size와 len의 차이점
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | # size : numpy array의 원소의 개수를 출력 # len() : numpy array의 행의 개수를 출력. 차원을 의미하는 것이 아님에 주의. >>> import numpy as np >>> lst = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] >>> ndarr = np.array( lst ) >>> ndarr array([[1, 2, 3],        [4, 5, 6],        [7, 8, 9]]) >>> print(ndarr) [[1 2 3]  [4 5 6]  [7 8 9]] >>> ndarr.size 9 >>> len(ndarr) 3 | cs | 
♣ shape의 결과 값이 행과 열의 값으로 출력된다는걸 알았는데요. 예를들어, arr1의 경우 shape의 출력값이 (2, 4)로 나오는데 arr2의 경우 분명히 1행 x 5열로 구성된 것 같은데 shape 메서드로 찍으면 결과가 (5,)로 출력되는 이유는 무엇인가? (1, 5)로 출력되는 것이 맞지 않나?
☞ 1행으로만 구성된 경우, 생략되기 때문이다.
⑤ identical type
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | # numpy 행렬의 모든 요소는 동일한 데이터 타입으로 통일 #     파이썬 list 보다 연산 처리 속도가 빠르다. >>> arr3 = np.array( [1, 2, 3, 'a', 'b', 'c'] ) >>> arr3[0] ______ >>>  >>> type(arr3[0]) <class ‘_________________'> >>>  >>> lst = [ 1, 2, 3, 'a', 'b', 'c' ] >>> lst [1, 2, 3, 'a', 'b', 'c'] >>>  >>> lst[0] 1 >>>  >>> type(lst[0]) <class 'int'> | cs | 
4. 다차원 배열
① 다차원 배열의 크기, 차원, 길이, 요소
| 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 | # 다차원 배열: 배열의 배열 # np.shape(arr) >>> import numpy as np >>> a = np.array( [[ 1, 2, 3 ], [ 4, 5, 6 ]] ) >>>  >>> a.shape (2, 3) >>> a.ndim 2 >>> a.size 6 >>> len(a) 2 >>> a[ 1, 0 ] 4 >>> a[ 1, 2 ] 6 >>> a[ 0, 2 ] 3 | cs | 
② shape으로 행과 열 구하기
| 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 | # shape로 행, 열만 구하기 # arr.shape[0] >>> arr = np.array( [[ 1, 2, 3 ], [ 4, 5, 6 ]] ) >>>  >>> arr array([[1, 2, 3],        [4, 5, 6]]) >>>  >>> arr.shape (2, 3) >>>  >>> arr.shape[0] 2 >>>  >>> arr.shape[1] 3 >>>  >>>  >>> np.shape( [[ 1, 2, 3 ], [ 4, 5, 6]] ) (2, 3) >>> arr.shape[2] Traceback (most recent call last):   File "<pyshell#208>", line 1, in <module>     arr.shape[2] IndexError: tuple index out of range | cs | 
③ 행렬 재배열
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | # 구조 변경 : .reshape(행,열) >>> arr = np.array( [[ 1, 2, 3, 4, 5, 6 ], [ 1, 2, 3, 4, 5, 6 ]] ) >>> arr array([[1, 2, 3, 4, 5, 6],        [1, 2, 3, 4, 5, 6]]) >>> print(arr) [[1 2 3 4 5 6]  [1 2 3 4 5 6]] >>> # 3 x 4 shape change >>> arr = np.array( [[ 1, 2, 3, 4, 5, 6 ], [ 1, 2, 3, 4, 5, 6 ]] ).reshape( 3, 4 ) >>> arr array([[1, 2, 3, 4],        [5, 6, 1, 2],        [3, 4, 5, 6]]) >>> arr.shape (3, 4) | cs | 
5. 행렬의 종류
① 영행렬
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | # .zeros(행, 열) # 모든 요소를 0으로 갖는 행렬 생성 >>> arr = np.zeros( (2, 2) ) >>> arr array([[0., 0.],        [0., 0.]]) >>> arr = np.zeros( (3, 4) ) >>> arr array([[0., 0., 0., 0.],        [0., 0., 0., 0.],        [0., 0., 0., 0.]]) # 행렬간의 연산(+, -, *) 결과 값을 저장할 때 # 처음에 0으로 만들어야 할 때 | cs | 
② 일행렬
| 1 2 3 4 5 6 7 8 9 10 11 12 13 | # .ones(행, 열) # 모든 요소를 1로 갖는 행렬 생성 >>> arr = np.ones( (2, 2) ) >>> arr array([[1., 1.],        [1., 1.]]) >>> arr = np.ones( (3, 4) ) >>> arr array([[1., 1., 1., 1.],        [1., 1., 1., 1.],        [1., 1., 1., 1.]]) | cs | 
③ 단위 행렬
| 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 28 29 30 | # .eye(행) # 단위 행렬(identity matrix) :  주대각선(Main diagonal)의 원소가 모두 1이고, 다른 요소들은 0으로 하는 정사각형 행렬 # 1차 단위행렬 >>> arr = np.eye(1) >>> arr array([[1.]]) # 2차 단위행렬 >>> arr = np.eye(2) >>> arr array([[1., 0.],        [0., 1.]]) # 3차 단위행렬 >>> arr = np.eye(3) >>> arr array([[1., 0., 0.],        [0., 1., 0.],        [0., 0., 1.]]) # 4차 단위행렬 >>> arr = np.eye(4) >>> arr array([[1., 0., 0., 0.],        [0., 1., 0., 0.],        [0., 0., 1., 0.],        [0., 0., 0., 1.]]) | cs | 
6. 행렬의 연산
① 행렬 곱셈
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | # np.dot() # 행렬의 곱셈 >>> ar1 = np.eye(2) >>> ar2 = np.array( [[3, 4,], [5, 6]] ) >>> ar1 array([[1., 0.],        [0., 1.]]) >>> ar2 array([[3, 4],        [5, 6]]) >>> ar1xar2 = np.dot( ar1, ar2 ) >>> ar1xar2 array([[3., 4.],        [5., 6.]]) >>> test = ar1 * ar2 >>> test array([[3., 0.],        [0., 6.]]) | cs | 
7. 행렬 생성
① 범위, 간격 지정
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | # np.arange(시작, 종료, 간격) # arange로 원하는 숫자 범위, 간격을 지정. >>> arr = np.arange(10) #python range >>> arr array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> arr = np.arange(20) >>> arr array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,        17, 18, 19]) >>> arr = np.arange( 0, 10, 3 ) >>> arr array([0, 3, 6, 9]) >>> arr = np.arange( 1, 20, 2 ) >>> arr array([ 1,  3,  5,  7,  9, 11, 13, 15, 17, 19]) | cs | 
② 짝수, 홀수를 요소로 갖는 행렬
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | # np.arange(시작, 종료, 간격) # 짝수 출력, 0.5 간격 >>> arr = np.arange( 0, 20, 2 ) >>> arr array([ 0,  2,  4,  6,  8, 10, 12, 14, 16, 18]) >>> arr = np.arange( 0, 21, 2 ) >>> arr array([ 0,  2,  4,  6,  8, 10, 12, 14, 16, 18, 20]) arr = np.arange( 1, 10, .5 ) >>> arr array([1. , 1.5, 2. , 2.5, 3. , 3.5, 4. , 4.5, 5. , 5.5, 6. , 6.5, 7. ,        7.5, 8. , 8.5, 9. , 9.5]) | cs | 
③ 범위, 간격, shape을 이용한 행렬
| 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 | # .arange()와 .rehape()을 이용하여 3Ⅹ3 행렬 만들기 >>> arr = np.array( [[1, 2, 3], [4, 5, 6], [7, 8, 9]] ) >>> arr array([[1, 2, 3],        [4, 5, 6],        [7, 8, 9]]) >>> arr.shape (3, 3) >>> arr.arange(9) Traceback (most recent call last):   File "<pyshell#491>", line 1, in <module>     arr.arange(9) AttributeError: 'numpy.ndarray' object has no attribute 'arange' >>> arr_new = np.arange(9) >>> arr_new array([0, 1, 2, 3, 4, 5, 6, 7, 8]) >>> arr_new.reshape( 3, 3 ) array([[0, 1, 2],        [3, 4, 5],        [6, 7, 8]]) | cs | 
④ arrange()와 reshape() 조합
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | # arrange() 배열 생성 후 reshape() # 6 x 6 행렬 >>> arr = np.arange( 1, 37 ) >>> arr 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, 28, 29, 30, 31, 32, 33, 34,        35, 36]) >>> arr = arr.reshape(6, 6) >>> arr 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, 28, 29, 30],        [31, 32, 33, 34, 35, 36]]) | cs | 
⑤ reshape(-1, n[열])
        - .reshape(-1, n) 또는 .reshape(n, -1) 메소드는 주어진 배열의 요소 사이즈와 연관성이 높다. 
        -  배열에 있는 요소가 재배열 되려는 배열의 모양구조에 빠짐없이 배분이 되어질 수 있느냐 없느냐가 중요한 핵심이다. 
        -  제대로 분배가 안되어지는 경우의 모양은 에러가 발생한다. 
        -  예를들어, 12개 배열 요소에서 .reshape(-1, 5) 혹은 .reshape(7, -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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | # .reshape(-1, 열) # shape( -1, n[정수] ) >>> ar = np.arange(12).reshape(3, 4) >>> ar array([[ 0,  1,  2,  3],        [ 4,  5,  6,  7],        [ 8,  9, 10, 11]]) >>> ar1 = ar.reshape(-1, 1) >>> ar1 array([[ 0],        [ 1],        [ 2],        [ 3],        [ 4],        [ 5],        [ 6],        [ 7],        [ 8],        [ 9],        [10],        [11]]) # (-1, 1) == (12, 1) >>> ar2 = ar.reshape( -1, 2 ) >>> ar2 array([[ 0,  1],        [ 2,  3],        [ 4,  5],        [ 6,  7],        [ 8,  9],        [10, 11]]) >>> ar3 = ar.reshape( -1, 3 ) >>> ar3 array([[ 0,  1,  2],        [ 3,  4,  5],        [ 6,  7,  8],        [ 9, 10, 11]]) >>> ar4 = ar.reshape( -1, 5 ) Traceback (most recent call last):   File "<pyshell#855>", line 1, in <module>     ar4 = ar.reshape( -1, 5 ) ValueError: cannot reshape array of size 12 into shape (5) >>> ar3 = ar.reshape( -1, 6 ) # == (2, 6) >>> ar3 array([[ 0,  1,  2,  3,  4,  5],        [ 6,  7,  8,  9, 10, 11]]) | cs | 
⑥ reshape(n[행], -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 | # .reshape(행, -1) # shape( n[정수], -1 ) >>> ar = np.arange(12) >>> ar1 = ar.reshape(1, -1) >>> ar1 array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]]) >>> ar2 = ar.reshape(2, -1) >>> ar2 array([[ 0,  1,  2,  3,  4,  5],        [ 6,  7,  8,  9, 10, 11]]) >>> ar3 = ar.reshape(3, -1) >>> ar3 array([[ 0,  1,  2,  3],        [ 4,  5,  6,  7],        [ 8,  9, 10, 11]]) >>> ar5 = ar.reshape(5, -1) Traceback (most recent call last):     ar5 = ar.reshape(5, -1) ValueError: cannot reshape array of size 12 into shape (5,newaxis) | cs | 
⑦ reshape(-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 28 29 30 | # reshape(-1) >>> ar = np.arange(12).reshape(3, 4) >>> ar array([[ 0,  1,  2,  3],        [ 4,  5,  6,  7],        [ 8,  9, 10, 11]]) >>> ar1 = ar.reshape(-1) >>> ar1 array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]) >>> ar2 = ar.reshape(1, -1) >>> ar2 array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11]]) >>> ar3 = ar.reshape(-1, 1) >>> ar3 array([[ 0],        [ 1],        [ 2],        [ 3],        [ 4],        [ 5],        [ 6],        [ 7],        [ 8],        [ 9],        [10],        [11]]) | cs | 
⑧ reshape() 기타
- .reshape(-1, -1) : 행과 열에 명확한 기준값이 없으므로 에러가 발생한다.
- .reshape(6, -2) : -1 보다 작은 값을 입력해도 동일한 의미를 갖는다.
'파이썬' 카테고리의 다른 글
| 텍스트 음성변환(SST; SpeechToText) 파이썬 코드 (1) | 2024.09.07 | 
|---|---|
| numpy 사용법 기초 (2/2) (6) | 2024.09.07 | 
| wxPython 라이브러리 설치 및 기본 사용법 (1) | 2024.09.07 | 
| 우분투(Ubuntu) 환경에서 파이썬 설치 매뉴얼 문서(word) (0) | 2024.06.12 | 
| python 가상환경 다루기 (venv) (0) | 2023.08.15 |