python - 对数组进行排序并将索引追溯到其排序顺序

标签 python arrays numpy matrix

我正在尝试对这个数组进行排序,

[[15 12 10 8 7]
[7 8 4 3 1]
[8 5 9 12 4]
[6 10 14 7 5]] 

[[5 4 3 2 1]
[4 5 3 2 1]
[3 2 4 5 1]
[2 4 5 3 1]]

我尝试使用 nm.argsort(a, axis=1) 但这没有给出所需的输出,可能是我使用不正确。相同的操作将应用于第二个数组,但在列级别。任何帮助,将不胜感激。谢谢。

最佳答案

您似乎正在尝试追溯排序顺序中的元素位置。

方法#1:一种方法是使用 argsort 两次,如下所示 -

a.argsort(1).argsort(1)+1

方法#2:this post 启发的有效方法-

def argsort_unique2D(idx):
    m,n = idx.shape
    sidx = np.empty((m,n),dtype=int)
    sidx[np.arange(m)[:,None], idx] = np.arange(n)
    return sidx

out = argsort_unique2D(a.argsort(1))+1

示例运行 -

In [42]: a
Out[42]: 
array([[15, 12, 10,  8,  7],
       [ 7,  8,  4,  3,  1],
       [ 8,  5,  9, 12,  4],
       [ 6, 10, 14,  7,  5]])

In [43]: a.argsort(1).argsort(1)+1
Out[43]: 
array([[5, 4, 3, 2, 1],
       [4, 5, 3, 2, 1],
       [3, 2, 4, 5, 1],
       [2, 4, 5, 3, 1]])

In [71]: argsort_unique2D(a.argsort(1))+1
Out[71]: 
array([[5, 4, 3, 2, 1],
       [4, 5, 3, 2, 1],
       [3, 2, 4, 5, 1],
       [2, 4, 5, 3, 1]])

运行时测试 -

In [76]: a = np.random.rand(100,10000)

In [77]: %timeit a.argsort(1).argsort(1)+1
10 loops, best of 3: 115 ms per loop

In [78]: %timeit argsort_unique2D(a.argsort(1))+1
10 loops, best of 3: 67.8 ms per loop

关于python - 对数组进行排序并将索引追溯到其排序顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46202732/

相关文章:

java - 通过数组传递不确定数量的 Int

arrays - 如何正确优化 MArray 函数以提高速度?

javascript - 如何使用 jQuery 访问多级对象数据

python - 二维数组 python 上的最小值

python - numpy代码中的溢出错误

python - 如何在 numpy 数组中的 XYZ 位置插入 csv 文件中的浮点值

python - 无法使用 multiprocessing.Process() Python 交换对象/超时子进程

python - 在 80x60 RGB 像素阵列上优化生命游戏迭代

python - 将 mayavi mlab.contour3d 图转换为 vtkPolyData

python - 使用固定宽度的行编写/解析文本文件