解讀Numpy中的排序(sort,argsort)
Numpy中的排序(sort,argsort)
按索引排序
>>import numpy as np >>x=np.array([[0,12,48],[4,14,18],[1,7,99]]) #靈活應(yīng)用索引和切片實(shí)現(xiàn)按索引的排序 #倒序的實(shí)現(xiàn)(普通列表也可用reverse實(shí)現(xiàn),numpy則沒(méi)有這個(gè)方法) >>x[::-1] array([[ 1, 7, 99], [ 4, 14, 18], [ 0, 12, 48]]) #指定順序的實(shí)現(xiàn)(傳入用于指定順序的整數(shù)列表或ndarray即可) >>x[[2,0,1]] array([[ 1, 7, 99], [ 0, 12, 48], [ 4, 14, 18]]) >>x[[2,0,1],[0,2,1]] #只是截取部分元素,并不符合排序要求 array([ 1, 48, 14]) >>x[[2,0,1]][:,[0,2,1]] array([[ 1, 99, 7], [ 0, 48, 12], [ 4, 18, 14]]) >>x[np.ix_([2,0,1],[0,2,1])] #np.ix_函數(shù)將兩個(gè)一維數(shù)組轉(zhuǎn)化為用于選取方形區(qū)域的索引器 array([[ 1, 99, 7], [ 0, 48, 12], [ 4, 18, 14]])
按值大小排序
ndarray.sort(axis=-1, kind='quicksort', order=None)
或者:
ndarray.sort(axis=-1, kind='quicksort', order=None)
參數(shù) | 描述 |
---|---|
axis | 排序沿?cái)?shù)組的(軸)方向,0表示按行,1表示按列,None表示展開(kāi)來(lái)排序,默認(rèn)值為-1,表示沿最后的軸排序 |
kind | 排序的算法,提供了快排'quicksort'、混排'mergesort'、堆排'heapsort', 默認(rèn)為‘quicksort' |
order | 排序的字段名,可指定字段排序,默認(rèn)為None |
>>import numpy as np >>x=np.array([[0,12,48],[4,18,14],[7,1,99]]) >>np.sort(x) array([[ 0, 12, 48], [ 4, 14, 18], [ 1, 7, 99]]) >>np.sort(x,axis=1) array([[ 0, 12, 48], [ 4, 14, 18], [ 1, 7, 99]]) >>x.sort() array([[ 0, 12, 48], [ 4, 14, 18], [ 1, 7, 99]]) >>dt = np.dtype([('name', 'S10'),('age', int)]) >>a = np.array([("Mike",21),("Nancy",25),("Bob", 17), ("Jane",27)], dtype = dt) >>np.sort(a, order = 'name') array([(b'Bob', 17), (b'Jane', 27), (b'Mike', 21), (b'Nancy', 25)], dtype=[('name', 'S10'), ('age', '<i4')]) >>np.sort(a, order = 'age') array([(b'Bob', 17), (b'Mike', 21), (b'Nancy', 25), (b'Jane', 27)], dtype=[('name', 'S10'), ('age', '<i4')])
numpy.argsort(a, axis=-1, kind='quicksort', order=None)
對(duì)數(shù)組沿給定軸執(zhí)行間接排序,并使用指定排序類(lèi)型返回?cái)?shù)據(jù)的索引數(shù)組。 這個(gè)索引數(shù)組用于構(gòu)造排序后的數(shù)組。
參數(shù)類(lèi)似于sort(),不作說(shuō)明
>>import numpy as np >>> x = np.array([3, 1, 2]) >>> a=np.argsort(x) >>a #升序 #argsort函數(shù)返回的是數(shù)組值從小到大的索引值,[3, 1, 2]從小到大為[1,2,3],期對(duì)應(yīng)的索引為[1,2,0] array([1, 2, 0]) >>np.argsort(-x) #降序 array([0, 2, 1], dtype=int64) >>x[a] #以排序后的順序重構(gòu)原數(shù)組 array([1, 2, 3]) #二維數(shù)組 >>x=np.array([[0,12,48],[4,18,14],[7,1,99]]) >>a1=np.argsort(x) >>a1 array([[0, 1, 2], [0, 2, 1], [1, 0, 2]], dtype=int64) #以排序后的順序重構(gòu)原數(shù)組,注意與一維數(shù)組的形式不一樣 >>np.array([np.take(x[i],x[i].argsort())for i in range(3)]) array([[ 0, 12, 48], [ 4, 14, 18], [ 1, 7, 99]]) >>x[x[:,2].argsort()] #按照第三列對(duì)行進(jìn)行排序 array([[ 4, 18, 14], [ 0, 12, 48], [ 7, 1, 99]]) >>x.T[x.T[:,2].argsort()].T #按照第三行對(duì)列進(jìn)行排序 array([[12, 0, 48], [18, 4, 14], [ 1, 7, 99]]) >>x[:,x[2].argsort()] #還可以這樣寫(xiě) array([[12, 0, 48], [18, 4, 14], [ 1, 7, 99]])
lexsort(keys, axis=-1)
lexsort()根據(jù)鍵值的字典序進(jìn)行排序,支持對(duì)數(shù)組按指定行或列的順序排序,間接排序,不修改原數(shù)組,返回索引。一般對(duì)一維數(shù)組使用argsort()。
默認(rèn)按最后一行元素有小到大排序, 返回最后一行元素排序后索引所在位置。
參數(shù) | 描述 |
---|---|
'axis' | 數(shù)組排序時(shí)的基準(zhǔn),axis=0,按行排列;axis=1,按列排列 |
'keys' | 排序的參照物包括數(shù)組或包含N維的的元組,默認(rèn)值為最后一行,(如果為二維數(shù)組則指最后一列) |
>>import numpy as np >>x=np.array([[0,12,48],[4,18,14],[7,1,99]]) >>np.lexsort(x) array([1, 0, 2], dtype=int64) #返回索引值 >>a=np.array([1,5,1,4,3,4,4]) >>b=np.array([9,4,0,4,0,2,1]) >>> ind=np.lexsort((b,a)) >>ind #將長(zhǎng)度相同的a,b組合,再根據(jù)a值的大小進(jìn)行排序,再考慮b值 array([2, 0, 4, 6, 5, 3, 1], dtype=int64) >>list(zip(a[ind],b[ind])) [(1, 0), (1, 9), (3, 0), (4, 1), (4, 2), (4, 4), (5, 4)] >>> c=[[1,5,1,4,3,4,4],[9,4,0,4,0,2,1]] >>> np.lexsort(c) # 此種情況與先b后a的情況一致 array([2, 4, 6, 5, 3, 1, 0], dtype=int64) #其他方法 #按最后一列順序排序 >>x[np.lexsort(x.T)] array([[ 4, 18, 14], [ 0, 12, 48], [ 7, 1, 99]]) #按最后一列逆序排序 >>x[np.lexsort(-x.T)] array([[ 7, 1, 99], [ 0, 12, 48], [ 4, 18, 14]]) #按第一列順序排序 >>x[np.lexsort(x[:,::-1].T)] array([[ 0, 12, 48], [ 4, 18, 14], [ 7, 1, 99]]) #按最后一行順序排序 >>x.T[np.lexsort(x)].T array([[12, 0, 48], [18, 4, 14], [ 1, 7, 99]]) #按第一行順序排序 >>x.T[np.lexsort(x[::-1,:])].T array([[ 0, 12, 48], [ 4, 18, 14], [ 7, 1, 99]])
numpy 數(shù)組排序np.sort()、np.argsort()
np.sort(a, axis=-1, kind=‘quicksort', order=None)
將指定軸上的每一個(gè)元素都按照從小到大的順序排列。
Params:
- axis:默認(rèn)是-1,即最大維度,二維數(shù)組就是軸1,三維數(shù)組就是軸2。
- kind:排序規(guī)則,有三個(gè)選項(xiàng),如下,使用默認(rèn)的就好
kind | speed | worst case | work space | stable |
---|---|---|---|---|
‘quicksort’ | 1 | O(n^2) | 0 | no |
‘mergesort’ | 2 | O(n*log(n)) | ~n/2 | yes |
‘heapsort’ | 3 | O(n*log(n)) | 0 | no |
- order:指定排序的規(guī)則。
舉例:
arr = np.array([[7,3,9], [9,0,8]]) np.sort(arr,axis=0) array([[7, 0, 8], [9, 3, 9]])
指定axis=0,把每一列按照從小到大排列。
np.sort(arr,axis=1) array([[3, 7, 9], [0, 8, 9]])
指定axis=1,把每一行按照從小到大排列。
np.argsort(a, axis=-1, kind=‘quicksort', order=None)
返回的是數(shù)組值從小到大排序的索引值。就是把數(shù)組升序排序,然后看看各個(gè)元素在原來(lái)數(shù)組中的索引值,看看排在第一小的數(shù)在原來(lái)數(shù)組的哪個(gè)位置。形狀與傳入數(shù)組相同。
參數(shù)使用同上。
舉例:
這里我們舉一個(gè)簡(jiǎn)單的例子,萬(wàn)變不離其宗。
ind = np.argsort([4,3,5,6,0],axis=0) ind array([4, 1, 0, 2, 3], dtype=int64)
附圖解釋。每個(gè)數(shù)字排序時(shí),它的index也隨著數(shù)值走。最后返回其原來(lái)的index。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python使用描述器實(shí)現(xiàn)ORM模型的方法詳解
這篇文章主要為大家詳細(xì)介紹了Python描述器實(shí)現(xiàn)ORM模型,使用數(shù)據(jù)庫(kù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02python計(jì)算階乘的兩個(gè)函數(shù)用法
這篇文章主要介紹了python計(jì)算階乘的兩個(gè)函數(shù)用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05Selenium鼠標(biāo)與鍵盤(pán)事件常用操作方法示例
這篇文章主要介紹了Selenium鼠標(biāo)與鍵盤(pán)事件常用操作方法,結(jié)合實(shí)例形式分析了Selenium鼠標(biāo)事件與鍵盤(pán)事件常見(jiàn)方法與相關(guān)使用技巧,需要的朋友可以參考下2018-08-08Python3 selenium 實(shí)現(xiàn)QQ群接龍自動(dòng)化功能
這篇文章主要介紹了Python3 selenium 實(shí)現(xiàn)QQ群接龍自動(dòng)化功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04使用python從三個(gè)角度解決josephus問(wèn)題的方法
這篇文章主要介紹了使用python從三個(gè)角度解決josephus問(wèn)題的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03Django點(diǎn)贊的實(shí)現(xiàn)示例
本文主要介紹了Django點(diǎn)贊的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03解決pycharm導(dǎo)入numpy包的和使用時(shí)報(bào)錯(cuò):RuntimeError: The current Numpy ins
這篇文章主要介紹了解決pycharm導(dǎo)入numpy包的和使用時(shí)報(bào)錯(cuò):RuntimeError: The current Numpy installation (‘D:\\python3.6\\lib\\site-packa的問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12