NumPy 활용한 데이터 분석 입문(4) - 인덱싱, 슬라이싱, 정렬

천호영·2021년 6월 19일
0

데이터 조회를 위한 인덱싱

Ndarray의 각 축에는 인덱스 번호가 존재하며, 저장된 특정 데이터 위치는 이러한 인덱스를 통해 접근할 수 있습니다.

데이터 인덱싱할 때 입력해야 하는 인덱스의 값은 차원의 개수만큼 늘어납니다.

인덱싱을 통한 조회 방법
1차원 : 배열명 [ index_x ]
2차원 : 배열명 [ index_x, index_y ]
3차원 : 배열명 [ index_x, index_y, index_z ]

<실습코드>

import numpy as np

'''
# 1차원 샘플 데이터 생성
'''
sample = np.arange(5,15)
print('1D-Array Sample:', sample)
print('sample[3] = ', sample[3])

'''
# 인덱싱 값 변경 후 출력
'''
sample[3]=0
print('1D-Array Sample:', sample)

'''
# 2차원 샘플 데이터 생성
'''
sample = np.arange(16).reshape((4,4))
print('\n2D-Array Indexing')
print(sample)
print('sample[2,3] = ', sample[2,3])


'''
# 인덱싱 값 변경 후 출력
'''
sample[2,3]=0
print(sample)

'''
# 3차원 샘플 데이터 생성
'''
sample = np.arange(16).reshape((4,2,2))
print('\n3D-Array Indexing')
print(sample)
print('sample[1,1,1] = ', sample[1,1,1])

<실행결과>

1D-Array Sample: [ 5  6  7  8  9 10 11 12 13 14]
sample[3] =  8
1D-Array Sample: [ 5  6  7  0  9 10 11 12 13 14]

2D-Array Indexing
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]]
sample[2,3] =  11
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10  0]
 [12 13 14 15]]

3D-Array Indexing
[[[ 0  1]
  [ 2  3]]

 [[ 4  5]
  [ 6  7]]

 [[ 8  9]
  [10 11]]

 [[12 13]
  [14 15]]]
sample[1,1,1] =  7

데이터 조회를 위한 슬라이싱

NumPy 의 슬라이싱은 Ndarray 내 특정 범위를 지정하여 데이터를 조회하는 방식으로 범위 지정을 위해 인덱스를 활용합니다.

배열명 [ from start : to stop ]

from start

  • 범위의 시작점이 되는 인덱스 값으로 생략 되면 0번째 인덱스부터 시작됨

to stop

  • 범위의 종료점이 되는 인덱스 값으로, stop -1 까지의 인덱스 값만 조회
  • 생략되면 마지막 인덱스의 값까지 조회됨

Negative Index 란 ?

  • 음수를 활용하여 데이터 역순으로 접근할 수 있음
  • 인덱스 -1 은 마지막 행/열에 해당되는 인덱스(현업에서 -1을 가장많이사용)

2차원 ndarray를 슬라이싱하는 경우 행과 열의 조건을 따로 주어야 합니다.

<실습코드>

import numpy as np

# 1차원 샘플 데이터 생성
sample = np.arange(5,15)
print('1D-Array Sample')
print(sample)

'''
# 슬라이싱 실습
'''
print('\nSlicing')
print(sample[2:5])
print(sample[:5])
print(sample[7:])
print(sample[2:-1])       
print(sample[:])

# 2차원 샘플 데이터 생성
sample = np.arange(1,17).reshape(4,4)
print('\n2D-Array Sample')
print(sample)

'''
# 슬라이싱 실습
'''
print('\nSlicing')
print(sample[1:3,1:3])
print(sample[:3,0:1])
print(sample[3:,:])
print(sample[:,2])       
print(sample[:,:])

'''
# Negative Index 활용한 슬라이싱 실습
'''
print('\nSlicing by Negative Index')
print(sample[:, 1:-1])
print(sample[:-1, -2])       
print(sample[:, -1])

<실행결과>

1D-Array Sample
[ 5  6  7  8  9 10 11 12 13 14]

Slicing
[7 8 9]
[5 6 7 8 9]
[12 13 14]
[ 7  8  9 10 11 12 13]
[ 5  6  7  8  9 10 11 12 13 14]

2D-Array Sample
[[ 1  2  3  4]
 [ 5  6  7  8]
 [ 9 10 11 12]
 [13 14 15 16]]

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

Slicing by Negative Index
[[ 2  3]
 [ 6  7]
 [10 11]
 [14 15]]
[ 3  7 11]
[ 4  8 12 16]

데이터 정렬

NumPy 는 Ndarray 내 저장된 데이터의 정렬을 위한 다음과 같은 함수를 제공합니다.

np.sort(array)
  • 기본적으로 오름차순 정렬만 지원함
  • 정렬된 결과를 반환하지만, 원본 데이터는 변경하지 않음

  • 원본 데이터를 변경하려면 호출 순서를 다음과 같이 작성하면 됨
    - ndarray.sort() : 원본 데이터를 변경하고 none 값을 반환(써도 되지만, 원본데이터는 바꾸지 않는것이 좋습니다)

  • np.sort() 활용한 내림차순 정렬 방법
    1) np.sort() 를 통해 오름차순 정렬하여 저장
    2) 오름차순 정렬된 배열을 역순으로 출력 [::-1]

2차원 ndarray를 정렬할 때는 axis를 통해 집계 방향을 결정해야 합니다.

np.sort(array,axis)

다음은 입력한 배열을 오름차순으로 정렬한 뒤 배열의 인덱스 값들만 반환하는 함수입니다.

np.argsort(array)

<실습코드>

import numpy as np

# 샘플 데이터 생성
sample = np.array([2,5,8,1])
print('1D-Array Sample')
print(sample)

'''
# np.sort() 정렬
'''
result = np.sort(sample)
print('\nResult of np.sort')
print('Result :', result)
print('Original :', sample)

'''
# [::-1] 실습
'''
print('\nTest[::-1] ')
print('Original :', sample)
print('Result :',  sample[::-1])

'''
# 내림차순 정렬
'''
sort_arr = np.sort(sample)
result = sort_arr[::-1]
print('\nDcending Order')
print('Dcending :', result)

'''
# 샘플 데이터 생성
'''
sample = np.array([[9,11],[5,1]])
print('\n2D-Array Sample')
print(sample)

'''
# 2차원 배열 정렬 by axis=0
'''
result = np.sort(sample,axis=0)
print('\nnp.sort(axis=0) :')
print(result)

'''
# 2차원 배열 정렬 by axis=1
'''
result = np.sort(sample,axis=1)
print('\nnp.sort(axis=1) :')
print(result)

'''
# 샘플 데이터 생성
'''
name = np.array(['John','Samuel','Kate','Mike','Sarah'])
score = np.array([78,84,96,88,82])

'''
# np.argsort() 통해 정렬된 인덱스 값만 반환
'''
sort_indexes = np.argsort(score)
print('\nnp.argsort()')
print('sort indexes :', sort_indexes)

'''
# 인덱스 값을 통해 컬럼명 조회
'''
print('sort values :', name[sort_indexes])

<실행결과>

1D-Array Sample
[2 5 8 1]

Result of np.sort
Result : [1 2 5 8]
Original : [2 5 8 1]

Test[::-1] 
Original : [2 5 8 1]
Result : [1 8 5 2]

Dcending Order
Dcending : [8 5 2 1]

2D-Array Sample
[[ 9 11]
 [ 5  1]]

np.sort(axis=0) :
[[ 5  1]
 [ 9 11]]

np.sort(axis=1) :
[[ 9 11]
 [ 1  5]]

np.argsort()
sort indexes : [0 4 1 3 2]
sort values : ['John' 'Sarah' 'Samuel' 'Mike' 'Kate']

0개의 댓글