使用numpy.argsort()会给出错误的数组索引

使用numpy.argsort()会给出错误的数组索引,numpy,Numpy,我是numpy的新手,所以我可能错过了一些令人讨厌的东西 下面的小argsort()测试脚本给出了奇怪的结果。有什么方向吗 import numpy as np a = np.array([[3, 5, 6, 4, 1] , [2, 7 ,4 ,1 , 2] , [8, 6, 7, 2, 1]]) print a print a.argsort(axis=0) print a.argsort(axis=1) 输出: [[3 5 6 4 1] [2 7 4 1 2] [8 6 7 2 1]

我是numpy的新手,所以我可能错过了一些令人讨厌的东西

下面的小
argsort()
测试脚本给出了奇怪的结果。有什么方向吗

import numpy as np

a = np.array([[3, 5, 6, 4, 1] , [2, 7 ,4 ,1 , 2] , [8, 6, 7, 2, 1]])
print a
print a.argsort(axis=0)
print a.argsort(axis=1)
输出:

[[3 5 6 4 1]
 [2 7 4 1 2]
 [8 6 7 2 1]]
[[1 0 1 1 0]   # bad 4th & 5th columns ?
 [0 2 0 2 2]
 [2 1 2 0 1]]
[[4 0 3 1 2]   # what's going on here ?
 [3 0 4 2 1]
 [4 3 1 2 0]]

正如其他人指出的那样,此方法工作正常,因此为了提供答案,这里将解释
.argsort()
的工作原理
a.argsort
返回将沿指定轴对数组进行排序的索引(不是值)

在你的例子中

a = np.array([[3, 5, 6, 4, 1] , [2, 7 ,4 ,1 , 2] , [8, 6, 7, 2, 1]])
print a
print a.argsort(axis=0)
返回

[[3 5 6 4 1]
 [2 7 4 1 2]
 [8 6 7 2 1]]
[[1 0 1 1 0]
 [0 2 0 2 2]
 [2 1 2 0 1]]
因为一直

[[3 ...
[2 ...
[8 ...
2
是最小的值。因此,当前索引2(即
0
)在
argsort()
返回的矩阵中沿该轴占据第一个位置。第二个最小值是索引
0
处的
3
,因此返回矩阵中沿该轴的第二个位置将是
0
。最后,最大的元素是
2
,它出现在沿0轴的索引
2
处,因此返回矩阵的最后一个元素将是
2
。因此:

[[1 ...
[0 ...
[2 ...
沿轴0的其他4个序列重复相同的过程:

 [[...5 ...]                     [[...0 ...]
 [...7 ...]    becomes ---->     [... 2 ...]
 [...6 ...]]                     [... 1 ...]]

 [[...6 ...]                     [[...1 ...]
 [...4 ...]    becomes ---->     [... 0 ...]
 [...7 ...]]                     [... 2 ...]]

 [[...4 ...]                     [[...1 ...]
 [...1 ...]    becomes ---->     [... 2 ...]
 [...2 ...]]                     [... 0 ...]]

 [[...1]                     [[...0]
 [...2]    becomes ---->     [... 2]
 [...1]]                     [... 1]]
将轴从0更改为1,将导致沿第1轴的顺序应用相同的过程:

[[3 5 6 4 1  becomes ----> [[4 0 3 1 2
同样,因为最小的元素是
1
,它位于索引
4
,然后
3
位于索引
0
,然后
4
位于索引
3
5
位于索引
1
,最后
6
在索引
2
处最大

如前所述,此过程在每个

[2 7 4 1 2]     ---->   [3 0 4 2 1]
[8 6 7 2 1]     ---->   [4 3 1 2 0]
给予

[[4 0 3 1 2]  
[3 0 4 2 1]
[4 3 1 2 0]]

那些
“糟糕的第四列和第五列”
?@eyalasko结果是正确的换句话说-你期望的是什么以及为什么?正如
np.argsort
上的文档所述:
“返回将对数组排序的索引。”
。因此,
argsort
为我们提供了索引,当索引到输入中时,这些索引将为我们提供已排序的版本。由于numpy.argsort()函数显然是正确的,并且已经工作了几年,所以问题更多的是解释。现在看来,你对结果的解释不同,因此认为它是错误的。然而,为了在这里帮助您,我们需要知道您会期望什么(请在问题中加入您的评论!)以及为什么您会期望这样。