세상을 바꾸는 데이터

[Numpy] 넘파이 - 인덱싱(Indexing) 본문

ML/Numpy

[Numpy] 넘파이 - 인덱싱(Indexing)

Industriousness 2022. 1. 19. 14:24

 

넘파이에서 ndarray내의 일부 데이터 세트나 특정 데이터만을 선택할 수 있도록 하는 인덱싱에 대해 알아보자.

 

Numpy 모듈 import

import numpy as np

 

넘파이 인덱싱하는법

 


1차원 ndarray에서 단일 값 추출

1개의 데이터값을 선택하려면 ndarray 객체에 해당하는 위치의 인덱스 값을 [ ] 안에 입력하면 된다.

# 1에서 부터 9까지의 1차원 ndarray 생성 
array1 = np.arange(start=1, stop=10)
print("array1의 데이터:", array1) # array1의 데이터: [1 2 3 4 5 6 7 8 9]


# index(인덱스)는 0부터 시작하므로 array1[4]는 5번째 위치의 데이터값을 의미
value = array1[4]
print('array1[4]의 값:', value) # array1[4]의 값: 5

 

 

인덱스에 마이너스 기호를 이용하면 맨 뒤에서부터 데이터를 추출할 수 있다. 

 

ex) array[-1] = 40, array[-2] = 30

print('맨 뒤의 값:', array1[-1], ', 맨 뒤에서 두번째 값:', array1[-2])
# 맨 뒤의 값: 9 , 맨 뒤에서 두번째 값: 8

 

단일 인덱스를 이용해 ndarray 내의 데이터 값을 간단히 수정할 수 있다.

array1[0] = 9 # 0번째 인덱스 값을 9로 수정
array1[8] = 0 # 8번째 인덱스 값을 0으로 수정
print('array1:',array1) # array1: [9 1 2 3 4 5 6 7 0 9]

 


2차원 ndarray에서 단일 값 추출

1차원과 2차원 ndarray내에서의 데이터 접근의 차이는 2차원의 경우 콤마( , )로 분리된 로우와 칼럼 위치의 인덱스를 통해 접근하는 것이다.

axis = 0은 로우 방향의 축, axis = 1은 컬럼 방향의 축을 의미

 

array1d = np.arange(start=1, stop=10) # 1부터 9까지의 데이터 순차적으로 생성
array2d = array1d.reshape(3,3) # 1차원 배열을 2차원 3x3 배열로 변경
print(array2d) 
# [[1 2 3]
# [4 5 6]
# [7 8 9]]

print('(row=0,col=0) index 가리키는 값:', array2d[0,0] ) # 1
print('(row=0,col=1) index 가리키는 값:', array2d[0,1] ) # 2
print('(row=1,col=0) index 가리키는 값:', array2d[1,0] ) # 4 
print('(row=2,col=2) index 가리키는 값:', array2d[2,2] ) # 9

 


슬라이싱(Slicing)

' : ' 기호를 이용해 연속한 데이터를 슬라이싱해서 추출할 수 있다. ' : ' 사이에 시작 인덱스와 종료 인덱스를 표시하면 시작 인덱스에서 종료 인덱스 -1의 위치에 있는 데이터의 ndarray를 반환한다.

 

1부터 3번째까지 인덱스 값을 슬라이싱

 

array1 = np.arange(start=1, stop=10)
print(array1) # [1 2 3 4 5 6 7 8 9]

array3 = array1[0:3]
print(array3) # [1 2,3]

array4 = array1[:3]
print(array4) # [1 2 3]

array5 = array1[3:]
print(array5) # [4 5 6 7 8 9]

array6 = array1[:]
print(array6) # [1 2 3 4 5 6 7 8 9]

 

2차원 ndarray에서 슬라이싱은 1차원 ndarray에서의 슬라이싱과 유사하며 콤마( , )로 구분하는 부분만 다르다.

2차원 배열에서의 슬라이싱

 

array1d = np.arange(start=1, stop=10)
array2d = array1d.reshape(3,3) # 3x3 2차원 배열로 변환
print('array2d:\n',array2d) 
# [[1 2 3]
# [4 5 6]
# [7 8 9]]

print('array2d[0:2, 0:2] \n', array2d[0:2, 0:2]) 
# [[1 2]
# [4 5]]

print('array2d[1:3, :] \n', array2d[1:3, :])
# [[4 5 6]
# [7 8 9]]
print('array2d[:2, 1:] \n', array2d[:2, 1:])
# [[2 3]
# [5 6]]

 


펜시 인덱싱(fancy indexing)

펜시 인덱싱(fancy indexing)은 리스트나 ndarray로 인덱스 집합을 지정하면 해당 위치의 인덱스에 해당하는 ndarray를 반환하는 인덱싱 방식이다.

팬시 인덱싱 예제

array1d = np.arange(start=1, stop=10)
array2d = array1d.reshape(3,3) # 3x3 2차원 배열
print(array2d)
# [[1 2 3]
# [4 5 6]
# [7 8 9]]

array3 = array2d[[0,1], 2]
print('array2d[[0,1], 2] => ',array3.tolist())
# [3 6]

array4 = array2d[[0,2], 0:2]
print('array2d[[0,2], 0:2] => ',array4.tolist())
# [[1 2], [4 5]]

array5 = array2d[[0,1]]
print('array2d[[0,1]] => ',array5.tolist())
# [[1 2 3], [4 5 6]]

 


불린 인덱싱(Boolean indexing)

불린 인덱싱(Boolean Indexing)은 조건 필러팅과 검색을 동시에 할 수 있기에 매우 자주 사용되는 인덱싱 방식이다. ndarray의 인덱스를 지정하는 [ ] 내에 조건문을 기재하면 된다.

array1d = np.arange(start=1, stop=10)
print(array1d > 5) # [False False False False False  True  True  True  True]
print(array1d[array1d > 5]) # [6 7 8 9]

 

다음 포스팅에서는 numpy의 행렬에 대해 자세히 알아보고자 한다.

 

Reference


https://github.com/chulminkw/PerfectGuide

https://www.youtube.com/watch?v=_cZ-uLFHP_E 

https://iq.opengenus.org/2d-array-in-numpy/

https://scipy-lectures.org/intro/numpy/array_object.html

https://rfriend.tistory.com/292

 

 

 

 

 

728x90
반응형

'ML > Numpy' 카테고리의 다른 글

[Numpy] 넘파이 - 행렬(Matrix)  (1) 2022.01.19
[Numpy] 넘파이 - ndarray 생성 및 데이터 타입  (2) 2022.01.17
[Numpy] Intro  (2) 2022.01.17
Comments