np.argsort()的输出奇怪/错误

时间:2018-12-25 16:17:59

标签: python numpy

我正在使用numpy和argsort,同时遇到argsort的奇怪(?)行为:

>>> array = [[0, 1, 2, 3, 4, 5], 
             [444, 4, 8, 3, 1, 10], 
             [2, 5, 8, 999, 1, 4]]
>>> np.argsort(array, axis=0)

array([[0, 0, 0, 0, 1, 2],
       [2, 1, 1, 1, 2, 0],
       [1, 2, 2, 2, 0, 1]], dtype=int64)

每个列表的前4个值对我来说都很清楚-argsort做对了。但是最后2个值非常令人困惑,因为这有点将值排序错误。
argsort的输出不应该是:

array([[0, 0, 0, 0, 2, 1],
       [2, 1, 1, 1, 0, 2],
       [1, 2, 2, 2, 1, 0]], dtype=int64)

2 个答案:

答案 0 :(得分:3)

我认为问题在于您认为argsort正在输出什么。让我们关注一个更简单的一维示例:

 arr = np.array([5, 10, 4])

np.argsort的结果将是原始数组的索引,以对元素进行排序:

[2, 0, 1]

让我们看看实际的排序值是什么,以了解原因:

[
     4,  # at index 2 in the original array
     5,  # at index 0 in the original array
    10,  # at index 1 in the original array
]

似乎您在想象逆运算,其中argsort会告诉您每个元素将移至输出中的哪个索引。您可以通过将argsort应用于argsort的结果来获得这些索引。

答案 1 :(得分:0)

输出是正确的,问题是np.argsort与axis = 0,实际上是在比较第一个axis元素的每个元素。所以,对于数组

array = [[0, 1, 2, 3, 4, 5], 
...      [444, 4, 8, 3, 1, 10], 
...      [2, 5, 8, 999, 1, 4]]

axis = 0,比较元素(0,444,2),(1,4,8),(2,8,8),(3,3,999),(4,1,1),( 5,10,4),这样它就将索引数组指定为:

np.argsort(array, axis=0)
array([[0, 0, 0, 0, 1, 2],
       [2, 1, 1, 1, 2, 0],
       [1, 2, 2, 2, 0, 1]])

因此,对于您的问题,最后两个值来自元素(4,1,1),这些元素将数组索引值设为(1,2,0),而对于(5,10,4)给出(2,0,1)。

请参阅:np.argsort