본 포스팅은 2021 NIPA AI 온라인 무료 교육의 AI 실무 기본 과정을 기반으로 작성하였습니다.
1. Numpy
numpy는 numerical python의 약어로, 파이썬에서 다차원 배열을 다룰 수 있게 도와 주는 라이브러리입니다. 파이썬 사용자라면 기본적으로 알고 있어야 하는 라이브러리입니다. numpy는 반복문 없이 배열처리가 가능하도록 도와줍니다. 또, 리스트(list)에 비해, 빠른 연산이 가능하도록 지원하고, 메모리를 효율적으로 사용합니다.
2. Numpy 사용하기
우선, 비교를 위해 list를 활용한 배열 생성 및 출력 형태를 확인해 보도록 하겠습니다.
list_arr = list(range(0,5))
print(list_arr)
print(type(list_arr)
파이썬 내에 기본적으로 제공하는 list 함수를 사용해서 0,1,2,3,4의 원소를 가지는 1차원 배열을 생성하여 list_arr에 저장하였습니다. 저장 결과 및 형태를 출력해 보면, 결과는 아래와 같습니다.
[0, 1, 2, 3, 4]
<class 'list'>
2.1. Numpy 활용 배열 생성하기
이제 동일한 배열을 생성하는데, Numpy를 사용해 보겠습니다.
import numpy as np
위의 명령문은 numpy를 불러오고, 약어 np를 사용하겠다는 명령문입니다. 파이썬에서 Numpy 사용 시 관례적으로 많이 사용하는 약어 표현입니다.
import numpy as np
np_arr = np.array(range(0,5))
print(np_arr)
print(type(np_arr)
위의 명령문의 출력 결과는 아래와 같습니다.
[0 1 2 3 4]
<class 'numpy.ndarray'>
list 함수 사용과 다르게 생성된 데이터에 쉼표가 제외되어 있습니다. 참고로 ndarray는 n차원의 배열 (n-dimensional array)를 의미합니다.
3. 배열의 기초
배열은 파이썬의 리스트와는 다르게 동일한 형태의 데이터만을 저장할 수 있습니다. 배열의 데이터 형태는 dtype으로 명시됩니다. 아래 예를 한번 살펴 보겠습니다.
import numpy as np
np_arr = np.array([0, 1, 2, 3, 4], dtype = float)
print(np_arr)
print(np_arr.dtype)
print(np_arr.astype(int))
출력 결과는 아래와 같습니다.
[0. 1. 2. 3. 4.] # 숫자 뒤에 .이 있음
float64
[0 1 2 3 4] # 숫자 뒤에 .이 없음
3.1. 데이터 형태
배열에서의 데이터 형태는 크게 4가지 입니다.
dtype | 설명 | 표현 |
int | 정수형 타입 | i, int_, int32, int64, i8 |
float | 실수형 타입 | f, float_, float32, float64, f8 |
str | 문자열 타입 | str, U, U32 |
bool | 부울 타입 | ?, bool_ |
3.2. 속성
속성을 나타내는 대표적인 함수는 ndim 과 shape이 있습니다. 아래 예시를 통해 알아 보겠습니다.
import numpy as np
list = [0, 1, 2, 3] # 원소 0, 1, 2, 3을 가지는 리스트 list 생성
arr = np.array(list) # numpy의 array 함수를 이용하여 배열 생성
print(arr) # arr 배열 출력
print(arr.ndim) # arr 배열의 차원 출력
print(arr.shape) # arr 배열 모양 출력
출력 결과는 아래와 같습니다.
[ 0 1 2 3 ]
1 # 1차원 배열
(4,) # 4개의 행을 가지는 배열
2차원 배열을 만들어 보겠습니다.
import numpy as np
list = [ [0, 1, 2], [3, 4, 5] ]
arr2 = np.array(list)
print(arr2)
print(arr2.ndim)
print(arr2.shape)
결과는 아래와 같습니다.
[ [0 1 2]
[3 4 5] ] # 2차원 배열
2 # 2차원
(2,3) # 2행 3열의 배열 형태
배열의 크기 속성을 출력해 보겠습니다.
import numpy as np
arr = np.array([0, 1, 2, 3, 4, 5])
print("arr.shape: {}" .format(arr.shape))
print("배열 요소의 수: {}" .format(arr.size))
print("배열의 길이: {}" .format(len(arr)))
출력 결과는 아래와 같습니다.
arr.shape: (6,)
배열 요소의 수: 6
배열의 길이: 6
위의 예제을 그대로 사용하고, shape 함수를 이용해서 배열의 모양을 변형시켜 보겠습니다.
import numpy as np
arr = np.array([0, 1, 2, 3, 4, 5]) # 5행 1열의 배열
arr.shape = 3, 2 # 3행 2열의 배열로 shape 변경
print("arr.shape: {}" .format(arr.shape))
print("배열 요소의 수: {}" .format(arr.size))
print("배열의 길이: {}" .format(len(arr)))
arr.shape = 3, 2의 명령문에 의해 출력 결과가 아래와 같이 변환되었습니다.
arr.shape: 3, 2
배열 요소의 수: 6
배열의 길이: 3
4. Indexing과 Slicing
4.1. Indexing
Indexing의 의미는 인덱스(위치)로 값을 찾아냄을 의미합니다. 예를 들어 설명해 보겠습니다.
x = np.arange(7)
print(x) # 0 1 2 3 4 5 6
print(x[3]) # 3
print(x[7]) # IndexError: index 7 is out of bounds for axis 0 with size 7
x[0] = 10 # 첫번째 자리에 10을 저장
print(x) # 10 1 2 3 4 5 6
파이썬에서 인덱스 시작값은 0부터입니다. 많은 파이썬 초보자들께서 가장 헷갈려 하는 부분입니다. 또 다른 예시를 보도록 하겠습니다.
import numpy as np
x = np.arange(1, 13, 1) # 1부터 12까지 1씩 증가하는 배열 생성
print(x)
x.shape = 3, 4 # x 배열의 shape 변경
print(x)
print(x[2,3])
출력결과는 아래와 같습니다.
[1 2 3 4 5 6 7 8 9 10 11 12]
[ [1 2 3 4]
[5 6 7 8]
[9 10 11 12] ]
12
4.2. Slicing
인덱스를 이용해서 배열의 일부분을 가져올 수 있습니다. 이를 slicing이라고 표현합니다. 아래 예시를 보겠습니다.
x = np.arange(7)
print(x) # x 배열 출력
print(x[1:4]) # 인덱스 위치 1의 값부터 4 - 1번째 인덱스 위치 값까지 출력
print(x[1:]) # 인덱스 위치 1의 값부터 맨 끝의 인덱스 위치 값까지 출력
print(x[:4]) # 첫 시작 인덱스 위치 값부터 4 - 1번재 인덱스 위치 값까지 출력
print(x[: :2]) # 첫 인덱스 위치 값부터 2씩 증가된 인덱스 위치 값까지 출력
결과는 아래와 같습니다.
0 1 2 3 4 5 6
1 2 3
1 2 3 4 5 6
0 1 2 3
0 2 4 6
또 하나의 예시를 보도록 하겠습니다.
import numpy as np
x = np.arange(1, 13, 1) # 1부터 13-1까지 1씩 증가하는 배열 생성
print(x) # 배열 x 출력
x.shape = 3, 4 # x 배열 shape 변경 (3행 4열 배열)
print(x) # shape 변경된 x 배열 출력
print(x[1:2, :2:3]) # x 배열의 2행 1열 인덱스 위치 값 출력
print(x[1: , :2]) # x 배열의 2행 1열 부터 3행 2열 까지의 인덱스 위치 값 출력
출력 결과는 아래와 같습니다.
[ 1 2 3 4 5 6 7 8 9 10 11 12]
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
[[5]]
[[ 5 6]
[ 9 10]]
4.3. Boolean Indexing
Boolean Indexing은 배열의 각 요소의 선택 여부(True or False)를 Boolean mask를 이용하여 지정하는 방식입니다. Boolean mask 방식이 어떤 것인지 간단한 예를 들어 설명하겠습니다.
import numpy as np
x = np.arange(7)
print(x) # x 배열 출력
print(x < 3) # x 배열의 각 원소가 3보다 작은 지를 비교한 결과 반환
print(x > 7) # x 배열의 각 원소가 7보다 큰 지를 비교한 결과 반환
print(x < 3)은 x 배열의 각 원소를 3과 비교하여 3보다 작은 값을 가지는 지를 비교한 결과를 반환하여 출력하라는 명령문입니다. print(x > 7)은 x 배열의 각 원소를 7과 비교하여 7보다 큰 값을 가지는 지를 비교한 결과를 반환하여 출력하라는 명령문입니다.
출력 결과는 아래와 같습니다.
[0 1 2 3 4 5 6]
[ True True True False False False False]
[False False False False False False False]
아래는 Boolean mask를 이용한 Boolean Indexing 예시입니다.
import numpy as np
x = np.arange(7)
print(x[x < 3])
print(x[x % 2 == 0])
print(x[x < 3])은 배열 x의 각 원소를 3과 비교하여 작은 값을 가지는 원소가 있는 지 확인하고, 작은 값에 해당하는 원소만 반환하여 출력하라는 명령문입니다. print(x[x % 2 == 0])는 배열 x의 각 원소에 대해 2로 나누어 나머지가 0을 만족하는 원소가 있는 지 확인하고, 만족하는 원소만 반환하여 출력하라는 명령문입니다. 출력 결과는 아래와 같습니다.
[0 1 2]
[0 2 4 6]
4.4. Fancy Indexing
Fancy Indexing은 배열의 각 원소 선택을 Index 배열을 전달하여 지정하는 방식입니다. Index 배열 전달 방식에 대해서 예를 들어 보겠습니다.
import numpy as np
x = np.arange(7)
print(x[[1, 3, 5]])
print(x[[1, 3, 5]])은 x 배열의 1, 3, 5 인덱스 위치에 있는 x 값을 반환하여 출력하라는 명령문입니다. 결과는 아래와 같습니다.
[ 1 3 5 ]
2차원 배열에 대한 예시를 하나 들어보겠습니다.
import numpy as np
x = np.arange(1, 13, 1).reshape(3,4)
print(x)
print(x[[0,2]])
x = np.arange(1, 13, 1).reshape(3,4) 명령문은 1부터 13 -1 까지 1씩 증가하는 배열을 생성한 후, 3행 4열의 2차원 배열로 변경하여 x에 저장하라는 명령문입니다. print(x[[0,2]]) 는 첫행과 2번째 행에 해당하는 원소를 모두 반환하여 출력하라는 명령문입니다. 출력 결과는 아래와 같습니다.
[ [ 1 2 3 4 ]
[ 5 6 7 8 ]
[ 9 10 11 12 ] ]
[ [ 1 2 3 4 ]
[ 9 10 11 12 ] ]
4.5 Indexing과 Slicing의 혼합
원하는 요소의 원소를 얻기 위해서 Indexing과 Slicing을 적절히 혼합하여 사용할 수도 있습니다.
import numpy as np
x = np.arange(1, 13, 1).reshape(3, 4)
print(x)
print(x[1:2, 2])
print(x[[0,2], 2])
print(x[[0,2], :2])
어떤 원소를 반환하여 출력해 줄까요? 한 번 예상해 보시고, 결과가 동일한 지 아래 출력 결과와 비교해 보세요. 결과는 아래와 같습니다.
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
[7]
[ 3 11]
[[ 1 2]
[ 9 10]]
오늘은 기본 중에서 가장 중요한 개념 중 하나인 Indexing과 Slicing에 대해서 살펴 보았습니다. 기본 중에서 가장 중요한 개념 중 하나인 만큼 잘 이해하시고, 다음 포스팅을 확인해 보시길 바랍니다!
다음은 데이터 조작 및 분석을 위한 Pandas 모듈의 기본에 대해서 살펴 보겠습니다.
'Python > Python 기초' 카테고리의 다른 글
[파이썬완전기초]데이터다루기 Pandas심화 (0) | 2021.07.30 |
---|---|
[파이썬완전기초]데이터다루기Pandas기본 (0) | 2021.07.29 |
[파이썬완전기초]모듈과 패키지 (0) | 2021.07.27 |
[파이썬완전기초]함수와 매서드 (0) | 2021.07.26 |
[파이썬완전기초]자료저장하기 (0) | 2021.07.25 |
댓글