Как я могу заказать матрицу в Mathematica по ее второму столбцу? - PullRequest
7 голосов
/ 23 ноября 2011

Представьте, что у вас есть:

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

и вы хотите упорядочить его по второму столбцу, чтобы получить

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

Я пробовал с SortBy[a, Last] и работает для последнегостолбец, но я не могу заставить его работать для второго столбца.

Заранее спасибо: -)

Ответы [ 6 ]

19 голосов
/ 23 ноября 2011

Это работает:

SortBy[a,#[[2]]&]
12 голосов
/ 23 ноября 2011

С другой стороны,

a[[Ordering[a[[All, 2]]]]]
8 голосов
/ 23 ноября 2011

И здесь, для обязательного времени (я добавил базовые 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 *)
5 голосов
/ 23 ноября 2011

Может быть, вы можете использовать этот URL: 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 голосов
/ 23 ноября 2011

Если ваши данные были:

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

И вам нужна была стабильная сортировка по второму элементу, получая:

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

Может быть очень сложно попытаться решить эту проблему с помощью SortBy, если вы не знали об этом:

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

Важные скобки {}.

2 голосов
/ 23 ноября 2011

просто подсказка в этом контексте: при использовании неатомарных объектов, таких как Sqrt[...], вы можете получить неожиданные результаты:

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

это связано с

Сортировка обычноупорядочивает выражения, сначала помещая более короткие, а затем сравнивая детали в глубину.(Справочное руководство Mathematica).

Всегда используйте N, когда требуется числовая сортировка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...