Python Numpy按降序对2d数组排序,并从每行中取第一个N

Python Numpy按降序对2d数组排序,并从每行中取第一个N,python,arrays,numpy,sorting,Python,Arrays,Numpy,Sorting,这里有一个原始的2D数组 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.argsortaxis=1,并输出我得到的排序索引 out_arr1 = np.argsort(in_arr, axis = 1)[:,::-1] >>&g

这里有一个原始的2D数组

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.argsortaxis=1,并输出我得到的排序索引

out_arr1 = np.argsort(in_arr, axis = 1)[:,::-1]
>>> array([[3, 4, 0, 2, 1],
          [3, 4, 2, 0, 1]])
然后,我需要从每个数组行中提取前3个最大数,所需的样本输出如下:

# first 3 largest number from each row
# [[40,30,20],
#  [90,80,60]]
我已经挣扎了几个小时,试图找出正确的解决办法,但仍然不知道该怎么办,在这里想寻求帮助。非常感谢您宝贵的时间和建议。谢谢大家!

基于此,您可以这样做

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

array([[40, 30, 20],
       [90, 80, 60]])
基于此,你可以做这样的事情

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对输入数组中的所有行进行列表排序。然后提取行的最后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)

您可以首先使用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)
使用numpy.argsort返回排序数组的索引数组。因此,out_arr1让您知道的是在每行的哪里可以找到最高值

如果您要继续这样做,您需要做的是,对于在此以in_arr[i]形式写入的in_arr中的每一行,获取在in_arr1[i]中的前3个索引处找到的值

这意味着out_arr1[i,0]告诉您第i行in_arr中的最高值在哪里。在我们的例子中,out_arr1[0,0]=3,这意味着第0行的最大值是索引3上的40

这样,每行上的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]表示

为了获得所需的输出,我们需要以下几点:

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的精确值。通过这样做,我们不再需要使用输出索引来查找我们的3个最高值,因为它们是新输出中的前3个

将out_arr2作为numpy.sort的输出,最终的数组如下所示:

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]]])
使用numpy.argsort返回排序数组的索引数组。因此,out_arr1让您知道的是在每行的哪里可以找到最高值

如果您要继续这样做,您需要做的是,对于在此以in_arr[i]形式写入的in_arr中的每一行,获取在in_arr1[i]中的前3个索引处找到的值

这意味着out_arr1[i,0]告诉您第i行in_arr中的最高值在哪里。在我们的例子中,out_arr1[0,0]=3,这意味着第0行的最大值是索引3上的40

这样,每行上的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]表示

为了获得所需的输出,我们需要以下几点:

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的精确值。通过这样做,我们不再需要使用输出索引来查找我们的3个最高值,因为它们是新输出中的前3个

将out_arr2作为numpy.sort的输出,最终的数组如下所示:

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]]])

您好,甘库巴斯和斯特凡,非常感谢您的帮助,您的建议和解释是非常清楚的,我已经尝试了两种方法,都是有效的!在此之前,我自己的解决方案是混乱的,现在我从你们那里得到了改进它的想法,非常感谢!很高兴能帮忙。顺便说一句,如果你发现这里的一个解决方案更适合你的问题,你可以也应该将其标记为公认的答案。Hi Gankubas和Stefan,非常感谢你的帮助,你的建议和解释非常清楚,我已经尝试了两种方法,都很有效!在此之前,我自己的解决方案是混乱的,现在我从你们那里得到了改进它的想法,非常感谢!很高兴能帮忙。顺便说一句,如果你发现这里的一个解决方案更适合你的问题,你可以而且应该把它标记为公认的答案。你的建议很简单也很好!非常好用,非常感谢你的帮助!嗨@Stefan,你的建议很简单很好!非常好用,非常感谢你的帮助!您好@Stefan,再次感谢您的时间和建议的解决方案,虽然我不确定您是否与另一个名为Stefan的帐户是同一个人,但我非常感谢您的帮助。我确实尝试过这个解决方案,它对我也有效!非常感谢你@不客气。如果您的问题已经解决,并且您对解决方案感到满意,请接受本threadHi@Stefan中给出的解决方案之一,再次感谢您的时间和建议的解决方案,尽管我不确定您是否与另一个名为Stefan的帐户是同一个人,但我非常感谢您的支持
帮助我确实尝试过这个解决方案,它对我也有效!非常感谢你@不客气。如果您的问题已经解决,并且您对解决方案感到满意,请接受本线程中提出的给定解决方案之一