2016-11-11 101 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() –