2016-11-11 126 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']] 

在我的真實情況下,ab是大的相同大小的2D矩陣。

如果我使用idx = a.argsort(),我獲得索引來排序a的每一行。這些可以一步應用到b嗎? b = b[idx]不起作用。

+0

也是你的例子是關於一維列表,然後你指的二維矩陣,請舉例說明你在做什麼。 – Julien

+0

b [idx]不返回錯誤,但內容未排序。我會更新問題玩具的例子。 –

+0

也許這個答案(如何將argsort應用到二維數組):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] 

採樣運行 -

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() –