Numpy.array의 sort에 대한 개인 메모

우선 평범한 정렬



아시다시피 argsort를 사용한 일반 정렬.

test_sort.py
import numpy as np
import matplotlib.pyplot as plt

# Prepare test array
np.random.seed(20190823)
array1d = np.random.random(size=100) # 1d array with random value

# Usual sort
sort_ind = np.argsort(array1d) # index array for sort of array1d
sorted_array1d = array1d[sort_ind] # sorted array1d

# Plot results #1
plt.figure()
plt.plot(array1d, label='Random', c='k')
plt.plot(sorted_array1d, label='Sorted')
plt.legend()
plt.show()

명확성을 위해 Matplotlib로 표시.


정렬 후 되돌리기



과연 자신 이외에 수요가 있는가.

test_sort.py (계속 1)
# Re-sort
re_sort_ind = np.argsort(sort_ind) # index array for sort of sort_ind

# Plot results #2
plt.figure()
plt.plot(array1d, label='Random', c='k')
plt.plot(sorted_array1d, label='Sorted')
plt.plot(sorted_array1d[re_sort_ind], zorder=-2, label='Re-sorted', lw=5, c='gold')
plt.legend()
plt.show()

Matplotlib의 표시. 원래의 배열(검정색)과 정렬 후 되돌린 배열(황색)이 제대로 일치하고 있다.


첫 번째 열과 두 번째 열의 우선 순위로 정렬하고 싶습니다.



일본어가 어렵습니다.
이하를 봐 주시는 편이 빠를까.

test_sort.py (계속 2)
# Prepare test array
np.random.seed(20190823)
array2d = np.random.randint(0,5,size=(100,2)) # 2d array with random value

# Plot results #3
plt.figure()
plt.plot(array2d[:,0], label='1st column')
plt.plot(array2d[:,1], label='2nd column')
plt.title('Before sort')
plt.legend()
plt.show()

100x2 테스트 배열에 대해 각 열에 대해 플롯.

추악하기 때문에 빨리 정렬합시다.

test_sort.py (계속 2)
from operator import itemgetter

# Sort!
list2d = list(array2d)
sorted_list2d = sorted(list2d, key=itemgetter(0,1))
sorted_array2d = np.array(sorted_list2d)

# Plot results #4
plt.figure(dpi=120)
plt.plot(sorted_array2d[:,0], label='1st column')
plt.plot(sorted_array2d[:,1], label='2nd column')
plt.title('After sort')
plt.legend()
plt.show()

다음 결과.


첫 번째 열의 값(파란색)에 대해 정렬되어 있고 첫 번째 열의 값이 같으면 두 번째 열(주황색)의 값에 따라 정렬되어 있음을 알 수 있습니다.

itemgetter를 사용하기 위해 numpy 배열에서 list로 변환하고 다시 numpy 배열로 변환하고 있습니다. 수고는 걸립니다만, 짧고 간단하게 쓸 수 있다고 하는 의미로 편리할까 생각합니다.

물론,
sorted_list2d = sorted(list2d, key=itemgetter(0,1))

의 itemgetter 인수를 변경하여 지정하는 열, 순서를 자유롭게 지정할 수 있습니다.

test_sort.py (계속 3)
# Sort!
sorted_list2d = sorted(list2d, key=itemgetter(1,0))
sorted_array2d = np.array(sorted_list2d)

# Plot results #5
plt.figure(dpi=120)
plt.plot(sorted_array2d[:,0], label='1st column')
plt.plot(sorted_array2d[:,1], label='2nd column')
plt.title('After sort')
plt.legend()
plt.show()



이전과는 반대로 두 번째 열의 값(주황색)에 대해 정렬되어 있고 두 번째 열의 값이 같으면 첫 번째 열(파란색)의 값에 따라 정렬되어 있음을 알 수 있습니다.

그럼 좋은 소트 라이프를.

좋은 웹페이지 즐겨찾기