[英]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.