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와 팔로우 눌러주시면 감사하겠습니다.
'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 |
댓글