我正在使用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)
答案 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