【问题标题】:Sort one array by another with duplicate values?用重复值对一个数组进行排序?
【发布时间】:2019-12-05 22:15:36
【问题描述】:

You can sort two arrays using one as the leading.

arr1inds = lead_arr1.argsort()
sorted_arr1 = lead_arr1[arr1inds]
sorted_arr2 = arr2[arr1inds]

问题是,如果两个数组都有重复的值,您将如何执行此操作,此外您还想“折叠”前导数组值并平均匹配它的 arr2..

F.e. :

 sorted_arr1 = [ ...5,5,5 ...]
 arr2        = [ ...4,7,8 ...]

变为 (4+7+8)/3。 = 6.333:

 sorted_arr1 = [ ...5 ...]
 arr2        = [ ...6.333 ...]

也许可以使用循环 "for i in arr1.unique().sort()" ... 但我想知道纯 numpy 是否有可能?

【问题讨论】:

  • 您会考虑使用 pandas 解决方案吗?
  • 可能是......可能它可以翻译成numpy

标签: python arrays numpy sorting unique


【解决方案1】:

如果您想将一个数组排序为另一个数组,您可以将其压缩并放入 sorted 函数,使用 key 参数和 lambda 和元组解包来选择键。

举例

sorted(zip(arr1, arr2), key=lambda zipped: zipped[0])

在本例中,您将使用元组中的第一个值对数组进行排序。

您总是可以过滤和解包元组,留下两个排序数组。

【讨论】:

    【解决方案2】:

    Pandas 分组很方便:

    a1 = np.array([1,1,1,5,5,5,3,3])
    a2 = np.array([10,11,1,4,7,8,9,10])
    
    s = pd.Series(a2).groupby(a1).transform('mean')
    
    a1[np.argsort(s)]
    

    输出:

    array([5, 5, 5, 1, 1, 1, 3, 3])
    

    或者你想要:

    s = pd.Series(a2).groupby(a1).mean()
    

    给予

    1    7.333333
    3    9.500000
    5    6.333333
    dtype: float64
    

    s.sort_values() 给出了

    5    6.333333
    1    7.333333
    3    9.500000
    dtype: float64
    

    【讨论】:

      【解决方案3】:

      np.uniquenp.bincount 可以在这里使用:

      # set up example
      a1 = np.random.randint(0,10,20)
      a2 = np.random.random(20)
      
      # solve
      sa1,idx,cnt = np.unique(a1,return_counts=True,return_inverse=True)
      sa2 = np.bincount(idx,a2)/cnt
      
      # compare with brute force
      np.all(sa1 == sorted(set(a1)))
      # True
      np.all(sa2 == [np.mean(a2[a1 == x]) for x in sa1])
      # True
      

      【讨论】:

        猜你喜欢
        • 2014-12-02
        • 2021-11-14
        • 1970-01-01
        • 2013-07-26
        • 1970-01-01
        • 2013-01-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多