【问题标题】:Concatenate unique numpy arrays with counters将唯一的 numpy 数组与计数器连接起来
【发布时间】:2020-12-07 23:16:49
【问题描述】:

有没有一种简单而有效的方法来连接两个具有计数器的唯一 numpy 数组?

示例:

values1 = np.array(['host1', 'host2', 'host3', 'host6'])
counts1 = np.array([2,5,2,4])

values2 = np.array(['host3', 'host1', 'host4'])
counts2 = np.array([5,7,1])

我想要这样的结果:

values_res = np.array(['host1', 'host2', 'host3', 'host6', 'host4'])
counts_res = np.array([9,5,7,4,1])

它们不需要被订购,但values_res 确实需要是唯一的。

我可以遍历数组中的元素,但这不会有效。我想以某种方式使用矢量化。

【问题讨论】:

    标签: python performance numpy vectorization unique


    【解决方案1】:

    这可能更快(特别是对于较大的数组)并且是有序的:

    values_res, idx = np.unique(np.hstack((values1, values2)), return_inverse=True)
    counts_res = np.bincount(idx, np.hstack((counts1, counts2)))
    

    输出:

    ['host1' 'host2' 'host3' 'host4' 'host6']
    [9. 5. 7. 1. 4.]
    

    比较使用 benchit:

    #@Ehsan's solution
    def m1(values1, values2, counts1, counts2):
      values_res, idx = np.unique(np.hstack((values1, values2)), return_inverse=True)
      counts_res = np.bincount(idx, np.hstack((counts1, counts2)))
      return values_res, counts_res
    
    #@Chris's solution
    def m2(values1, values2, counts1, counts2):
    
      values_res, counts_res = zip(*dict(Counter(dict(zip(values1,counts1))) + Counter(dict(zip(values2,counts2)))).items())
      return values_res, counts_res
    
    
    in_ = {n:[np.random.choice(values_res, n), np.random.choice(values_res, n), np.random.randint(1,100,n), np.random.randint(1,100,n)] for n in [10,100,1000,10000]}
    

    输出:

    m1 在此设置下更快

    【讨论】:

      【解决方案2】:

      您可以利用计数器可以添加在一起的事实。把每一对都拉上拉链,做一个柜台,把它们加在一起,然后打开包装。

      from collections import Counter
      
      values1 = np.array(['host1', 'host2', 'host3'])
      counts1 = np.array([2,5,2])
      
      values2 = np.array(['host3', 'host1', 'host4'])
      counts2 = np.array([5,7,1])
      
      
      values_res, counts_res = zip(*dict(Counter(dict(zip(values1,counts1))) + Counter(dict(zip(values2,counts2)))).items())
      

      【讨论】:

      • 做的工作。谢谢。我会等待更多答案,以防万一有其他选择可以胜过这种方法。
      猜你喜欢
      • 1970-01-01
      • 2015-07-30
      • 2021-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多