如何通过第二列在Mathematica中订购矩阵?

时间:2011-11-22 20:09:52

标签: wolfram-mathematica

想象一下你有:

a = {{5, 1, 1}, {2, 0, 7}, {3, -4, 6}}

并且您想要通过第二列订购,以获得

b = {{3, -4, 6}, {2, 0, 7}, {5, 1, 1}}

我尝试使用SortBy[a, Last]并在最后一栏工作,但我无法让它适用于第二列。

提前致谢: - )

6 个答案:

答案 0 :(得分:19)

这确实有效:

SortBy[a,#[[2]]&]

答案 1 :(得分:12)

可替换地,

a[[Ordering[a[[All, 2]]]]]

答案 2 :(得分:8)

在这里,对于强制性时间(我在方法中添加了基本的Sort):

a = RandomReal[{0, 10}, {1000000, 3}];

Sort[a, #2[[2]] < #1[[2]] &]; // Timing

(* ==> {34.367, Null} *)

SortBy[a, #[[2]] &]; // Timing

(* ==> {0.436, Null} *)

 a[[Ordering[a[[All, 2]]]]]; // Timing

(* ==> {0.234, Null}, Chris wins *)

答案 3 :(得分:5)

也许您可以使用此网址:http://12000.org/my_notes/mma_matlab_control/KERNEL/node99.htm

您可以使用的代码:

a={{300,48,2},{500,23,5},{120,55,7},{40,32,1}};
b=SortBy[a, #[[2]]&]

结果:

Out[9]= {{500,23,5},{40,32,1},{300,48,2},{120,55,7}}

答案 4 :(得分:4)

如果您的数据是:

a = {{5, 1, 1}, {2, 1, 7}, {3, -4, 6}}

你需要对第二个元素进行稳定的排序,产生:

{{3, -4, 6}, {5, 1, 1}, {2, 1, 7}}

尝试使用SortBy来解决此问题可能会非常令人沮丧,除非您意识到这一点:

SortBy[a, {#[[2]] &}]

{}括号很重要。

答案 5 :(得分:2)

在这方面只是一个提示: 当使用像Sqrt[...]这样的非atomar对象时,您可能会得到意想不到的结果:

SortBy[Range[10], -Sqrt[#] &]
{9, 4, 1, 8, 2, 3, 5, 6, 7, 10}

这是由于

  

排序通常先将较短的表达式排序,然后排序   然后以深度优先的方式比较部件。 (Mathematica参考手册)。

当需要数字排序时,始终使用N.