Python 将唯一numpy数组与计数器串联
有没有一种简单而有效的方法来连接两个具有计数器的唯一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',
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在此设置中速度更快
完成这项工作。谢谢我将等待更多的答案,以防有其他的选择可以超越这种方法。这样做是有效的。谢谢我将等待更多的答案,以防有其他选择可以超越这种方法。