머신러닝/넘파이

[Numpy] ndarray 인덱싱(Indexing) 종류와 사용방법(1) - 단일 값 추출, 슬라이싱

shoney9254 2021. 8. 22. 23:06
반응형

ndarray의 데이터 인덱싱의 종류를 알아보고 종류별 사용 방법에 대해서 알아보자.

 

1. 특정 위치의 단일값 추출 

2. 슬라이싱 

3. 팬시 인덱싱 - [링크 클릭]

4. Boolean 인덱싱 - [링크 클릭]

 

네가지 인덱싱에 대해서 알아보고 예제를 작성해 보도록 한다. 

팬시 인덱싱과 Boolean 인덱싱을 바로 알아보고 싶은 분은 링크 클릭

 

1. 단일 값 추출

1) 1차원 단일 값 추출

ndarray는 axis를 기준으로 0부터 시작하는 위치 인덱스 값을 가지고 있다.

해당 인덱스 값을 [](대괄호) 안에 명시해서 단일 값을 추출할 수 있다.

파이썬을 사용하면 단일 값 추출 할 경우, -(마이너스)를 입력하게 되면 뒤에서 부터 위치를 지정하게 된다.

(가장 오른쪽이 -1부터 시작합니다.)

소스 코드

# 1) 단일값 추출 : 1차원

array1 = np.arange(start=1, stop=11)  # 1부터 10까지 (11은 미포함)

print('array1:\n', array1)

 

print('array1[0]:', array1[0])

print('array1[9]:', array1[9])

결과

array1:
 [ 1  2  3  4  5  6  7  8  9 10]
array1[0]: 1
array1[9]: 10

파이썬 사용자는 -(마이너스)로 단일 값 추출하는 방법을 알 것이다. 모두가 알겠지만 한번더 확인해보자.

소스 코드

# 마이너스로 사용 가능합니다. (파이썬)

print('array1[-1]:', array1[-1])

print('array1[-10]:', array1[-10])

 

# len() 함수로 길이에서 마이너스 해서 사용하는 것에서 비롯되지 않았나 생각합니다.

print('array1[len(array1)-1]:', array1[len(array1)-1])

print('array1[len(array1)-10]:', array1[len(array1)-10])

 

결과

array1[-1]: 10
array1[-10]: 1
array1[len(array1)-1]: 10
array1[len(array1)-10]: 1

처음에 -1으로 값을 찾아오는게 헷갈려서, 외우는 방법은 len-1하는 방식으로 찾아오는 방법에서, len을 빼면된다.

밑에 2가지 방법이 기존 다른 언어에서 사용하던 방법이라면, 파이썬에서는 위 2가지 방법으로 사용하면 편리하다. 

 

 

2) 2차원 단일 값 추출

2차원 단일 값 추출도 사실 익숙한 방법이다. 우리가 리스트나 배열을 다차원으로 진행하면 값을 불러올때 사용방법을 생각해보면된다. 

조금의 차이가 있다면, 2차원 단일 값 추출에서도 마이너스(-)를 사용해서 값을 불러올 수 있다. 

소스 코드

# 2) 단일값 추출 : 2차원

array1d = np.arange(start=1, stop=10)  # 1부터 9까지 (10 미포함)

array2d = array1d.reshape(3, 3)  # shape 변경

print('array2d:\n', array2d)

 

print('array2d[0, 0]:\n', array2d[0, 0])

print('array2d[0, 1]:\n', array2d[0, 1])

print('array2d[2, 2]:\n', array2d[1, 2])

print('array2d[2, 2]:\n', array2d[2, 2])

print('array2d[-1, -1]:\n', array2d[-1, -1])  # 2차원도 마이너스 단일값 추출 가능

결과

array2d:
 [[1 2 3]
 [4 5 6]
 [7 8 9]]
array2d[0, 0]:
 1
array2d[0, 1]:
 2
array2d[2, 2]:
 6
array2d[2, 2]:
 9
array2d[-1, -1]:
 9

 

2. 슬라이싱

슬라이싱은 : 을 이용해서 연속 숫자를 나타낸다.

파이썬에서 자주 사용했던 방식 중 하나이다. 

 

1) 1차원 슬라이싱

물론, 파이썬의 슬라이싱과 동일하지만 한번 더 살펴보도록 하자.

소스 코드

import numpy as np

 

# 1) 슬라이싱 추출 : 1차원

array1 = np.arange(start=1, stop=11)  # 1부터 10까지 (11은 미포함)

print('array1:\n', array1)

 

print('array1[:]:', array1[:])

print('array1[1:5]:', array1[1:5])

print('array1[4:]:', array1[4:])

print('array1[:6]:', array1[:6])

 

# 마이너스로 사용 가능합니다. (파이썬)

print('array1[:-3]:', array1[:-3])

print('array1[-8:]:', array1[-8:])

 

결과

array1:
 [ 1  2  3  4  5  6  7  8  9 10]
array1[:]: [ 1  2  3  4  5  6  7  8  9 10]
array1[1:5]: [2 3 4 5]
array1[4:]: [ 5  6  7  8  9 10]
array1[:6]: [1 2 3 4 5 6]
array1[:-3]: [1 2 3 4 5 6 7]
array1[-8:]: [ 3  4  5  6  7  8  9 10]

예제를 보면 쉽게 이해할 수 있다. 실수 하기 쉬운 부분은 [ :7] 이라고 하면 7번째 인덱스는 미포함되는 것이다.

[:6]이라고 하면 6번째 인덱스를 미포함하고 1~5의 인덱스 값을 가지고 온다. 

 

2) 2차원 슬라이싱

2차원도 사실 1차원과 다를게 없다. 동일하게 사용하면 된다. 2차원 역시 -(마이너스)값을 사용 가능하다. 

소스 코드

# 2) 슬라이싱 추출 : 2차원

array1d = np.arange(start=1, stop=10)  # 1부터 9까지 (10 미포함)

array2d = array1d.reshape(3, 3)  # shape 변경

print('array2d:\n', array2d)

 

print('array2d[0:, 0:]:\n', array2d[0:, 0:])

print('array2d[0:, :1]:\n', array2d[0:, :1])

print('array2d[0:, 1:]:\n', array2d[0:, 1:])

print('array2d[:-1, :-1]:\n', array2d[:-1, :-1])  # 2차원도 마이너스 단일값 추출 가능

결과

array2d:
 [[1 2 3]
 [4 5 6]
 [7 8 9]]
array2d[0:, 0:]:
 [[1 2 3]
 [4 5 6]
 [7 8 9]]
array2d[0:, :1]:
 [[1]
 [4]
 [7]]
array2d[0:, 1:]:
 [[2 3]
 [5 6]
 [8 9]]
array2d[:-1, :-1]:
 [[1 2]
 [4 5]]

 

 

 

 

반응형