티스토리 뷰

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])])
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/09   »
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
글 보관함