본문 바로가기
Data Science

[Numpy] 넘파이 인덱싱 슬라이싱 팬시인덱싱 등으로 인덱스 반환하기 +찾기

by Lora Baek 2022. 8. 4.
300x250

넘파이 인덱싱은 ndarray의 특정 데이터를 골라서 반환하도록 만드는 것이다.

만약 한 개의 데이터 값을 선택하려면 ndarray 안에서 찾고자 하는 값의 인덱스를 [] 안에 입력하면 된다.

인덱스는 0부터 시작하므로,

array라는 1차원 배열의 1번째 값을 선택하고자 한다면 array[0]

array라는 1차원 배열의 3번째 값을 선택하고자 한다면 array[2] 와 같이 입력하면 된다.

 

마이너스 기호를 이용해 array[-1]과 같이 맨 뒤의 데이터를 찾을 수 있다.

맨 앞 데이터 인덱스는 0이고, 맨 뒤 데이터 인덱스는 -1이다.

 

이런 방식으로 특정 인덱스 값 변경도 가능하지만, ndarray에서는 원본 값이 바로 수정되어버리기 때문에 리스트로 변환하여 작업하는 경우가 흔하다.(리스트는 값을 바꾸어도 원본이 수정되지는 않기 때문이다)

 

2차원 넘파이 인덱싱

 

1차원에서는 이렇게 간단하게 작업을 할 수 있지만, 2차원에서는 행과 열에 익숙해져야 한다.

행 인덱스 시작도 0부터, 열 인덱스 시작도 0부터임을 잘 기억하자.

 

좀 더 익숙해지기 위해서

1) 9개의 데이터가 있는 리스트 생성

2) 리스트를 배열로 변경

3) 생성된 배열 차원 변경(3x3 2차원으로)

배열이름[행,열] 로 인덱스 반환이 완료되었다.

data_array 를 보면서 각각 어떤 인덱스를 추출한 것인지 파악해보면 공부에 많은 도움이 된다!

 

그런데 배열에 익숙해지려면 행과 열이 아니라 또 다른 이름에 익숙해지는 게 좋다.

행, 즉 ROW 방향의 축은 axis 0

열, COLUMN 방향의 축은 axis 1이라고 부른다.

3차원 배열이라면 axis 0, axis 1, axis 2라는 3개의 축을 가지게 될 것이다.

 

넘파이 슬라이싱 1차원

넘파이 슬라이싱 또한 인덱싱의 한 종류로, 미끄러지듯이 특정 구간의 데이터를 반환할 수 있다.

배열이름[시작인덱스:종료인덱스] 로 입력하면 시작 인덱스에서 종료 인덱스의 직전 값까지 반환한다. 즉, 종료 인덱스는 포함하지 않는다.

 

위에서 사용했던 data_array를 다시 data_array1이라는 1차원 배열로 바꾸어서 슬라이싱 해보자.

data_array1[0:3] 은 인덱스 0부터 3 직전까지 즉 0,1,2라는 인덱스를 뽑아낸다. 다시 말해 첫 번째, 두 번째, 세 번째 값을 반환한다.

data_array1[3:]은 인덱스 3부터 끝까지 반환하라는 뜻이며,

data_array1[:]은 처음부터 끝까지 모든 인덱스를 달라는 뜻이다.

 

넘파이 슬라이싱 2차원

2차원에서는 특정 블록을 선택한다고 생각하면 편할 것 같다. 예시를 통해 확인해보자.

1부터 9까지 9개의 데이터를 가지는 3x3 2차원 배열인 data_array가 있다.

 

여기서 data_array[0:2,0:2]

axis 0 (ROW개념)의 인덱스 [0], [1]

axis 1 (COLUMN 개념)의 인덱스 [0], [1]을 반환할 것이다.

 

그리고 data_array[1:3,:]

axis 0의 인덱스 [1], [2] 그리고 axis 1의 전체 데이터를 반환하게 된다.

 

넘파이 팬시 인덱싱

특정 구간의 범위를 선택하는 게 아니라, axis 0에서 3번째, 1번째만 선택하고 싶을 때 사용하는 게 팬시 인덱싱이다.

콕 집어낼 수 있다는 점에서 fancy라는 단어가 잘 어울리지 않나 싶다.

유의할 점은 슬라이싱과는 다르게 괄호[]가 추가되어야 한다.

동일하게 data_array를 이용해 살펴보자.

data_array[[0,2],0:2] 는 다음을 의미한다.

axis 0의 인덱스 0, 인덱스 2를 선택하고 : (1, 2, 3) 그리고 (7,8,9)

axis 1의 인덱스 0~인덱스 1을 선택해라 : (1,2) 그리고 (7,8)

 

넘파이 불린 인덱싱 (불리언)

 

불리언 인덱싱이라고도 하는 불린 인덱싱은, 조건을 주고 검색을 할 수 있어서 가장 유용하다.

특정 조건을 만족하면 True, 만족하지 않으면 False를 반환하게 되며 이를 이용해서 원하는 데이터만 뽑아낼 수 있다.

 

1. 배열에 조건식을 할당하면 True와 False로 이뤄진 ndarray 객체를 반환한다.
2. 이 ndarray를 인덱싱을 지정하는 [] 안에 넣어주면 True인 인덱스 위치의 데이터만 반환하게 된다.

1부터 9까지의 1차원 배열을 만든 다음 불린 인덱싱을 이용해 원하는 조건(5 이상)에 맞는 데이터만으로 배열을 다시 만들었다.

꼭 기억해야 하는 점은 42번 셀의 결과에 []가 있는 것에서 볼 수 있듯이, True 값 자체인 1을 저장하는 게 아니라 "True값을 가진 인덱스"를 저장한다는 점이다.

 

 

*만약 특정 조건을 만족하는 인덱스를 찾고 싶다면 불린 인덱싱과 같이 배열에 대한 조건을

np.where(조건) 과 같이 입력해서 찾을 수 있다.

 

 

차근차근 넘파이 개념 정리하기

2022.08.02 - [Data Science] - [Numpy] 넘파이 설치+차원 확인+데이터 타입 확인 및 변경

2022.08.02 - [Data Science] - [Numpy] 넘파이 배열 생성 arange range 차이+파이썬 빈 배열 만들기

2022.08.03 - [Data Science] - [Numpy] 넘파이 reshape 차원 추가 축소 변경하기

댓글