为什么负数组不能反转 numpy.argsort()?

Why doesn't a negative array work to reverse numpy.argsort()?

我有一个名为 'subset':

的 2D 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]])

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

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

>>> 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[:,(-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