이수안컴퓨터연구소의 NumPy 한번에 끝내기 영상을 보고 정리한 내용입니다.
✅ Indexing
NumPy의 배열들은 일반 배열들처럼 index로 요소에 접근할 수 있다.
index가 양수이면 배열의 앞에서부터, 음수이면 배열의 뒤에서부터 접근하는 것도 동일하다.
import numpy as np
a1 = np.array([1, 2, 3, 4, 5])
print(a1)
print(a1[0])
print(a1[-1])
# output
# [1 2 3 4 5]
# 1
# 5
a2 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(a2)
print(a2[0,0])
print(a2[1,2])
print(a2[-1,2])
# output
# [[1 2 3]
# [4 5 6]
# [7 8 9]]
# 1
# 6
# 9
a3 = np.array([
[[1, 2, 3], [4, 5, 6], [7, 8, 9]],
[[1, 2, 3], [4, 5, 6], [7, 8, 9]],
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
])
print(a3)
print(a3[0,0,0])
print(a3[1,1,2])
print(a3[-1,-1,2])
# output
# [[[1 2 3]
# [4 5 6]
# [7 8 9]]
#
# [[1 2 3]
# [4 5 6]
# [7 8 9]]
#
# [[1 2 3]
# [4 5 6]
# [7 8 9]]]
# 1
# 6
# 9
✅ Slicing
슬라이싱(Slicing)도 가능한데 indexing과 동일하게 파이썬의 슬라이싱 기본 개념을 N차원으로 확장한 것과 같다.
슬라이싱의 기본 구문은 다음과 같다.
array[start:stop:step]
- start : 슬라이싱을 시작할 index값. 기본값은 0.
- stop : 슬라이싱을 끝낼 index값. 포함되지 않음. 기본값은 ndim.
- step : 슬라이싱할 간격. 기본값은 1.
print(a1)
print(a1[0:2])
print(a1[:1])
print(a1[::-1])
# output
# [1 2 3 4 5]
# [1 2]
# [1]
# [5 4 3 2 1]
print(a2)
print(a2[1,:])
print(a2[:2, :2])
print(a2[1:, ::-1])
print(a2[::-1,::-1])
# output
# [[1 2 3]
# [4 5 6]
# [7 8 9]]
# [4 5 6]
# [[1 2]
# [4 5]]
# [[6 5 4]
# [9 8 7]]
# [[9 8 7]
# [6 5 4]
# [3 2 1]]
✅ Boolean Indexing
배열 각 요소의 선택 여부를 불리언(True or False)로 지정한다.
이때 True 값을 가지고 있는 인덱스의 값만 조회한다.
bi = [False, True, True, False, True]
print(a1)
print(a1[bi])
# output
# [1 2 3 4 5]
# [2 3 5]
bi라는 Boolean 값을 가지고 있는 배열을 만들고 이를 통해 a1에 접근했다.
이때 bi에서 True의 값을 가지고 있는 인덱스는 1, 2, 4이다.
따라서 a1에서도 인덱스 1, 2, 4의 값만 조회하여 [2, 3, 5]라는 배열을 얻을 수 있었다.
bi = np.random.randint(0, 2, (3, 3), dtype=bool)
print(bi)
print(a2)
print(a2[bi])
# output
# [[False False True]
# [False True False]
# [False True True]]
# [[1 2 3]
# [4 5 6]
# [7 8 9]]
# [3 5 8 9]
이번에는 랜덤한 값으로 bi를 만들었다.
0 또는 1의 값으로 이루어진 3x3의 2차원 배열을 만드는데 이때 각 요소들의 자료형을 bool로 지정하였다.
따라서 bi는 True 혹은 False로 이루어진 3x3의 2차원 배열이 되었다.
그리고 이를 통해 a2의 요소에 접근해보면 위와 같은 결과를 얻을 수 있었다.
불리언 인덱싱은 특정 조건의 결과를 불리언 값으로 주고 그 결과에 대해 배열에서 해당하는 값만 얻고자 할 때 자주 사용된다.
✅ Fancy Indexing
Fancy Indexing은 단일 값 대신 인덱스 배열을 통해 접근한다.
따라서 한 번에 여러 배열 요소에 접근할 수 있다.
idx = [0, 2]
print(a1)
print(a1[idx])
# output
# [1 2 3 4 5]
# [1 3]
a1의 0번째 요소와 2번째 요소에 접근하고 싶을 때 일반적인 인덱싱 방법으로는 a1[0], a1[2]로 각각 접근해야 했다.
이때 Fancy Indexing을 사용해 접근할 인덱스를 배열의 값으로 넣어주고 이를 통해 a1에 접근하게 되면 a1의 0번째 요소와 2번째 요소를 한 번에 접근할 수 있다.
Fancy Indexing은 index 배열의 결과에 따라 배열의 shape이 결정된다.
idx = np.array([[0, 1], [2, 0]])
print(a1)
print(a1[idx])
# output
# [1 2 3 4 5]
# [[1 2]
# [3 1]]
인덱스 배열인 idx를 2x2의 2차원 배열로 설정하고 이를 통해 1차원 배열인 a1에 접근했다.
그 결과 2x2의 2차원 배열이 출력된 것을 확인할 수 있다.
Fancy Indexing을 2차원 배열에서 할 경우에는 row와 column을 지정해줄 수 있다.
row = np.array([0, 2])
col = np.array([1, 2])
print(a2)
print(a2[row, col])
# output
# [[1 2 3]
# [4 5 6]
# [7 8 9]]
# [2 9]
row를 [0, 2], col을 [1, 2]로 설정하고 3x3의 2차원 배열인 a2의 인덱스로 row와 col을 주었을 때의 결과는 [2, 9]이다.
이는 각각 a2[0, 1], a2[2, 2]의 값에 접근한 것이다.
'Python > NumPy' 카테고리의 다른 글
[NumPy] 배열 변환 - (1) (0) | 2022.01.24 |
---|---|
[NumPy] 배열 값 삽입/수정/삭제/복사 (0) | 2022.01.24 |
[NumPy] 배열 생성 - (2) (0) | 2022.01.23 |
[NumPy] 배열 생성 - (1) (0) | 2022.01.22 |
[NumPy] NumPy의 정의와 특징 (0) | 2022.01.22 |
댓글