Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 为什么';是否使用负数组反转numpy.argsort()?_Arrays_Sorting_Numpy_Reverse - Fatal编程技术网

Arrays 为什么';是否使用负数组反转numpy.argsort()?

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

我有一个称为“子集”的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(第三个数组)降序排序。以下内容适用于升序:

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

>>> 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解决方案之一。我的解决方案与其他解决方案之间的主要区别是。我的将你的列表列在列中,另一个列在行中。在矿井中,最高振幅排在第一位,而在另一种解决方案中,最高振幅排在最后。除此之外,我想说,它们或多或少是相同的。