3

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

2 回答 2

4

我认为问题在于您认为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
]

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

于 2018-12-25T16:45:14.053 回答
0

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

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]])

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

参考这个:np.argsort

于 2018-12-25T16:33:01.127 回答