【问题标题】:Numpy argsort strange indices [duplicate]Numpy argsort奇怪的索引[重复]
【发布时间】:2017-01-12 21:07:46
【问题描述】:

第一个输出是正确的。但不知何故,argsort 为第二个数组提供了错误的输出:

>>> np.argsort(np.array([ 0.62678927,  0.36816272,  0.31044763,  0.44873312,  0.3101446 ]))
array([4, 2, 1, 3, 0])

>>> np.argsort(np.array([ 0.36816272,  0.62678927,  0.13509969,  0.54590815,  0.13493432]))
array([4, 2, 0, 3, 1])

在花了 2 个小时之后,我确信这个问题要么太琐碎,要么太技术化。 我正在使用 Anaconda 虚拟环境,并使用 numpy 1.11.3 和 1.10.4 对其进行了测试

【问题讨论】:

  • 到底是什么问题?输出正确为 0.13493432
  • 但结果似乎是正确的,你期待什么?
  • 感谢您的回复。但我期待第二个命令返回[2, 4, 1, 3, 0]。由于 0.6 是最大的,它应该有一个数字 4 与之关联。我错过了什么?
  • 但这将是数组排序后的索引,但argsort 返回“对数组进行排序的索引”(来源:argsort documentation
  • 另请注意,您的预期结果与np.argsort 输出的倒数完全相反;也就是说,你可以通过s = np.argsort(a)s_inv = np.empty(5)s_inv[s] = np.arange(5)得到你想要的结果。因此很不幸,在您的第一种情况下,s[s] 恰好是 np.arange(5)

标签: python numpy


【解决方案1】:

您似乎认为np.argsort(x) 返回一个数组,这样np.argsort(x)[i] 就是x[i] 按排序顺序排列的位置。这不是它的工作原理。

np.argsort(x) 返回一个数组,使得x[np.argsort(x)[i]] 按排序顺序进入位置i。这会产生这样的效果

x[np.argsort(x)]

等价于

np.sort(x)

这恰好会产生与您对第一个数组的预期行为相同的结果,但不会对第二个数组产生相同的结果。

【讨论】:

    猜你喜欢
    • 2019-08-06
    • 2018-08-09
    • 1970-01-01
    • 2015-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多