【问题标题】:Sort numpy array by another array按另一个数组对 numpy 数组进行排序
【发布时间】:2021-06-22 14:37:14
【问题描述】:

我有两个 numpy 数组 lsta,我想按照 lst 中出现的相同顺序对 a 的第一列进行排序,同时保持 a 的每一行具有相同的元素。

lst = np.array(['a','b','d','e','c'])
a = np.array([['e','b','a','d','c'],[1,2,3,4,5]]).T

我想要的结果是:

array([['a', '3'],
       ['b', '2'],
       ['d', '4'],
       ['e', '1'],
       ['c', '5']])

我可以通过 pandas 得到这个结果:

(pd.DataFrame(lst, columns=['col'])
 .merge(pd.DataFrame(a, columns=['col','data']), on='col')
 .to_numpy())

但我想知道是否可以仅使用 numpy 来完成。

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    如果(如您提出的示例中)两个数组具有相同数量的元素,并且它们都相同,则以下代码可以正常工作。那么就只是索引的问题,可以通过排序几次(arg-sorting两个数组得到对应的索引排序,然后arg-sorting再次lst得到反向索引):

    idx1 = np.argsort(lst)
    idx2 = np.argsort(a[:, 0])
    idx1_inv = np.argsort(idx1)
    result = a[idx2][idx1_inv]
    

    这里,a[idx2] 正在对 a 的第一列进行排序(正确维护行),然后按 [idx1_inv] 进行索引重建与 lst 相同的顺序。

    这可能会推广到a 包含lst 值的任意子集的情况,可能有重复,但我想这会很烦人。一个更简单的解决方案就是使用 python:

    value_to_idx = {v: i for i, v in enumerate(lst)}
    target_position = [value_to_idx[x] for x in a[:, 0]]
    indices = np.argsort(target_position)
    result = a[indices]
    

    请注意,这两个解决方案都在O(n * log(n))(其中n = len(a))中运行,而上面MichaelCG8 使用np.meshgrid 的解决方案在O(n^2) 中运行。

    【讨论】:

      【解决方案2】:

      我假设您在 lst 中的所有值都是唯一的,lsta 的长度相同,并且它们包含您排序所依据的相同字符。

      lst = np.array(['a','b','d','e','c'])
      a = np.array([['e','b','a','d','c'],[1,2,3,4,5]]).T
      
      first_col = a[:, 0]
      
      lst_grid, first_col_grid = np.meshgrid(lst, b)
      
      indices = np.argmax(lsta==ba, axis=0)
      print(indices)
      # array([2, 1, 3, 0, 4])
      
      result = a[indices]
      print(result)
      # array([['a', '3'],
      #        ['b', '2'],
      #        ['d', '4'],
      #        ['e', '1'],
      #        ['c', '5']], dtype='<U21')
      
      

      【讨论】:

        猜你喜欢
        • 2013-10-04
        • 2016-04-30
        • 2011-09-03
        • 2011-02-10
        • 1970-01-01
        • 1970-01-01
        • 2018-11-19
        • 1970-01-01
        • 2015-07-14
        相关资源
        最近更新 更多