Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将唯一numpy数组与计数器串联_Python_Performance_Numpy_Vectorization_Unique - Fatal编程技术网

Python 将唯一numpy数组与计数器串联

Python 将唯一numpy数组与计数器串联,python,performance,numpy,vectorization,unique,Python,Performance,Numpy,Vectorization,Unique,有没有一种简单而有效的方法来连接两个具有计数器的唯一numpy数组 例子: values1=np.array(['host1','host2','host3','host6']) counts1=np.数组([2,5,2,4]) values2=np.array(['host3','host1','host4'])) counts2=np.数组([5,7,1]) 我希望得到如下结果: values\u res=np.array(['host1','host2','host3','host6',

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

例子:
values1=np.array(['host1','host2','host3','host6'])
counts1=np.数组([2,5,2,4])
values2=np.array(['host3','host1','host4']))
counts2=np.数组([5,7,1])
我希望得到如下结果:

values\u res=np.array(['host1','host2','host3','host6','host4'])
counts_res=np.数组([9,5,7,4,1])
它们不需要排序,但
值\u res
确实需要唯一


我可以迭代数组中的元素,但这样做效率不高。我想以某种方式使用矢量化。

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

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

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

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())
这可能更快(特别是对于更大的阵列),并且订购:

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]}
输出:

['host1' 'host2' 'host3' 'host4' 'host6']
[9. 5. 7. 1. 4.]
m1在此设置中速度更快

这可能更快(特别是对于较大的阵列),并且订购:

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]}
输出:

['host1' 'host2' 'host3' 'host4' 'host6']
[9. 5. 7. 1. 4.]
m1在此设置中速度更快


完成这项工作。谢谢我将等待更多的答案,以防有其他的选择可以超越这种方法。这样做是有效的。谢谢我将等待更多的答案,以防有其他选择可以超越这种方法。