본문 바로가기
Python/python 기초

Numpy array - 4

by winston1214 2020. 1. 7.
반응형

3까지는 배열을 생성하는 것에 초점을 맞췄다면 이제는 배열을 다루는 것에 초점을 맞출 것이다. 

기본적으로 import numpy as np를 실행하고 그 전에 썼던 사용자 정의 함수 np_print(arr)를 다시 재정의하자.

 

import numpy as np
def np_print(arr):
    txt='''
    shape : {}
    ndim: {}
    dtype: {} 
    data: \n {}
    '''.format(arr.shape,arr.ndim,arr.dtype,arr)
    print(txt)

# 배열 정렬
- sort(axis=-1)메서드:axis를 기준으로 요소를 오름차순 정렬
    - 기본값(axis=-1): 현재 배열의 마지막 axis
    - axis=0: 열 단위 정렬
    - axis=1: 행 단위 정렬
    - 원번 객체에 정렬 결과가 반영됨
- np.sort(axis=-1):axis를 기준으로 요소를 오름차순 정렬
    - 기본값(axis=-1): 현재 배열의 마지막 axis
    - axis = 0: 열 단위 정렬
    - axis=1: 행 단위 정렬
    - 정렬된 새로운 배열을 반환함
- np.argsort(arr): 정렬 순서를 반환함
    - 기본값(axis=-1): 현재 배열의 마지막 axis
    - axis=0: 열 단위 정렬
    - axis=1: 행 단위 정렬

일단 x라는 array를 생성해보겠다.

# 1차원 배열 생성
# 아이템: 0,1,2,3,4
x=np.arange(0,5)
np_print(x)

# 아이템 순서를 뒤집어서 나열
x[::-1]
# out array([4, 3, 2, 1, 0])

일단 뒤집자!

위와 같이 뒤집은 x 배열을 오름차순 정렬해보자

np.sort(x[::-1])
# out [0,1,2,3,4]

위와 같이 정렬된 형태로 결과값이 나온다.

위와 다른 방법으로 x.sort()를 했을 때 원본 객체에 저장이 되지만 그러나 np.sort()는 원본 객체에 저장이 안되어서 원본 객체를 보호하는데 도움이 된다.

이제 조금 심화해서 2차원 데이터를 보자

# 아이템 : 0이상 1 미만의 범위에서 무작위 실수값을 가지는 3*3
a=np.random.random((3,3))
b=np.random.random((3,3))

위와 같은 코드를 생성하여 3*3의 난수 배열을 생성한다. 

이를 여러 기준으로 정렬해보자.

  • 행 방향 정렬
#기본 방향 : 행 방향 정렬
np.sort(a)

'''

array([[0.56642432, 0.80107344, 0.96127427],
       [0.01687743, 0.16366656, 0.17340194],
       [0.03706294, 0.18335216, 0.30929248]])
''

위와 같이 아무런 제약식 없이 np.sort()를 쓰면 행 방향으로 오름차순 정렬됨을 알 수 있다.

  • 열 방향 정렬
# 열 기준 정렬
np.sort(a, axis=0)
'''
array([[0.16366656, 0.17340194, 0.01687743],
       [0.30929248, 0.18335216, 0.03706294],
       [0.56642432, 0.96127427, 0.80107344]])
'''

axis = 0 을 통해 열 기준 정렬을 시킨다.

  • 열기준 내림차순 정렬
# 내림차순 정렬
np.sort(a,axis=0)[::-1]
'''
array([[0.91050135, 0.76407715, 0.94246383],
       [0.80334761, 0.13585711, 0.77996906],
       [0.29919367, 0.01020553, 0.74626578]])
'''       

이제 np.argsort()에 대해서 알아보자

np.argsort()는 위에서 언급했듯이, 정렬 순서를 반환하는 함수이다. 예시를 보자.

a= np.random.randint(0,10,size =5)
np_print(a)
'''
    shape : (5,)
    ndim: 1
    dtype: int32 
    data: 
 [3 2 9 0 4]
 '''
# 오름차순 정렬
np.sort(a)
'''
array([0, 2, 3, 4, 9])
'''
np.argsort(a)
'''
array([3, 1, 0, 4, 2], dtype=int64)
'''

코드의 결과만 보면 이해가 잘 안갈 것이다. 하지만 array(a[3],a[1],a[0],a[4],a[2])

라고 하면 이해가 될 것이다. 즉 a[3] = 0, a[1] = 2 , a[0] = 3, a[4] = 4, a[2] = 9 이런 형식으로 생각하면 된다.

이게 왜 필요할까 예시를 한 번 보겠다.

# 첫번째 컬럼을 기준으로 내림차순 정렬1
a[a[:,0].argsort()[::-1]]

'''

array([[0.91050135, 0.13585711, 0.94246383],
       [0.80334761, 0.01020553, 0.77996906],
       [0.29919367, 0.76407715, 0.74626578]])
'''
# 내림차순 정렬
np.sort(a,axis=0)[::-1]
'''
array([[0.91050135, 0.76407715, 0.94246383],
       [0.80334761, 0.13585711, 0.77996906],
       [0.29919367, 0.01020553, 0.74626578]])
'''       

정확한 비교를 위해 기존의 a 배열을 보자

열기준 내림차순 정렬을 한 np.sort(a,axis=0)[::-1] 의 결과값은 행과 열의 구조에 관계 없이 정말 열 기준으로만 정렬이 된 것이고 argsort를 이용한 코드는 1행 2행 3행의 value값을 고정시키고 아예 줄 자체로 변환되어서 정렬되었다. 

이는 a[:,0].argsort()[::-1] 코드를 따로 실행했을 때 array([1, 0, 2], dtype=int64)라는 결과값이 나오는데 이를 a[[1,0,2]] 인덱싱이 되어 행 value 값을 고정시킨 정렬된 array가 된 것이다. 

※ a[[0]] 를 수행하면 2행이 반환된다.

 

자세한 코드는 github.com/winston1214/baseline_ML -> star와 팔로우 눌러주시면 감사하겠습니다.

 

winston1214/baseline_ML

ML을 위한 기초 공부. Contribute to winston1214/baseline_ML development by creating an account on GitHub.

github.com

 

 

반응형

'Python > python 기초' 카테고리의 다른 글

Numpy - 6  (2) 2020.01.22
Numpy - 5  (0) 2020.01.22
Numpy array - 3  (0) 2020.01.07
Numpy array -2  (0) 2020.01.07
Numpy array - 1  (0) 2020.01.06

댓글