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 |