如果两个数组具有相同的索引,则求和,但之后保留索引



假设我们必须阵列

第一个:

arr1=
[1000      5.0
1270      5.0
1315      5.0
]
arr2=
[578      5.0
1000      5.0
1315      5.0
]

正如你所看到的,我们有索引和它们的值,我想做的是,如果它们有相同的索引,就以某种方式连接它们,然后添加它们,如果不只是将它们与它们的值放在一起的话。

最终输出

FINAL_ARR=
[578      5.0
1000      10.0
1270      5.0
1315      10.0
]

我已经尝试过使用zip()方法,但我需要保持索引

注意:它们不需要分类。

dict的使用似乎是实现以下目标的方法:

map1={
1000: 5.0,
1270: 5.0,
1315: 5.0
}
map2={
578: 5.0,
1000: 5.0,
1315: 5.0
}
r = map1
for k, v in map2.items():
if k not in r:
r[k] = 0
r[k] += v

这些不是数组。它们甚至不是蟒蛇。

在python中,数组是顺序的,索引为0,1,2,3,。。。

最接近你所描述的是字典。其键是与值相关联的任何东西(或几乎是这样(。因此,您可以决定创建一个新的dict,其密钥是两个源的密钥的合并。如果有两个值,则取两个值之和;如果只有一个值,即取唯一值。

dic1={1000: 5.0, 1270: 5.0, 1315: 5.0}
dic2={578: 5.0, 1000: 5.0, 1315: 5.0}
res={k:(dic1[k] if k in dic1 else 0) + (dic2[k] if k in dic2 else 0) for k in set(dic1).union(dic2)}

一些时间指示(从我的角度来看,令人失望。大多数时候,复合不仅是一个线性,而且比显式构造更快。但这里不是(

  • 我的解决方案:2.15
  • 我的解决方案的变体,Mozway向Rahul建议了.get,但这也适用于我的解决方法:2.29(就个人而言,我会支付0.14,以避免更难阅读的"函数if">
  • Rahul的解决方案:2.78
  • imburningbabe的解决方案:4439.33(这并不奇怪。Pandas是一台重型机器,对于这样的任务来说太重了。对于更大的字典来说,差异肯定会减少很多,甚至可能会赢得足够大的数据——因为它避免了我们其他人都无法避免的python for循环(。对于100万个条目的输入,最佳解决方案和pandas 1之间的比率仅为2(例如,当输入超过2000时(。所以,仍然是最慢的。但熊猫最终可能会赢得更多的数据

但所有这些都被Julien的直接解决方案击败了(即使我在时间上也算在内,对于他的解决方案来说,是第一本字典的副本。为了比较可比较的算法:我们所有的解决方案都返回第三本字典,让两本输入字典完好无损。而他更改了一本输入字典。但是,让它在副本上工作会让我们使用相同的规则

  • 朱利安的解决方案:1.81

所以,就目前而言,如果你想要最快的解决方案,Julien就是你想要的。如果你想要一条班轮,我的(没有mozway建议的优雅的.get(是最快的(在一条班轮中(。

在对另一个解决方案的评论中,您说您也只想要交集(所以这是另一个问题(。然后,你可以

{k: dic1[k]+dic2[k] for k in set(dic1).intersection(dic2)}

如果您认为两者都是字典,

dic1={1000: 5.0, 1270: 5.0, 1315: 5.0}
dic2={578: 5.0, 1000: 5.0, 1315: 5.0}
output = {k: dic1.get(k, 0)+ dic2.get(k,0) for k in list(dic1.keys())+list(dic2.keys())}
# {1000: 10.0, 1270: 5.0, 1315: 10.0, 578: 5.0}

如果两者都是阵列

arr1 = [[1000,5.0], [1270, 5.0], [1315, 5.0]]
arr2 = [[578,5.0], [1000, 5.0], [1315, 5.0]]
d = {}
for i in arr1 + arr2:
d[i[0]] = d.get(i[0], 0) + i[1]
# {1000: 10.0, 1270: 5.0, 1315: 10.0, 578: 5.0}

有趣的单线解决方案:

res = pd.DataFrame.from_records(arr1).set_index(0).append(pd.DataFrame.from_records(arr2).set_index(0)).sum(level=0).reset_index().values

最新更新