준비하는 대학생

[NumPy] 확장 슬라이싱 본문

Programming/Machine learning

[NumPy] 확장 슬라이싱

Bangii 2023. 3. 15. 16:52

1. 슬라이싱 기본 개념

파이썬에서 슬라이싱은 리스트, 튜플, 문자열 등의 시퀀스 자료형에서 연속된 범위의 데이터를 추출하는 기능을 제공합니다. 슬라이싱은 다음과 같은 형식으로 사용합니다.

sequence[start:stop:step]

여기서 start는 시작 인덱스, stop은 종료 인덱스, step은 간격을 나타냅니다. startstop은 생략 가능하며, 생략 시 기본적으로 start는 0, stop은 시퀀스의 길이로 설정됩니다. step은 생략 가능하며, 생략 시 기본적으로 1로 설정됩니다.

2. NumPy 확장 슬라이싱

NumPy에서는 기본 슬라이싱 기능을 확장하여 다차원 배열에서도 적용할 수 있습니다. 각 축(axis)에 대해 슬라이싱을 적용하여 다양한 형태의 데이터를 추출할 수 있습니다.

예시

import numpy as np

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

# 2x2 부분 행렬 추출
sub_arr = arr[1:3, 1:3]
print(sub_arr)

결과

[[ 5,  6],
 [ 9, 10]]

 

3. 음수 인덱스와 슬라이싱

NumPy 확장 슬라이싱에서도 음수 인덱스를 사용할 수 있습니다. 음수 인덱스는 배열의 끝에서부터 역순으로 인덱싱 합니다.

예시

import numpy as np

arr = np.array([[0, 1, 2, 3],
                [4, 5, 6, 7],
                [8, 9, 10, 11],
                [12, 13, 14, 15]])
                
# 마지막 행과 마지막 열을 제외한 부분 행렬 추출
sub_arr = arr[:-1, :-1]
print(sub_arr)

결과

[[ 0, 1, 2],
[ 4, 5, 6],
[ 8, 9, 10]]

4. 홀수 / 짝수 인덱스 추출

NumPy 확장 슬라이싱을 사용하여 홀수 또는 짝수 인덱스의 요소만 추출할 수 있습니다. `step` 인자를 활용하면 간단하게 구현할 수 있습니다.

예시

import numpy as np

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

# 짝수 인덱스 행과 열만 추출
even_arr = arr[::2, ::2]
print(even_arr)

결과

[[ 0,  2],
 [ 8, 10]]

 

5. 브로드캐스팅을 활용한 인덱스 추출

NumPy 확장 슬라이싱을 사용하면 브로드캐스팅을 활용하여 특정 조건을 만족하는 인덱스를 추출할 수 있습니다. 브로드캐스팅은 다차원 배열의 모양이 다른 경우에도 적용할 수 있게 해 줍니다.

예시

import numpy as np

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

# 값이 5보다 큰 요소만 추출
mask = arr > 5
result = arr[mask]
print(result)

 

결과

[ 6,  7,  8,  9, 10, 11, 12, 13, 14, 15]

NumPy 확장 슬라이싱을 이해하고 활용하면 다차원 배열에서 원하는 형태와 조건의 데이터를 쉽게 추출하고 가공할 수 있습니다. 이 기능을 통해 데이터 분석과 처리 과정이 더욱 효율적이고 간편해질 것입니다.

6. 행과 열 전환

NumPy 확장 슬라이싱을 사용하면 배열의 행과 열을 쉽게 전환할 수 있습니다. 이를 통해 배열의 구조를 변경하거나 전치된 배열을 얻을 수 있습니다.

예시

import numpy as np

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

# 전치 행렬(transpose) 구하기
transpose_arr = arr.T
print(transpose_arr)

결과

[[ 0,  4,  8, 12],
 [ 1,  5,  9, 13],
 [ 2,  6, 10, 14],
 [ 3,  7, 11, 15]]

또는 np.newaxis를 사용하여 새로운 축을 추가하고 배열의 모양을 변경할 수 있습니다.

예시

import numpy as np

arr = np.array([0, 1, 2, 3])

# 1D 배열을 2D 행렬로 변환
row_vector = arr[np.newaxis, :]
print(row_vector)

# 1D 배열을 2D 열벡터로 변환
column_vector = arr[:, np.newaxis]
print(column_vector)

결과

[[0, 1, 2, 3]]

[[0],
 [1],
 [2],
 [3]]

7. 다차원 배열 슬라이싱과 인덱싱 결합

NumPy 확장 슬라이싱을 사용하면 다차원 배열에서 슬라이싱과 인덱싱을 동시에 사용할 수 있습니다. 이를 통해 원하는 형태의 부분 배열을 추출할 수 있습니다.

예시

import numpy as np

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

# 첫 번째 열(column) 추출
first_column = arr[:, 0]
print(first_column)

# 두 번째 행(row) 추출
second_row = arr[1, :]
print(second_row)

결과

[ 0,  4,  8, 12]

[4, 5, 6, 7]

8. 슬라이싱을 이용한 배열 수정

NumPy 확장 슬라이싱을 사용하여 배열의 일부분을 수정할 수도 있습니다. 슬라이싱을 통해 추출한 부분 배열에 값을 할당하여 원본 배열을 간편하게 변경할 수 있습니다.

예시

import numpy as np

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

# 첫 번째 열(column)의 모든 값을 99로 변경
arr[:, 0] = 99
print(arr)

결과

[[99,  1,  2,  3],
 [99,  5,  6,  7],
 [99,  9, 10, 11],
 [99, 13, 14, 15]]

9. 결론

 NumPy 확장 슬라이싱은 다차원 배열에서 원하는 형태와 조건의 데이터를 쉽게 추출하고 가공할 수 있는 강력한 도구입니다. 데이터 분석, 이미지 처리, 머신 러닝 등 다양한 분야에서 효율적으로 데이터를 처리하는 데 큰 도움이 됩니다. 

 

'Programming > Machine learning' 카테고리의 다른 글

[기계학습] 군집분석 - 계층적 클러스터링  (0) 2023.03.17
[NumPy] random 난수 생성  (0) 2023.03.16
[NumPy] sort 정렬  (0) 2023.03.15
[NumPy] unique 함수  (0) 2023.03.14
[NumPy] 인덱싱  (2) 2023.03.13
Comments