无法弄清楚如何使用 argsort 在一个数组上创建索引并使用它对另一个数组进行排序

我有一个数组ranks,我想按列排序。我想使用那种索引来重新排列具有相同维度的数组,称为unsorted. 然后我想选择未排序的前 2 行。


这是我到目前为止不起作用的示例:


import numpy as np


ranks = np.random.uniform(0,1,(10,5))

unsorted = np.random.uniform(0,1,(10,5))


ind = np.argsort(ranks,axis = 1)

sorted = unsorted[ind]

sorted = sorted[0:2,:]

速度也是一个问题,因为它将应用于大型阵列 (50,000 x 5,000)。


一只萌萌小番薯
浏览 153回答 1
1回答

慕容708150

首先确保我们知道如何argsort申请ranks:In [222]: ranks = np.random.randint(0,10,(4,5))      ...: unsorted = np.random.randint(0,10,(4,5))      ...:       ...: ind = np.argsort(ranks,axis = 1)                                                           In [223]: ranks                                                                                      Out[223]: array([[5, 9, 4, 8, 6],       [8, 6, 7, 3, 1],       [1, 2, 3, 4, 8],       [6, 0, 0, 5, 0]])In [224]: ind                                                                                        Out[224]: array([[2, 0, 4, 3, 1],       [4, 3, 1, 2, 0],       [0, 1, 2, 3, 4],       [1, 2, 4, 3, 0]])In [225]: np.take_along_axis(ranks, ind, axis=1)                                                     Out[225]: array([[4, 5, 6, 8, 9],       [1, 3, 6, 7, 8],       [1, 2, 3, 4, 8],       [0, 0, 0, 5, 6]])这里每一行都是有序的。pre-take_along 方法(仍然可以正常工作)是:In [226]: ranks[np.arange(4)[:,None], ind]                                                           Out[226]: array([[4, 5, 6, 8, 9],       [1, 3, 6, 7, 8],       [1, 2, 3, 4, 8],       [0, 0, 0, 5, 6]])显然我们可以将其应用于unsorted,尽管我知道您所说的 top 是什么意思two rows。two rows[226]是什么?对二维数组进行排序很棘手;很难想象正在发生的事情。我更改了您的示例以使用整数和小形状来更好地可视化操作。unsorted[ind]是不正确的。 ind在本例中,值为 0...4,即列数。它不能用于索引第一个维度(行)。在我的简化示例中,4 太大了。您的示例运行,但形状为 off (10,5,5)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python