點擊藍字關注我,有乾貨領取!html
Numpy提供了大量用數組操做的函數,其中不乏常見的排序函數。web
這裏講下numpy.sort
、numpy.argsort
、numpy.lexsort
三種排序函數的用法。面試
一、如何對數組元素進行快速排序?
使用numpy.sort
函數能夠對數組進行排序,並返回排序好的數組。算法
使用方法:數組
numpy.sort(a, axis=-1, kind=None, order=None)
微信
參數:app
-
a : 要排序的數組; -
axis :按什麼軸進行排序,默認按最後一個軸進行排序; -
kind :排序方法,默認是快速排序; -
order : 當數組定義了字段屬性時,能夠按照某個屬性進行排序;
import numpy as np
# 建立一個一維數組
x1 = np.array([1,8,2,4])
x1
'''
一維數組:
array([1, 8, 2, 4])
'''
# 排序
np.sort(x1)
'''
輸出:
array([1, 2, 4, 8])
'''
import numpy as np
# 建立一個二維數組
x2 = np.array([[1,8,2,4],[4,5,1,3]])
x2
'''
二維數組:
array([[1, 8, 2, 4],
[4, 5, 1, 3]])
'''
# 默認按最後一個軸排序,這裏按行排序
np.sort(x2)
'''
輸出:
array([[1, 2, 4, 8],
[1, 3, 4, 5]])
'''
# 軸設爲0,即按列排序
np.sort(x2,axis=0)
'''
輸出:
array([[1, 5, 1, 3],
[4, 8, 2, 4]])
'''
下面試下按照字段屬性進行排序,須要用到order
參數。編輯器
import numpy as np
# 這是一個名字、身高、年齡的數組
# 先給各字段配置屬性類型
dtype = [('Name', 'S10'), ('Height', float), ('Age', int)]
# 各字段值
values = [('Li', 1.8, 41), ('Wang', 1.9, 38),('Duan', 1.7, 38)]
# 建立數組
a = np.array(values, dtype=dtype)
a
'''
數組:
array([(b'Li', 1.8, 41), (b'Wang', 1.9, 38), (b'Duan', 1.7, 38)],
dtype=[('Name', 'S10'), ('Height', '<f8'), ('Age', '<i4')])
'''
# 按照屬性Height進行排序,此時參數爲字符串
np.sort(a, order='Height')
'''
輸出:
array([(b'Duan', 1.7, 38), (b'Li', 1.8, 41), (b'Wang', 1.9, 38)],
dtype=[('Name', 'S10'), ('Height', '<f8'), ('Age', '<i4')])
'''
# 先按照屬性Age排序,若是Age相等,再按照Height排序,此時參數爲列表
np.sort(a, order=['Age', 'Height'])
'''
輸出:
array([(b'Duan', 1.7, 38), (b'Wang', 1.9, 38), (b'Li', 1.8, 41)],
dtype=[('Name', 'S10'), ('Height', '<f8'), ('Age', '<i4')])
'''
二、如何獲取數組元素排序後的索引?
numpy.argsort
函數用於將數組排序後,返回數組元素從小到大依次排序的全部元素索引。函數
使用方法(和sort相似):大數據
numpy.argsort(a, axis=-1, kind=None, order=None)
參數:
-
a : 要排序的數組; -
axis :按什麼軸進行排序,默認按最後一個軸進行排序; -
kind :排序方法,默認是快速排序; -
order : 當數組定義了字段屬性時,能夠按照某個屬性進行排序;
import numpy as np
# 建立一維數組
x = np.array([3, 1, 2])
'''
數組:
array([3, 1, 2])
'''
# 獲取排序後的索引
np.argsort(x)
'''
輸出:
array([1, 2, 0], dtype=int64)
'''
import numpy as np
# 建立二維數組
x2 = np.array([[0, 3], [2, 2]])
'''
數組:
array([[0, 3],
[2, 2]])
'''
# 默認按照最後一個軸進行排序,即行排序
# 獲取排序後的索引
np.argsort(x2)
'''
輸出:
array([[0, 1],
[0, 1]], dtype=int64)
'''
按字段屬性進行排序,並獲取索引。
# 先給各字段配置屬性類型
dtype = [('name', str), ('age', int)]
# 值
values = [('Anna', 28), ('Bob', 27),('Brown',21)]
# 建立數組
x = np.array(values, dtype=dtype)
x
'''
數組:
array([('', 28), ('', 27), ('', 21)],
dtype=[('name', '<U'), ('age', '<i4')])
'''
# 先按照屬性name排序,若是name相等,再按照age排序
np.argsort(x,order=['name','age'])
'''
輸出:
array([2, 1, 0], dtype=int64)
'''
三、如何按多條件進行排序?
這裏舉一個應用場景:
小升初考試,重點班錄取學生按照總成績錄取。
在總成績相同時,數學成績高的優先錄取,在總成績和數學成績都相同時,按照英語成績錄取……
這裏,總成績排在電子表格的最後一列,數學成績在倒數第二列,英語成績在倒數第三列。
numpy.lexsort
函數用於按照多個條件(鍵)進行排序,返回排序後索引。
使用方法:
numpy.lexsort(keys, axis=-1)
參數:
-
keys :序列或元組,要排序的不一樣的列; -
axis :沿指定軸進行排序;
說明:
使用鍵序列執行間接穩定排序。
給定多個排序鍵(能夠將其解釋爲電子表格中的列),lexsort返回一個整數索引數組,該數組描述按多個列排序的順序。
序列中的最後一個鍵用於主排序順序,倒數第二個鍵用於輔助排序順序,依此類推。
keys參數必須是能夠轉換爲相同形狀的數組的對象序列。
若是爲keys參數提供了2D數組,則將其行解釋爲排序鍵,並根據最後一行,倒數第二行等進行排序。
import numpy as np
# 英語成績
eng = [90,85,95,80]
# 數學成績
math = [80,95,90,85]
# 總成績
total = [170,170,185,165]
# 排序,獲取索引
np.lexsort((eng,math,total))
'''
先按總成績total進行排序,
再按數學成績math進行排序,
最後按英語成績進行排序。
能夠看到total裏有兩個170,
這時候就按下一級math排序,
最後獲取排序後的索引
輸出:
array([3, 0, 1, 2], dtype=int64)
'''
# 也能夠直接傳入數組
score = np.array([[90,85,95,80],[80,95,90,85],[170,170,185,165]])
np.lexsort(score)
'''
輸出:
array([3, 0, 1, 2], dtype=int64)
'''
參考資料
Numpy文檔: https://numpy.org/devdocs/index.html
[2]Numpy教程: https://www.runoob.com/numpy/numpy-tutorial.html
-END-
TIPS
加入【Python數據分析】知識星球,帶你走完數據科學流程!
往期精選
Python大數據分析
data creats value
長按二維碼關注
本文分享自微信公衆號 - Python大數據分析(pydatas)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。