Numpy進階之排序小技巧

點擊藍字關注我,有乾貨領取!html


Numpy提供了大量用數組操做的函數,其中不乏常見的排序函數。web

這裏講下numpy.sortnumpy.argsortnumpy.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.841), ('Wang'1.938),('Duan'1.738)]
# 建立數組
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([312])
'''
數組:
array([3, 1, 2])
'''

# 獲取排序後的索引
np.argsort(x)
'''
輸出:
array([1, 2, 0], dtype=int64)
'''

import numpy as np
# 建立二維數組
x2 = np.array([[03], [22]])
'''
數組:
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)
'''

參考資料

[1]

Numpy文檔: https://numpy.org/devdocs/index.html

[2]

Numpy教程: https://www.runoob.com/numpy/numpy-tutorial.html


-END-

TIPS

加入【Python數據分析】知識星球,帶你走完數據科學流程!


往期精選

 

使用sklearn輕鬆實現數據縮放

從小白視角理解『數據挖掘十大算法』

seaborn經常使用的10種數據分析圖表


Python大數據分析

data creats value

長按二維碼關注

本文分享自微信公衆號 - Python大數據分析(pydatas)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索