본문 바로가기

Programming/Python

[Numpy] ndarray 인덱싱, 정렬 기능 사용하기

반응형

지난 포스팅 에서는 ndarray 를 활용한 기본적인 데이터 변황에 대해서 살펴 보았습니다. 

2020/05/10 - [Programming/Python] - [Numpy] ndarray 기본 및 데이터 타입 변환하기

이번 포스팅에서는 ndarray 를 통한 행현환 , 인덱싱, 정렬 기능을 사용해 보고자 합니다. 

인덱싱 

인덱싱 기능으로 살펴볼 내용을 아래와 같습니다. 

특정한 데이터만 추출 : 인덱스 값을 지정하면 해당 위치의 데이터가 반환
슬라이싱 : 연속된 인덱스상의 ndarray 를 추출
팬시 인덱싱 : 일정한 인덱싱 집합을 ndarray 형태로 지정해 해당위치 데이터의 ndarray를 반환
불린 인덱싱 : 특정 조건에 해당하는지 여부인 true/false값  인덱싱 집합을 기반으로 true 에 해당하는 인덱스 위치에 있느느 데이터의 ndarray를 반환

 

우선 np.arange() 를 통해 1~9 까지 배열을 하나 생성합니다.

#input
array1 = np.arange(start=1, stop=10)
array1

#output
array([1, 2, 3, 4, 5, 6, 7, 8, 9])

 

이제 데이터를 추출해 보겠습니다.

인덱스는 0 부터 시작이르므로 array1 [2] 는 3번째 인덱스 위치의 값을 의미합니다.

#input
value = array1[2]
value

#output
3

 

데이터 값의 수정도 가능합니다. 

0번과 8번 인덱스의 값을 변경하면 다음과 같이 변경된 데이터가 출력됩니다. 

#input
array1[0]=9
array1[8]=0
array1

#output
array([9, 2, 3, 4, 5, 6, 7, 8, 0])

 

이번에는 1차원 데이터를 2차원 데이터로 변경 한 후 데이터를 추출해 보겠습니다. 

reshape() 함수를 활용하여 3X3 의 2차원 데이터로 변경합니다. 

이후 2차원 데이터에서 로우와 컬럼을 지정하면 해당 데이터가 추출되는 것을 확인 할 수 있습니다.

#input
array1d = np.arange(start=1, stop=10)
array2d = array1d.reshape(3,3)
print('array1d :', array1d)
print('array2d :\n', array2d)


#output
array1d : [1 2 3 4 5 6 7 8 9]
array2d :
 [[1 2 3]
 [4 5 6]
 [7 8 9]]


#input
print('row0, col0 :', array2d[0,0]) #row0, col0
print('row0, col2 :', array2d[0,2]) #row0, col2
print('row1, col1 :', array2d[1,1]) #row1, col1
print('row2, col2 :', array2d[2,2]) #row2, col2


#output
row0, col0 : 1
row0, col2 : 3
row1, col1 : 5
row2, col2 : 9

 

 

슬라이싱

':' 기호를 사용하면 연속한 데이터를 슬라이싱 하여 추출할 수 있습니다. 

#input
array1 = np.arange(1,10)
array1

#output
array([1, 2, 3, 4, 5, 6, 7, 8, 9])


#input
array3 = array1[0:3] # array1 에서 0 ~ (3-1) 까지의 데이터 추출
print(array3)
print(type(array3))

#output
[1 2 3]
<class 'numpy.ndarray'>

이때  시작, 종료 인덱스 값은 생략이 가능합니다. 

생략된 경우 시작 인덱스는 첫번째 인덱스 , 종료 인덱스는 마지막 인덱스가 적용 되어

array3 = array1[:] 이렇게 지정할 경우 전체 인덱스가 모두 추출됩니다. 

 

2차원 ndarray 슬라이싱은   1차원 슬라이싱과 동일하나 콤마(,)를 사용해 로우와 칼럼 인덱스를 지칭합니다.

우선 2차원 데이터로 변환한 후 로우와 컬럼을 지정하여 데이터를 추출해 보겠습니다. 

지정된 row 와 col 값으로 데이터가 추출되는 것을 확인 할 수 있습니다 

#input
array2d = array1d.reshape(3,3)
array2d

#output
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])
       
#input
print(array2d[0:2, 0:2]) #row 0,1 col 0,1
print('\n')
print(array2d[1:3, 0:3]) #row 1,2 col 0,1,2
print('\n')
print(array2d[1:3,  : ]) #row 1,2 col 0,1,2
print('\n')
print(array2d[ : ,  : ]) #row 0,1,2 col 0,1,2

#output
[[1 2]
 [4 5]]

[[4 5 6]
 [7 8 9]]

[[4 5 6]
 [7 8 9]]

[[1 2 3]
 [4 5 6]
 [7 8 9]]

 

 

정렬

정렬 기능은 sort() 함수를 사용합니다. 

테스트를 위한  array 를 다음과 같이 생성합니다. 

#input
array = np.array([3,1,9,5])
array

#output
array([3, 1, 9, 5])

 

numpy 에서 sort 함수를 사용하면 정렬된 데이터를 반환합니다. 

하지만 ndarray.sort() 를 사용한 경우에는 원본 행렬을 자체를 정렬된 값으로 변환하게 되어 아래와 같이 

array2 는 아무런 값도 반환하지 않고 array 값 자체가 변경된걸 확인 할 수 있습니다.

#input
array_sort = np.sort(array)
array_sort

#output
array([1, 3, 5, 9])

       
#input
array_sort2 = array.sort()
array_sort2

#output
none

#input
array

#output
array([1, 3, 5, 9])

 

내림차순 정렬은 [::-1] 을 사용합니다.

#input
array_desc = np.sort(array)[::-1]
array_desc

#output
array([9, 5, 3, 1])

 

 

2차원 행렬인 경우 로우 또는 컬럼 방향으로 정렬을 진행 합니다. 

axis=0 : 로우 기준 정렬
axis=2 : 컬럼 기준 정렬

#input
array2d = np.array([[8,12],[7,1]])
array2d

#output
array([[ 8, 12],
       [ 7,  1]])
       
#input      
array2d_axis0 = np.sort(array2d, axis=0)
array2d_axis0

#output
array([[ 7,  1],
       [ 8, 12]])
       
       
#input      
array2d_axis1 = np.sort(array2d, axis=1)
array2d_axis1

#output
array([[ 8, 12],
       [ 1,  7]])

 

참고 : 파이썬 머신러닝 완벽가이드   github.com/wikibook/pymldg-rev