Arrays 为什么';是否使用负数组反转numpy.argsort()?
我有一个称为“子集”的2D numpy数组:Arrays 为什么';是否使用负数组反转numpy.argsort()?,arrays,sorting,numpy,reverse,Arrays,Sorting,Numpy,Reverse,我有一个称为“子集”的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.09724890
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(第三个数组)降序排序。以下内容适用于升序:
如您所见,第三个数组按递增顺序排序,其他行按相同的方式排序,按预期保留列
>>> 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([[ 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
运算符优先级?
-子集[2,:].argsort()
表示-(子集[2,:].argsort())
不是(-subset[2,:]).argsort()
,太好了-感谢您的解释和提示。我将采用[:-1]方法。嘿,我能请你回顾一下我的相关问题吗?你提供了答案?我在试着找出哪种方法更可取,你的还是kyjanond的。对为什么一个比另一个更好有什么见解吗@joechoj你是说这里给出的答案是什么?我当然会选择numpy解决方案之一。我的解决方案与其他解决方案之间的主要区别是。我的将你的列表列在列中,另一个列在行中。在矿井中,最高振幅排在第一位,而在另一种解决方案中,最高振幅排在最后。除此之外,我想说,它们或多或少是相同的。