Coding Diary.

(파이썬) NumPy 슬라이싱 및 복사, 대각 요소 추출, 고유한 값 리턴하기 본문

Coding/Python

(파이썬) NumPy 슬라이싱 및 복사, 대각 요소 추출, 고유한 값 리턴하기

life-of-nomad 2024. 6. 14. 12:29
728x90
반응형
이전 글에서  NumPy 의 개별 요소에 액세스하는 방법을 알아보았습니다. 이번 글에서는 ndarray의 일부분에 액세스하는 방법인 슬라이싱에 대해 알아보겠습니다.

 

🔻(참고)넘파이 인덱싱🔻

 

(파이썬) NumPy, ndarray의 요소에 액세스하고 요소 삭제/삽입하기

지난 글에서 NumPy 에서 유용한 내장 함수를 이용해 다양한 ndarray를 만드는 방법에 대해 알아보았습니다. ndarray는 변경가능(mutable) 합니다. 즉, ndarray를 만든 후에 안에 있는 요소들을 변경할 수 있

life-of-nomad.tistory.com

1. ndarray 슬라이싱

  • ndarray의 일부분에 액세스하는 방법을 슬라이싱이라고 합니다.
  • 대괄호[] 안에서 콜론 (:) 기호를 사용하여 인덱스들을 조합하여 슬라이싱을 할 수 있습니다.
  • 일반적으로, 세 가지 유형의 슬라이싱이 있습니다.
    • ndarray[start:end]
    • ndarray[start:]
    • ndarray[:end]
  • 여기서, 마지막 인덱스는 제외된다는 점을 주의해야 합니다. 
  • 또한, ndarray는 다차원일 수 있기 때문에 슬라이싱을 할 때는 배열에 있는 각각의 차원에 대해 슬라이스를 지정해야 합니다. 

1) 2차원 ndarray 슬라이싱하기

X = np.arange(20).reshape(4, 5)

print('X = \n', X)
>>> X = [[ 0 1 2 3 4]  
        [ 5 6 7 8 9]  
        [10 11 12 13 14]  
        [15 16 17 18 19]]

Z = X[1:4, 2:5]
print('Z = \n', Z)
>>> Z = [[ 7 8 9]  
        [12 13 14]  
        [17 18 19]]
        
W = X[1:, 2:5]
print('W = \n', W)
>>> W = [[ 7 8 9]  
        [12 13 14]  
        [17 18 19]]

V = X[2, :]
print('V = \n', V)
>>> V = [10 11 12 13 14]

q = X[:, 2]
print('q = ', q)
>>> q = [ 2 7 12 17]

# We select all the elements in the 3rd column but return a rank 2 ndarray
R = X[:, 2:3]
print('R = \n', R)
>>> R = [[ 2]  
        [ 7]  
        [12]  
        [17]]
  • X의 세번째 열에 있는 모든 요소를 선택하면, 위의 변수 q에서 알 수 있듯이 슬라이스는 2차원 배열이 아니라 1차원 배열을 리턴한다는 점을 주의해야 합니다. 
  • 하지만, 약간 다른 방식으로 X를 슬라이싱하면 변수 R에서 처럼 2차원의 배열을 얻을 수 있습니다. 

2) 2차원 ndarray의 요소를 슬라이싱하고 편집하기

  • 위에서 한 것 처럼 ndarray에 슬라이싱을 하고 그것들을 새로운 변수에 저장하면 데이터는 새 변수에 복사되지 않습니다. 
  • 예를 들어 Z = X[1:4, 2:5] 로 변수 Z를 할당할 때 원본 배열 X의 슬라이스는 변수 X에 복사되지 않습니다.
  • 즉, X와 Z는 동일한 ndarray 를 가리키는 다름 이름들일 뿐입니다. 
  • 슬라이싱을 하면 원본 배열의 뷰가 생성될 뿐입니다. 즉, Z에서 변경을 하면 실제로 X안의 요소들도 변경됩니다.
X = np.arange(20).reshape(4, 5)
print('X = \n', X)
>>> X = [[ 0 1 2 3 4]  
        [ 5 6 7 8 9]  
        [10 11 12 13 14]  
        [15 16 17 18 19]]
        
Z = X[1:4, 2:5]
print('Z = \n', Z)
>>> Z = [[ 7 8 9]  
        [12 13 14]  
        [17 18 19]]
        
Z[2, 2] = 555

print('X = \n', X)
>>> X = [[ 0 1 2 3 4]  
        [ 5 6 7 8 9]  
        [ 10 11 12 13 14]  
        [ 15 16 17 18 555]]
  • 위의 예시 처럼 Z를 변경하면 X도 변경됩니다.

 

2. numpy.ndarray.copy

ndarray.copy(order = 'C')
  • 위의 구문을 쓰면 사본이 리턴됩니다.
  • 하지만 슬라이스에 있는 값들의 사본이 포함된 새로운 ndarray를 만들려고 한다면 np.copy() 함수를 사용해야 합니다. 
  • np.copy(ndarray) 함수는 주어진 ndarray의 사본을 생성합니다.
  • 또한, 이 함수를 메소드로써 사용할 수 있습니다.
X = np.arange(20).reshape(4, 5)
print('X = \n', X)
>>> X = [[ 0 1 2 3 4]  
        [ 5 6 7 8 9]  
        [10 11 12 13 14]  
        [15 16 17 18 19]]
        
# create a copy of the slice using the np.copy() function
Z = np.copy(X[1:4, 2:5])

#  create a copy of the slice using the copy as a method
W = X[1:4, 2:5].copy()

Z[2,2] = 555
W[2,2] = 444

print('X = \n', X)
>>> X = [[ 0 1 2 3 4]  
        [ 5 6 7 8 9]  
        [10 11 12 13 14]  
        [15 16 17 18 19]]
        
print('Z = \n', Z)
>>> Z = [[ 7 8 9]  
        [ 12 13 14]  
        [ 17 18 555]]
        
print('W = \n', W)
>>> W = [[ 7 8 9]  
        [ 12 13 14]  
        [ 17 18 444]]
  • 즉, copy 를 사용하면 서로 완전히 독립된 새로운 ndarray가 생성됩니다. 

 

3. array를 인덱스로 활용하기

  • ndarray 하나를 사용하여 슬라이스를 만들고 다른 ndarray에서 요소를 선택하거나 변경하면 유용한 경우가 많습니다.

1) 슬라이스 만들고 요소 선택, 변경하기

X = np.arange(20).reshape(4, 5)
print('X = \n', X)
>>> X = [[ 0 1 2 3 4]  
        [ 5 6 7 8 9]  
        [10 11 12 13 14]  
        [15 16 17 18 19]]

indices = np.array([1, 3])
print('indices = ', indices)
>>> indices = [1 3]

# We use the indices ndarray to select the 2nd and 4th row of X
Y = X[indices, :]
print('Y = \n', Y)
>>> Y = [[ 5 6 7 8 9]  
		[15 16 17 18 19]]

# We use the indices ndarray to select the 2nd and 4th column of X
Z = X[:, indices]
print('Z = \n', Z)
>>> Z = [[ 1 3]  
        [ 6 8]  
        [11 13]  
        [16 18]]

2) 2차원에서 특정한 행 추출하기

import numpy as np

X = np.random.randint(1, 20, size=(50, 5))
print("Shape of X is: ", X.shape)
>>> Shape of X is: (50, 5)

# Create a rank 1 ndarray that contains a randomly chosen 10 values between `0` to `len(X)` (50)
# The row_indices would represent the indices of rows of X
row_indices = np.random.randint(0, 50, size=10)
print("Random 10 indices are: ", row_indices)
>>> Random 10 indices are: [ 1 38 31 45 44 21 6 24 19 33]

# Print those rows of X whose indices are represented by entire row_indices ndarray
X_subset = X[row_indices, :]
print(X_subset)

# Print those rows of X whose indices are present in row_indices[4:8]
X_subset = X[row_indices[4:8], :]
print(X_subset)

 

4. numpy.diag(대각 요소 추출하기)

numpy.diag(array, k=0)
  • 이 구문을 쓰면 대각 요소들이 추출되거나 구성됩니다.
  • NumPy는 ndarray에서 특정한 요소들을 선택하기 위한 내장 함수를 제공합니다.
  • np.diag(ndarray, k=N) 함수는 N으로 정의되는 대각선을 따라 요소들을 추출합니다.
  • 기본 값은 주 대각선을 나타내는 k=0 입니다. 
  • k>0 인 값을 쓰면 주 대각선 위의 대각선에 있는 요소들이 선택되고, k<0인 값을 쓰면 주 대각선 아래의 대각선에서 요소들이 추출됩니다.
X = np.arnage(25)reshape(5, 5)
print('X = \n', X)
>>> X = [[ 0 1 2 3 4]  
        [ 5 6 7 8 9]  
        [10 11 12 13 14]  
        [15 16 17 18 19]  
        [20 21 22 23 24]]
        
print('z = ', np.diag(X))
>>> z = [ 0 6 12 18 24]

print('y = ', np.diag(X, k=1))
>>> y = [ 1 7 13 19]

print('w = ', np.diag(X, k=-1))
>>> w = [ 5 11 17 23]

 

5. numpy.unique

numpy.unique(array, return_index=False, return_inverse=False, return_counts=False, axis=None)
  • 이 구문은 어떤 배열의 고유한 요소들을 정렬하여 리턴합니다. 
  • np.unique() 함수를 사용하여 고유한 요소들만 추출하면 유용한 경우들이 많이 있습니다.
X = np.array([[1,2,3],[5,2,8],[1,2,3]])
print('X = \n', X)
>>> X = [[1 2 3]  
        [5 2 8]  
        [1 2 3]]
        
print('The unique elements in X are: ', np.unique(X))
>>> The unique elements in X are: [1 2 3 5 8]
728x90
반응형