numpy多級(jí)排序lexsort函數(shù)的使用
1、lexsort() 排的是個(gè)啥
lexsort() 函數(shù)的定義如下:
def lexsort(keys, axis=None)
lexsort是一種多級(jí)排序方法。作用為對(duì)給定的 keys 中的最后一個(gè) key 排序,每一個(gè) key 都被認(rèn)為是列向量,其他 keys 用來輔助最后一個(gè) key 進(jìn)行排序。最后返回最后一個(gè) key 進(jìn)行排序的索引。
哈哈哈是不是沒看懂上面的解釋?莫慌莫慌,我給舉個(gè)簡(jiǎn)單的例子保證秒懂,可以回想這樣一個(gè)場(chǎng)景:
對(duì)一堆學(xué)生的成績(jī)進(jìn)行排名,則排名結(jié)果就是按照總成績(jī)從低到高排序,這個(gè)還沒排序的總成績(jī)表就是上述說的最后一個(gè) key ,排序后的索引就是上述的返回值。
比如初始總成績(jī)數(shù)組為:[99, 100, 98, 95, 80] ,這就是 最后一個(gè) key,升序排序后的數(shù)組為:[80, 95, 98, 99, 100],對(duì)應(yīng)的索引為:[4, 3, 2, 0, 1],這個(gè)索引數(shù)組就是 lexsort 函數(shù)的返回值。
但是如果兩個(gè)人的總成績(jī)一樣怎么進(jìn)一步排序呢?這時(shí)可以按照語文成績(jī)的升序進(jìn)行排序,如果語文成績(jī)還一樣呢?那再看數(shù)學(xué)成績(jī),如果數(shù)學(xué)還一樣呢?再查英語成績(jī),如果還。。。(沒了沒了,再相同我就要懷疑這倆人作弊了?。┻@里的 語文成績(jī)、數(shù)學(xué)成績(jī)、英語成績(jī) 就是最后一個(gè) key 前面的 keys,記得是從后往前數(shù)的。也就是最后一個(gè) key 相同,就看倒數(shù)第二個(gè) key,倒數(shù)第二個(gè)相同就看倒數(shù)第三個(gè) key。
2、舉個(gè)例子
默認(rèn)你已經(jīng)理解了,那就舉一個(gè)例子來過一遍:
import numpy as np a = [[3, 3, 8], [6, 9, 7], [3, 3, 2]] b = np.array(a) # 轉(zhuǎn)換為 numpy 數(shù)組 """ index = np.lexsort((b[:, 2], b[:, 1], b[:, 0])) 的運(yùn)行情況: step-1、首先按照第一列 b[:, 0] 的數(shù)值 [3, 6, 3] 升序順序?qū)γ啃械奈恢眠M(jìn)行重排, 第一行有兩個(gè)值相同, 轉(zhuǎn)到step-2 [[3, 3, 8], [[3, 3, 8], [6, 9, 7], --> [3, 3, 2], [3, 3, 2]] [6, 9, 7]] step-2、第一列數(shù)值相同的情況下按照相應(yīng)位置第二列 b[:, 1] 的值繼續(xù)排序, 第二列對(duì)應(yīng)位置任然相同, 轉(zhuǎn)到step-3 [[3, 3, 8], [[3, 3, 8], [6, 9, 7], --> [3, 3, 2], [3, 3, 2]] [6, 9, 7]] step-3、第二列數(shù)值相同的情況下按照相應(yīng)位置第三列 b[:, 2] 的值繼續(xù)排序 [[3, 3, 8], [[3, 3, 2], [6, 9, 7], --> [3, 3, 8], [3, 3, 2]] [6, 9, 7]] 總結(jié): 第一列的排序結(jié)果為[3, 3, 6] 對(duì)應(yīng)的索引值為 [2, 0, 1] """ index = np.lexsort((b[:, 2], b[:, 1], b[:, 0])) print(index) # 輸出結(jié)果: [2 0 1] ans = b[index] # 按照排序結(jié)果重置數(shù)組元素的位置 print(ans) # ans 的結(jié)果: [[3 3 2] [3 3 8] [6 9 7]]
如果直接對(duì)矩陣進(jìn)行排序呢?
""" 相當(dāng)于拆解為 key1 = b[0,:] key2 = b[1,:] key3 = b[2,:] # 最后一行為主排序序列 index = np.lexsort(b) 等效為: index = np.lexsort((b[0,:], b[1,:], b[2,:])) """ index = np.lexsort(b) print(index) # 輸出結(jié)果: [2 0 1]
即,當(dāng)輸入是一個(gè)矩陣時(shí),默認(rèn)排序最后一行的數(shù)據(jù),前面的行都是輔助行。
到此這篇關(guān)于numpy多級(jí)排序lexsort函數(shù)的使用的文章就介紹到這了,更多相關(guān)numpy lexsort函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python?異步之如何啟動(dòng)獲取事件循環(huán)
這篇文章主要為大家介紹了Python?異步之如何啟動(dòng)獲取事件循環(huán)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03Windows 8.1 64bit下搭建 Scrapy 0.22 環(huán)境
這篇文章主要介紹了Windows 8.1 64bit下搭建 Scrapy 0.22 環(huán)境,需要的朋友可以參考下2018-11-11使用python 3實(shí)現(xiàn)發(fā)送郵件功能
本文通過實(shí)例代碼給大家介紹了使用python 3實(shí)現(xiàn)發(fā)送郵件功能,代碼簡(jiǎn)單易懂非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-06-06Python數(shù)據(jù)清洗&預(yù)處理入門教程
凡事預(yù)則立,不預(yù)則廢,訓(xùn)練機(jī)器學(xué)習(xí)模型也是如此。數(shù)據(jù)清洗和預(yù)處理是模型訓(xùn)練之前的必要過程,否則模型可能就廢了。本文是一個(gè)初學(xué)者指南,將帶你領(lǐng)略如何在任意的數(shù)據(jù)集上,針對(duì)任意一個(gè)機(jī)器學(xué)習(xí)模型,完成數(shù)據(jù)預(yù)處理工作2022-10-10Python導(dǎo)入引用其他文件的函數(shù)實(shí)戰(zhàn)案例(推薦!)
這篇文章主要給大家介紹了關(guān)于Python導(dǎo)入引用其他文件的函數(shù)的相關(guān)資料,文中通過代碼以及圖文介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Python具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2024-01-01Python編程實(shí)現(xiàn)控制cmd命令行顯示顏色的方法示例
這篇文章主要介紹了Python編程實(shí)現(xiàn)控制cmd命令行顯示顏色的方法,結(jié)合實(shí)例形式分析了Python針對(duì)命令行字符串顯示顏色屬性相關(guān)操作技巧,需要的朋友可以參考下2017-08-08