티스토리 뷰
Numpy05 - ndarray의 Indexing & Slicing
1. 1차원 ndarray
import numpy as np
arr = np.arange(10, 20, 1)
print(arr)
# [10 11 12 13 14 15 16 17 18 19]
# enumerate() 함수
for (idx, tmp) in enumerate(arr):
print("idx : {}, data : {}".format(idx, tmp))
# idx : 0, data : 10
# idx : 1, data : 11
# idx : 2, data : 12
# ..
arr = np.arange(10, 20, 1)
print(arr[3]) # 13
print(arr[1:4]) # [11 12 13]
print(arr[:-1]) # [10 11 12 13 14 15 16 17 18]
print(arr[1:-1:2]) # [11 13 15 17] 2씩 증가
2. 2차원 ndarray
import numpy as np
arr = np.arange(1, 17, 1).reshape(4, 4).copy()
print(arr)
# [[ 1 2 3 4]
# [ 5 6 7 8]
# [ 9 10 11 12]
# [13 14 15 16]]
print(arr[1, 2]) # 7
print(arr[1]) # [5 6 7 8] : 1행
print(arr[1][2]) # 7
print(arr[2, :]) # [ 9 10 11 12] -> 2행
print(arr[1:3, :]) # [[ 5 6 7 8] -> 1 <= x < 3 행
# [ 9 10 11 12]]
print(arr[1:3, :2]) # [[ 5 6]
# [ 9 10]]
Boolean indexing과 Facy indexing
1. Boolean Indexing
Boolean Indexing은, ndarray의 각 요소의 선택여부
True, False로 구성된 boolean mask를 이용하여 지정하는 방식
boolean mask의 True에 해당하는 index만 조회하는 방식
import numpy as np
np.random.seed(1)
arr = np.random.randint(0, 10, (5, ))
print(arr) # [5 8 9 5 0]
print(arr % 2) # [1 0 1 1 0] -> 1차원 vecotr를 scalar로 계산
# => 1차원으로 브로드캐스팅
print(arr % 2 == 0) # [False True False False True]
# -> Boolean Mask : 원본과 shape이 똑같은 T/F ndarray
print(arr[arr % 2 == 0]) # [8 0] => Boolean Indexing
2. Fancy Indexing
ndarray에 index 배열을 전달하여 배열 요소를 참조하는 방식
-
슬라이싱 :
arr[0:2]
-
인덱싱 :
arr[1, 2]
-
다중 슬라이싱 :
arr[0:2, 1:2]
arr = np.arange(0, 12, 1).reshape(3, 4).copy()
print(arr)
# 슬라이싱
print(arr[0:2])
# [[0 1 2 3]
# [4 5 6 7]]
# 인덱싱
print(arr[1, 2]) # 6
# 다중 슬라이싱
print(arr[0:2, 1:2])
# [[1]
# [5]]
arr = np.arange(0, 12, 1).reshape(3, 4).copy()
print(arr)
# [[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
print(arr[2, 2]) # indexing : 10 => Scalar
print(arr[1:2, 2]) # slicing 1행, 2열 -> [6] => 1차원
print(arr[1:2, 2:3]) # slicing 1행, 2열 -> [[6]] => 2차원 matrix
print(arr[1:2, 1:3]) # [[5 6]]
Fancy Indexing
: 정수나 Boolean 값을 가지는 다른 Numpy 배열로 배열을 인덱싱
import numpy as np
a = np.array([10, 11, 12, 13, 14, 15, 16])
index = np.array([1, 4, 5])
print(a[index]) # [11 14 15]
b = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]])
index = np.array([0, 2])
index2 = np.array([1, 2])
print(b[index, index2]) # [1 8]
print(b[index])
# [[0 1 2]
# [6 7 8]]
arr = np.arange(0, 12, 1).reshape(3, 4).copy()
print(arr)
# [[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
print(arr[[0,2], 2]) # [ 2 10]
# [0, 2] 0번째행, 2번째 행, 떨어져있는 행 지칭 => 인덱스 배열
# [0, 2] 배열의 2열
# => [ 2 10]
print(arr)
# [[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
print(arr[[0, 2], 2:3]) # Fancy Indexing에 대한 인덱싱 (2:3) => ndarray
# [[ 2]
# [10]]
다음의 ndarray를 추출해 보자 [[1 3]
[9 11]]
print(arr)
# [[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
print(arr[[0, 2], [1, 3]]) # [ 1 11] => 행, 열에 둘 다 Fancy Indexing => 엥?
# 행과 열에 동시에 fancy indexing이 적용되지 않기 때문!
# 해결방법 1
print(arr[[0,2]][:, [1, 3]]) # 행을 들고 오고,
# :은 인덱싱,열에 다시 fancy indexing 적용
# 해결 2 - Numpy가 함수를 제공한다.
print(arr[np.ix_([0,2], [1,3])])
'멀티캠퍼스 AI과정 > 03 Numpy' 카테고리의 다른 글
Numpy 07 - ndarray의 전치행렬과 Iterator (0) | 2020.09.09 |
---|---|
Numpy 06 - ndarray의 사칙연산, 행렬곱, Broadcasting (0) | 2020.09.08 |
Numpy 04 - ndarray의 shape 조절 함수 (0) | 2020.09.08 |
Numpy 03 - 랜덤으로 ndarray 생성 (0) | 2020.09.08 |
Numpy 02 - ndarray 생성과 차원 관련 속성 (0) | 2020.09.08 |
댓글