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

时间:2017-05-31 13:21:40

标签: 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]]
[[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]]

1 个答案:

答案 0 :(得分: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()返回的矩阵中沿该轴处于第一个位置。第二个最小值是在索引3处的0,因此在返回的矩阵中沿该轴的第二个位置将是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,导致沿着第一个轴上的序列应用相同的过程:

[[3 5 6 4 1  becomes ----> [[4 0 3 1 2
再次

因为最小的元素是1,它在索引4,然后是3在索引0,然后是4在索引{{1} },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]