슬라이싱 (Slicing). Fancy 인덱싱. Boolean 인덱싱.

목록


1. 슬라이싱 (Slicing)

1
import numpy as np

베열의 부분 선택 (과일을 슬라이스해서 부분만 먹듯…)

1
arr = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
1
arr.shape
(10,)

1-1. index 지정하여 색인

1차원 array

1
arr = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
1
arr[0]  # index: 앞에서 부터 0, 1, 2, ...
0
1
arr[5]
5
1
arr[10]  # index가 넘으면 error남
---------------------------------------------------------------------------

IndexError                                Traceback (most recent call last)

<ipython-input-7-ff656e92d79c> in <module>
----> 1 arr[10]


IndexError: index 10 is out of bounds for axis 0 with size 10

1
arr[-1]   # 뒤에서 부터 1번째.  index: 뒤에서 부터 -1, -2, -3,...
9
1
arr[-10]
0
1
arr[-11]
---------------------------------------------------------------------------

IndexError                                Traceback (most recent call last)

<ipython-input-10-91f133f07612> in <module>
----> 1 arr[-11]


IndexError: index -11 is out of bounds for axis 0 with size 10

2차원 array

1
2
3
arr2d = np.array([[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]])
1
arr2d.shape
(3, 4)

arr2d[행, 열]

1
arr2d[0, 2]
3
1
arr2d[2, 1]
10


1-2. 범위 색인

1차원 array

  • arr[a, b] – arr의 “index a” 부터 "index b-1"까지 (a 포함, b 미포함)

index: 1 이상

1
arr
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
1
arr[1:]   # index 1 포함
array([1, 2, 3, 4, 5, 6, 7, 8, 9])

index: 5 미만

1
arr[:5]  # index 5 미포함
array([0, 1, 2, 3, 4])

index: 1이상 5미만

1
arr[1:5]  # index 1 포함 & index 5 미포함
array([1, 2, 3, 4])

index: -1까지

1
arr[:-1]  # index -1 (index 9) 미포함
array([0, 1, 2, 3, 4, 5, 6, 7, 8])


2차원 array

1
2
3
arr2d = np.array([[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]])

row(행)을 모두 가져오려는 경우

1
arr2d[0,:]  # 0번 행의 모든 열 가져오기
array([1, 2, 3, 4])

colomn(열)을 모두 가져오려는 경우

1
arr2d[:,2]
array([ 3,  7, 11])

부분적으로 가져오려는 경우

1
arr2d[:2, :]  # 0,1번 행의 모든 열 가져오기
array([[1, 2, 3, 4],
       [5, 6, 7, 8]])

1
arr2d[:2, 2:]  # 0,1번 행의 2,3번 열 가져오기
array([[3, 4],
       [7, 8]])


2. Fancy 인덱싱

fancy인덱싱은 범위가 아닌 특정 index의 집합의 값을 선택하여 추출하고 싶을 때 활용한다

1
arr = np.array([10, 23, 2, 7, 90, 65, 32, 66, 70])

2-1. 1차원 array

방법 1: 추출하고 싶은 index의 집합을 **[꺾쇠 괄호로]**묶어서 추출

1
arr[[1, 3, 5]]
array([23,  7, 65])

방법 2: 추출하고 싶은 index의 집합을 변수에 지정한 후 추출

1
idx = [1, 3, 5]
1
arr[index]
array([23,  7, 65])


2-2. 2차원 array

1
2
3
arr2d = np.array([[1, 2, 3, 4], 
[5, 6, 7, 8],
[9, 10, 11, 12]])
1
arr2d[[0,1], :]
array([[1, 2, 3, 4],
       [5, 6, 7, 8]])

1
arr2d[:, [1,3]]
array([[ 2,  4],
       [ 6,  8],
       [10, 12]])


3. Boolean 인덱싱

조건 필터링을 통하여 Boolean값을 이용한 색인

1
arr = np.array([1, 2, 3, 4, 5, 6, 7])
1
2
3
arr2d = np.array([[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]])

3-1. True와 False값으로 색인하기

boolean index의 수가 꼭 array의 index와 같아야 됨!

1
myTrueFalse = [True, False, True]
1
arr[myTrueFalse]
---------------------------------------------------------------------------

IndexError                                Traceback (most recent call last)

<ipython-input-43-9c52b39d81ae> in <module>
----> 1 arr[myTrueFalse]


IndexError: boolean index did not match indexed array along dimension 0; dimension is 7 but corresponding boolean dimension is 3

1
myTrueFalse = [True, False, True, False, True, False, True]
1
arr[myTrueFalse]
array([1, 3, 5, 7])


3-2. 조건필터

조건 연산자를 활용하여 필터를 생성할 수 있다

1
arr2d
array([[ 1,  2,  3,  4],
       [ 5,  6,  7,  8],
       [ 9, 10, 11, 12]])

1
arr2d > 2  # "2보다 크다"라는 조건의 만족여부에 따라 Boolean index 생성
array([[False, False,  True,  True],
       [ True,  True,  True,  True],
       [ True,  True,  True,  True]])

위 Boolean index를 다시 array에 적용하여 해당 부분을 추출: arr2d[조건필터]

1
arr2d[arr2d > 2]  # 1차원 array로 반환
array([ 3,  4,  5,  6,  7,  8,  9, 10, 11, 12])

1
arr2d[arr2d < 5]
array([1, 2, 3, 4])