본문 바로가기
Python/NumPy

[NumPy] 인덱싱과 슬라이싱

by _sweep 2022. 1. 23.

이수안컴퓨터연구소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

댓글