使用numpy.argsort()会给出错误的数组索引
我是numpy的新手,所以我可能错过了一些令人讨厌的东西 下面的小使用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]
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()函数显然是正确的,并且已经工作了几年,所以问题更多的是解释。现在看来,你对结果的解释不同,因此认为它是错误的。然而,为了在这里帮助您,我们需要知道您会期望什么(请在问题中加入您的评论!)以及为什么您会期望这样。