繁体   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