【问题标题】:Why doesn't a negative array work to reverse numpy.argsort()?为什么负数组不能反转 numpy.argsort()?
【发布时间】:2017-03-09 01:02:59
【问题描述】:

我有一个名为“子集”的二维 numpy 数组:

array([[  0.00000000e+00,   2.46951219e-03,   4.93902439e-03],
       [             inf,   4.04938272e+02,   2.02469136e+02],
       [  1.77635684e-14,   4.49872050e+01,   1.05094837e+01],
       [  4.33257766e-16,   1.09724890e+00,   2.56328871e-01],
       [  4.85082380e-32,   3.11123702e-01,   1.69792239e-02]])

我正在尝试按 降序 顺序按数组 2(第 3 个数组)排序。以下适用于升序顺序:

>>> subset[:,subset[2,:].argsort()]
array([[  0.00000000e+00,   4.93902439e-03,   2.46951219e-03],
       [             inf,   2.02469136e+02,   4.04938272e+02],
       [  1.77635684e-14,   1.05094837e+01,   4.49872050e+01],
       [  4.33257766e-16,   2.56328871e-01,   1.09724890e+00],
       [  4.85082380e-32,   1.69792239e-02,   3.11123702e-01]])

如您所见,第三个数组按升序排序,其他行以相同方式排序,保留预期的列。

但是当我尝试通过对负数组执行相同的操作来反转这种排序时(认为它应该产生先前结果的镜像),它并没有按预期工作。

>>> subset[:,-subset[2,:].argsort()]
array([[  0.00000000e+00,   2.46951219e-03,   4.93902439e-03],
       [             inf,   4.04938272e+02,   2.02469136e+02],
       [  1.77635684e-14,   4.49872050e+01,   1.05094837e+01],
       [  4.33257766e-16,   1.09724890e+00,   2.56328871e-01],
       [  4.85082380e-32,   3.11123702e-01,   1.69792239e-02]])

为什么这不起作用?

【问题讨论】:

  • 运算符优先级?
  • -subset[2,:].argsort() 表示 -(subset[2,:].argsort()) 不是 (-subset[2,:]).argsort()

标签: arrays sorting numpy reverse


【解决方案1】:

它不起作用的原因当然是运算符优先级。一对括号,它会做你想做的事:

subset[:,(-subset[2,:]).argsort()]
# array([[  2.46951219e-03,   4.93902439e-03,   0.00000000e+00],
#        [  4.04938272e+02,   2.02469136e+02,              inf],
#        [  4.49872050e+01,   1.05094837e+01,   1.77635684e-14],
#        [  1.09724890e+00,   2.56328871e-01,   4.33257766e-16],
#        [  3.11123702e-01,   1.69792239e-02,   4.85082380e-32]])

但请注意,简单的反转通常更快:

timeit(lambda: subset[:,(-subset[2,:]).argsort()])
# 2.9420917620009277
timeit(lambda: subset[:,subset[2,:].argsort()[::-1]])
# 2.556215071992483

【讨论】:

  • 太好了 - 感谢您的解释和提示。我会用那个 [::-1] 方法。
  • 嘿,我可以请您回顾一下您提供了答案的相关问题吗?我试图找出哪种方法更可取,你的还是 kyjanond 的。任何洞察为什么一个比另一个更好? stackoverflow.com/questions/42380283/…?
  • @joechoj 你的意思是那里给出的答案?我当然会选择其中一种 numpy 解决方案。我和其他解决方案之间的主要区别是。我的将您的列表放在列中,另一个放在行中。在我的解决方案中,最高振幅排在第一位,而在另一个解决方案中它排在最后。除此之外,我会说,它们或多或少是相同的。
猜你喜欢
  • 2021-11-17
  • 2021-04-12
  • 1970-01-01
  • 2018-06-25
  • 2015-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-22
相关资源
最近更新 更多