【问题标题】:Sort two numpy matrices in parallel, row by row对两个 numpy 矩阵进行并行排序,逐行
【发布时间】:2017-03-25 11:29:43
【问题描述】:

并行、逐行排序两个 numpy 矩阵的最有效方法是什么?一个玩具例子:

对这个 alpha 排序:

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

然后,将其与 a 并行排序:

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 是相同大小的大型二维矩阵。

如果我使用idx = a.argsort(),我会获得索引来对 a 的每一行进行排序。这些可以一步应用于 b 吗? b = b[idx] 不工作。

【问题讨论】:

  • 你的例子也是关于一维列表然后你引用二维矩阵,请给出与你正在做的相匹配的例子。
  • b[idx] 不返回错误,但内容没有排序。我将更新问题玩具示例。
  • 也许这个答案(如何将 argsort 应用于 2D 数组):stackoverflow.com/a/33141247/3981745 - 嗯,晚了。浏览器未刷新。

标签: python arrays sorting numpy matrix


【解决方案1】:

你可以使用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')

【讨论】:

    【解决方案2】:

    试试这个

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

    【讨论】:

    • 这适用于我的玩具示例,但在真实示例中我得到错误:ValueError:具有多个元素的数组的真值不明确。使用 a.any() 或 a.all()
    猜你喜欢
    • 2016-04-18
    • 2012-04-22
    • 1970-01-01
    • 2021-06-29
    • 2016-09-27
    • 1970-01-01
    • 1970-01-01
    • 2016-07-23
    • 2017-08-13
    相关资源
    最近更新 更多