반응형

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 1in <module>
    np._version_
  File "C:\Users\web\AppData\Local\Programs\Python\Python38\lib\site-packages\numpy\__init__.py", line 219in __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( [ 12345 ] )
>>> ar1
array([12345])
 
# 배열의 모양(형태)을 알 수 있다.
>>> ar1.shape
(5,)
 
cs

 

1
2
3
4
5
6
7
8
9
# 파이선 리스트 변수를 만들어 삽입도 가능
>>> lst = [ 678910 ]
>>> ar2 = np.array(lst)
 
>>> ar2
array([ 6,  7,  8,  910])
 
>>> 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( [123] )
>>> arr1.shape
(3,)
 
>>> arr2 = np.array( ['a''b''c'] )
>>> arr2.shape
(3,)
 
>>> arr3 = np.array( [123'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( [123], [456] )
Traceback (most recent call last):
  File "<pyshell#81>", line 1in <module>
    arr1 = np.array( [123], [456] )
TypeError: data type not understood
 
>>> arr1 = np.array( [[123], [456]] )
>>> arr1.shape
(23)
 
>>> arr2 = np.array( [[1234], [5678], [9101112]] )
>>> arr2.shape
(34)
 
>>> arr3 = np.array( [[123], [567], [101112]] )
>>> arr3.shape
(33)
 
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([[123],
       [456]])
 
>>> arr2
array([[ 1,  2,  3,  4],
       [ 5,  6,  7,  8],
       [ 9101112]])
 
>>> arr3
array([[ 1,  2,  3],
      [ 5,  6,  7],
       [101112]])
 
>>> 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 = [ 1234 ]
>>> arr
[1234]
 
>>> type(arr)
<class 'list'>
 
>>> ndarr = np.array( arr )
>>> ndarr
array([1234])
 
>>> type(ndarr)
<class 'numpy.ndarray'>
 
>>> ndarr.shape
(4,)
 
>>> arr.shape
Traceback (most recent call last):
  File "<pyshell#147>", line 1in <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([[123],
       [456]])
 
>>> arr1.size
6
 
>>> arr2
array([[ 1,  2,  3,  4],
       [ 5,  6,  7,  8],
       [ 9101112]])
 
>>> arr2.size
12
 
>>> arr3
array([[ 1,  2,  3],
       [ 5,  6,  7],
       [101112]])
 
>>> arr3.size
9
 
>>> arr3.shape
(33)
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( [[ 123 ], [ 456 ]] )
>>> a
array([[123],
       [456]])
 
# size는 차원에 대한 정보를 전혀 알 수 없음.
>>> a.size
6 
 
# shape으로도 알 수 있음.
>>> a.shape 
(23)
 
# 차원만 출력.
>>> a.ndim 
2
cs

 

    ④ sizelen의 차이점

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 = [[123], [456], [789]]
>>> ndarr = np.array( lst )
 
>>> ndarr
array([[123],
       [456],
       [789]])
 
>>> 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( [123'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( [[ 123 ], [ 456 ]] )
>>> 
>>> a.shape
(23)
 
>>> a.ndim
2
 
>>> a.size
6
 
>>> len(a)
2
 
>>> a[ 10 ]
4
 
>>> a[ 12 ]
6
 
>>> a[ 02 ]
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( [[ 123 ], [ 456 ]] )
>>> 
>>> arr
array([[123],
       [456]])
>>> 
>>> arr.shape
(23)
>>> 
>>> arr.shape[0]
2
>>> 
>>> arr.shape[1]
3
>>> 
>>> 
>>> np.shape( [[ 123 ], [ 456]] )
(23)
>>> arr.shape[2]
Traceback (most recent call last):
  File "<pyshell#208>", line 1in <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( [[ 123456 ], [ 123456 ]] )
>>> arr
array([[123456],
       [123456]])
 
>>> print(arr)
[[1 2 3 4 5 6]
 [1 2 3 4 5 6]]
 
>>> # 3 x 4 shape change
>>> arr = np.array( [[ 123456 ], [ 123456 ]] ).reshape( 34 )
 
>>> arr
array([[1234],
       [5612],
       [3456]])
 
>>> arr.shape
(34)
cs

 

5. 행렬의 종류

    ① 영행렬

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# .zeros(행, 열)
# 모든 요소를 0으로 갖는 행렬 생성
>>> arr = np.zeros( (22) )
>>> arr
array([[0.0.],
       [0.0.]])
 
>>> arr = np.zeros( (34) )
>>> 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( (22) )
>>> arr
array([[1.1.],
       [1.1.]])
 
>>> arr = np.ones( (34) )
>>> 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( [[34,], [56]] )
>>> ar1
array([[1.0.],
       [0.1.]])
>>> ar2
array([[34],
       [56]])
 
>>> 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([0123456789])
 
>>> arr = np.arange(20)
>>> arr
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  910111213141516,
       171819])
 
>>> arr = np.arange( 0103 )
>>> arr
array([0369])
 
>>> arr = np.arange( 1202 )
>>> arr
array([ 1,  3,  5,  7,  91113151719])
cs

 

    ② 짝수, 홀수를 요소로 갖는 행렬

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# np.arange(시작, 종료, 간격)
# 짝수 출력, 0.5 간격
>>> arr = np.arange( 0202 )
>>> arr
array([ 0,  2,  4,  6,  81012141618])
 
>>> arr = np.arange( 0212 )
>>> arr
array([ 0,  2,  4,  6,  8101214161820])
 
arr = np.arange( 110, .5 )
>>> arr
array([1. , 1.52. , 2.53. , 3.54. , 4.55. , 5.56. , 6.57. ,
       7.58. , 8.59. , 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( [[123], [456], [789]] )
>>> arr
array([[123],
       [456],
       [789]])
 
>>> arr.shape
(33)
 
>>> arr.arange(9)
Traceback (most recent call last):
  File "<pyshell#491>", line 1in <module>
    arr.arange(9)
AttributeError: 'numpy.ndarray' object has no attribute 'arange'
 
>>> arr_new = np.arange(9)
>>> arr_new
array([012345678])
 
>>> arr_new.reshape( 33 )
array([[012],
       [345],
       [678]])
 
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( 137 )
>>> arr
array([ 1,  2,  3,  4,  5,  6,  7,  8,  91011121314151617,
       1819202122232425262728293031323334,
       3536])
 
>>> arr = arr.reshape(66)
>>> arr
array([[ 1,  2,  3,  4,  5,  6],
       [ 7,  8,  9101112],
       [131415161718],
       [192021222324],
       [252627282930],
       [313233343536]])
 
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(34)
>>> ar
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  91011]])
 
>>> ar1 = ar.reshape(-11)
>>> ar1
array([[ 0],
       [ 1],
       [ 2],
       [ 3],
       [ 4],
       [ 5],
       [ 6],
       [ 7],
       [ 8],
       [ 9],
       [10],
       [11]])
# (-1, 1) == (12, 1)
>>> ar2 = ar.reshape( -12 )
>>> ar2
array([[ 0,  1],
       [ 2,  3],
       [ 4,  5],
       [ 6,  7],
       [ 8,  9],
       [1011]])
 
>>> ar3 = ar.reshape( -13 )
>>> ar3
array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 91011]])
 
>>> ar4 = ar.reshape( -15 )
Traceback (most recent call last):
  File "<pyshell#855>", line 1in <module>
    ar4 = ar.reshape( -15 )
ValueError: cannot reshape array of size 12 into shape (5)
 
>>> ar3 = ar.reshape( -16 ) # == (2, 6)
>>> ar3
array([[ 0,  1,  2,  3,  4,  5],
       [ 6,  7,  8,  91011]])
 
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,  91011]])
 
>>> ar2 = ar.reshape(2-1)
>>> ar2
array([[ 0,  1,  2,  3,  4,  5],
       [ 6,  7,  8,  91011]])
 
>>> ar3 = ar.reshape(3-1)
>>> ar3
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  91011]])
 
>>> 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(34)
>>> ar
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  91011]])
 
>>> ar1 = ar.reshape(-1)
>>> ar1
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  91011])
 
>>> ar2 = ar.reshape(1-1)
>>> ar2
array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  91011]])
 
>>> ar3 = ar.reshape(-11)
>>> ar3
array([[ 0],
       [ 1],
       [ 2],
       [ 3],
       [ 4],
       [ 5],
       [ 6],
       [ 7],
       [ 8],
       [ 9],
       [10],
       [11]])
 
cs

 

    ⑧ reshape() 기타

        - .reshape(-1, -1) : 행과 열에 명확한 기준값이 없으므로 에러가 발생한다.

        - .reshape(6, -2) : -1 보다 작은 값을 입력해도 동일한 의미를 갖는다.

 

반응형

+ Recent posts