为什么负数组不能反转 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
我有一个名为 '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