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