簡體   English   中英

Numpy 按降序對二維數組進行排序並從每行中取前 N

[英]Numpy sorting 2d array by descending and take first N from each row

這里有一個原始的二維數組

in_arr = np.array([[20,0,10,40,30], [50,40,60,90,80]])

# original array
# [[20,  0, 10, 40, 30],
#  [50, 40, 60, 90, 80]]

我需要按降序和按行對數組進行排序,因此,我使用 numpy.argsort(axis=1) 和 output 排序索引

out_arr1 = np.argsort(in_arr, axis = 1)[:,::-1]
>>> array([[3, 4, 0, 2, 1],
          [3, 4, 2, 0, 1]])

然后,我需要從每個數組行中提取前 3 個最大的數字,樣本所需的 output 如下:

# first 3 largest number from each row
# [[40,30,20],
#  [90,80,60]]

我努力了幾個小時試圖找出正確的解決方案,但仍然不知道我該怎么做,在這里想尋求幫助。 您的寶貴時間和建議將不勝感激。 謝謝!

使用numpy.argsort()返回排序數組的索引數組。 因此,您的out_arr1讓您知道的是每一行的哪個位置可以找到最高值。

如果您要繼續這種方式,您需要對 in_arr 中的每一行(在此寫為in_arr[i] )取 out_arr1[ out_arr1[i] ] 中前 3 個索引處的值。

這意味着out_arr1[i, 0]告訴您第i行的 in_arr 中的最大值所在的位置。 在我們的例子中, out_arr1[0, 0] = 3 ,這意味着第 0 行的最大值是 40(在索引 3 上)

這樣做,每行上最大的 3 個數字由out_arr1[0, 0]out_arr1[0, 1]out_arr1[0, 2]out_arr1[1, 0]out_arr1[1, 1]out_arr1[1, 2]

要獲得所需的 output,我們需要以下內容:

final_arr = numpy.array([in_arr[0, out_arr1[0, 0], in_arr[0, out_arr1[0, 1], in_arr[0, out_arr1[0, 2], in_arr[1, out_arr1[1, 0], in_arr[1, out_arr1[1, 1], in_arr[1, out_arr1[1, 2]])

然而,這並不優雅,還有另一種更簡單的解決方案來解決您的問題。

使用numpy.sort()而不是numpy.argsort()我們可以返回沿軸排序的in_arr的確切值。 通過這樣做,我們不再需要使用 output 索引來查找我們的 3 個最高值,因為它們是我們新 output 中的前 3 個。

out_arr2視為numpy.sort()中的 output ,最終數組將如下所示:

final_arr = numpy.array([[out_arr[0, 0], out_arr[0, 1], out_arr[0, 2]], [out_arr[1, 0], out_arr[1, 1], out_arr[1, 2]]])

基於這個this answer你可以做這樣的事情

np.array(list(map(lambda x, y: y[x], np.argsort(in_arr), in_arr)))[:,::-1][:,:3]

這使

array([[40, 30, 20],
       [90, 80, 60]])

您可以首先使用 sorted 使用列表推導對輸入數組中的所有行進行sorted 然后提取行的最后 3 個數字。

in_arr = np.array([[20,0,10,40,30], [50,40,60,90,80]])

output = []
for i in [sorted(row) for row in in_arr]:
    output.append(i[-3:][::-1])
    
print(output)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM