numpy中np.sort返回索引的具體使用
一、np.sort函數(shù)返回索引的基本語法
numpy中的np.sort函數(shù)可以將數(shù)組按照從小到大的順序進(jìn)行排序,并且可以通過指定axis參數(shù)指定排序的維度,如果指定axis=None,則會將整個數(shù)組展平后排序。這里我們主要討論np.sort函數(shù)的返回值,也就是返回的排序后元素的原下標(biāo),返回的類型是ndarray,數(shù)據(jù)類型是int。
import numpy as np a = np.array([3, 1, 2]) print(np.sort(a)) ? ? ? ? ? # 輸出 [1, 2, 3] print(np.argsort(a)) ? ? ? ?# 輸出 [1, 2, 0] print(a[np.argsort(a)]) ? ?# 輸出 [1, 2, 3]
在上面的例子中,我們定義了一個一維數(shù)組a = [3, 1, 2]。通過np.sort函數(shù)對a進(jìn)行排序,輸出的結(jié)果是[1, 2, 3]。通過調(diào)用np.argsort函數(shù),我們可以得到排序后的每個元素對應(yīng)的原下標(biāo),即[1, 2, 0]。這個數(shù)組的意義是第一個元素1在原數(shù)組中的下標(biāo)是1,第二個元素2在原數(shù)組中的下標(biāo)是2,第三個元素3在原數(shù)組中的下標(biāo)是0。接著我們通過數(shù)組下標(biāo)操作,可以得到排好序的數(shù)組a。
二、np.sort函數(shù)返回索引的特殊用法
在有些情況下,我們需要按照某個方向的順序?qū)Χ嗑S數(shù)組進(jìn)行排序,比如對一個2維數(shù)組按照每行的最大值排序。這時候我們可以通過指定axis參數(shù)來控制排序維度。但是np.sort函數(shù)返回的是經(jīng)過展平后的下標(biāo)數(shù)組,我們需要重新構(gòu)造原數(shù)組。
import numpy as np a = np.array([[3, 1], [2, 0]]) print(np.argsort(a, axis=1)) ? ?# 輸出 [[1, 0], [1, 0]] print(np.unravel_index(np.argsort(a, axis=None), a.shape)) ? ?# 輸出 (array([1, 0, 0, 1]), array([0, 1, 0, 1])) print(a[np.unravel_index(np.argsort(a, axis=None), a.shape)]) ? ?# 輸出 [0, 1, 2, 3] # 對每行進(jìn)行排序 print(a[np.arange(a.shape[0])[:, None], np.argsort(a, axis=1)]) # 輸出 [[1 3] # ? ? ?[0 2]]
在上面的例子中,我們定義了一個2維數(shù)組a = [[3, 1], [2, 0]]。通過np.argsort函數(shù)指定axis=1,表示按照行的方向進(jìn)行排序,輸出的結(jié)果是[[1, 0], [1, 0]]。我們需要使用np.unravel_index函數(shù)把一維的下標(biāo)數(shù)組轉(zhuǎn)化成原數(shù)組的下標(biāo)形式,即輸出(重復(fù)兩遍是因為a是2維的):(array([1, 0, 0, 1]), array([0, 1, 0, 1]))。接著我們通過數(shù)組下標(biāo)操作,可以得到排好序的數(shù)組a,輸出[0, 1, 2, 3]。這個數(shù)組的意義是原數(shù)組的第二行第一個元素,在排好序后的數(shù)組中的位置是0,以此類推。
最后我們可以使用切片和numpy的廣播技巧,對每一行進(jìn)行排序,輸出的結(jié)果是[[1, 3], [0, 2]],也就是每一行排好序的新數(shù)組。
三、避免在函數(shù)參數(shù)中使用np.sort函數(shù)返回索引
在使用np.sort函數(shù)返回索引時,有時候我們會在一些函數(shù)中作為參數(shù)傳遞,很容易出現(xiàn)錯誤和難以調(diào)試。這個時候我們可以使用np.take_along_axis函數(shù)來代替這個過程。
import numpy as np a = np.array([[3, 1], [2, 0]]) print(np.sort(a, axis=1)) ? ? ?# 經(jīng)過排序后的數(shù)組 print(np.take_along_axis(a, np.argsort(a, axis=1), axis=1)) ? ?# 與上面相同的結(jié)果
在上面的例子中,我們有一個2維數(shù)組a = [[3, 1], [2, 0]],通過np.argsort函數(shù)指定axis=1,表示按照行的方向進(jìn)行排序。我們先輸出經(jīng)過排序后的數(shù)組。接下來我們使用np.take_along_axis函數(shù),第一個參數(shù)是原數(shù)組a,第二個參數(shù)是經(jīng)過排序后的下標(biāo)數(shù)組。這個函數(shù)會返回按照排序后的下標(biāo)數(shù)組重新構(gòu)造的數(shù)組。
四、總結(jié)
本文主要介紹了使用numpy中np.sort函數(shù)返回索引的詳細(xì)解釋和使用方法,包括基本語法、特殊用法以及避免在函數(shù)參數(shù)中使用np.sort函數(shù)返回索引。使用np.sort函數(shù)返回的下標(biāo)數(shù)組在多維數(shù)組排序時特別有用,需要特別注意在使用過程中的問題和陷阱。
到此這篇關(guān)于numpy中np.sort返回索引的具體使用的文章就介紹到這了,更多相關(guān)numpy np.sort返回索引內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
flask 使用 flask_apscheduler 做定時循環(huán)任務(wù)的實現(xiàn)
這篇文章主要介紹了flask 使用 flask_apscheduler 做定時循環(huán)任務(wù)的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12
Django model重寫save方法及update踩坑詳解
這篇文章主要介紹了Django model重寫save方法及update踩坑詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-07-07
Python中使用裝飾器和元編程實現(xiàn)結(jié)構(gòu)體類實例
Python中使用裝飾器和元編程實現(xiàn)結(jié)構(gòu)體類實例,本文的方法算是一種Python的黑魔法技術(shù),并非Python的常規(guī)寫法,需要的朋友可以參考下2015-01-01
Python實現(xiàn)的對本地host127.0.0.1主機(jī)進(jìn)行掃描端口功能示例
這篇文章主要介紹了Python實現(xiàn)的對本地host127.0.0.1主機(jī)進(jìn)行掃描端口功能,可實現(xiàn)掃描本機(jī)開放端口的功能,涉及Python socket模塊與Thread多線程模塊相關(guān)使用技巧,需要的朋友可以參考下2019-02-02
NumPy中數(shù)組的拼接(Concatenation)的使用
數(shù)組拼接是指將多個形狀兼容的數(shù)組,本文就來詳細(xì)的介紹一下NumPy中數(shù)組的拼接(Concatenation)的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2026-04-04
Python之numpy.random.seed()和numpy.random.RandomState()區(qū)別及說明
這篇文章主要介紹了Python之numpy.random.seed()和numpy.random.RandomState()區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2017-10-10
Python?自動控制原理?control的詳細(xì)解說
這篇文章主要介紹了Python自動控制原理control的詳細(xì)解說,文章圍繞主題展開對Python?control的介紹,具有一定的參考價值,需要的朋友可以參考一下2022-07-07
Python實現(xiàn)蟻群優(yōu)化算法的示例代碼
蟻群算法是一種源于大自然生物世界的新的仿生進(jìn)化算法,本文主要介紹了Python如何實現(xiàn)蟻群算法,文中通過示例代碼具有一定的參考價值,感興趣的小伙伴們可以了解一下2023-08-08

