2016-11-11 6 views
2

Каков наиболее эффективный способ сортировки двух матриц numpy параллельно, по строке? Пример из игрушка:Сортировка двух матриц numpy параллельно, строка за строкой

сортировать это альфа:

a = [['c', 'b', 'e', 'd'], 
    ['a', 'd', 'b', 'e']] 

то, вроде этого параллельно к:

b = [['1', '2', '3', '4'], 
    ['2', '1', '4', '3']] 

Результат после сортировки:

a = [['b', 'c', 'd', 'e'], 
    ['a', 'b', 'd', 'e']] 

b = [['2', '1', '4', '3'], 
    ['2', '4', '1', '3']] 

В моем реальном случае , a и b - большие двумерные матрицы одинакового размера.

Если я использую idx = a.argsort(), я получаю индексы для сортировки каждой строки. Могут ли они применяться к b за один шаг? b = b[idx] не работает.

+0

также ваш пример о 1d списке, а затем вы ссылаетесь 2d матриц, Приведите примеры, которые соответствуют тому, что вы делаете. – Julien

+0

b [idx] не возвращает ошибку, но содержимое не сортируется. Я обновлю пример игрушек. –

+0

Возможно, этот ответ (как применить argsort к 2D-массиву): http://stackoverflow.com/a/33141247/3981745 - да, поздно. Браузер не обновился. –

ответ

3

Вы можете использовать advanced indexing -

idxx = np.arange(a.shape[0])[:,None],a.argsort(1) 
a_out = a[idxx] 
b_out = b[idxx] 

Sample пробег -

In [75]: a 
Out[75]: 
array([['b', 'c', 'd', 'e'], 
     ['a', 'b', 'd', 'e']], 
     dtype='|S1') 

In [76]: b 
Out[76]: 
array([['2', '1', '4', '3'], 
     ['2', '4', '1', '3']], 
     dtype='|S1') 

In [77]: a_out 
Out[77]: 
array([['b', 'c', 'd', 'e'], 
     ['a', 'b', 'd', 'e']], 
     dtype='|S1') 

In [78]: b_out 
Out[78]: 
array([['2', '1', '4', '3'], 
     ['2', '4', '1', '3']], 
     dtype='|S1') 
0

Попробуйте один

Python 3.4.3 (default, Sep 14 2016, 12:36:27) 
    [GCC 4.8.4] on linux 
    Type "help", "copyright", "credits" or "license" for more information. 
    >>> a = ['c', 'b', 'e', 'd'] 
    >>> b = [1, 2, 3, 4 ] 
    >>> a,b=zip(*sorted(zip(a, b))) 
    >>> a 
    ('b', 'c', 'd', 'e') 
    >>> b 
    (2, 1, 4, 3) 
    >>> 
+0

Это работает для моего примера с игрушкой, но в реальном я получаю ошибку: ValueError: значение истинности массива с несколькими элементами неоднозначно. Используйте команды a.any() или a.all() –