Python 如何对数组中的相同值求和
如果数组中的第一列值相同,如何对第二列值求和 e、 如果我有一个数组Python 如何对数组中的相同值求和,python,numpy,Python,Numpy,如果数组中的第一列值相同,如何对第二列值求和 e、 如果我有一个数组[0,1],[1,1],[1,2],[2,5],[2,6]。结果应该是[0,1],[1,3],[2,11] 在我的例子中,如果有区别的话,我使用的是numpy数组 import numpy as np a = np.array([[0, 1], [1, 1], [1, 2], [2, 5], [2, 6]]) d
[0,1],[1,1],[1,2],[2,5],[2,6]
。结果应该是[0,1],[1,3],[2,11]
在我的例子中,如果有区别的话,我使用的是numpy数组
import numpy as np
a = np.array([[0, 1],
[1, 1],
[1, 2],
[2, 5],
[2, 6]])
d = {}
for k, v in a:
d[k] = d.get(k, 0) + v
b = np.array(d.items())
返回
b = np.array([[ 0, 1],
[ 1, 3],
[ 2, 11]])
还是一行
from collections import Counter
b = np.array(sum((Counter({k:v}) for k,v in a), Counter()).items())
以下是一个不带numpy的单线解决方案(但使用内置itertools):
您可以使用字典,因为第一项实际上是一个键:
l=[ [0,1],[1,1],[1,2],[2,5],[2,6] ]
s={}
for e in l:
if e[0] in s: s[e[0]] += e[1]
else s[e[0]] = e[1]
使用numpy智能索引:
[[k,np.sum(x[x[:,0]==k][:,1])] for k in np.unique(x[:,0])]
虽然你可以玩各种有趣的把戏来获得一行代码(我最喜欢的是
计数器(chain.from_iterable([k]*v代表k,在myarray中为v)).items()
),但最具可读性和可能最有效的方法是使用defaultdict和显式循环:
from itertools import defaultdict
count = defaultdict(int)
for k,v in myarray:
count[k] += v
print(list(count.items()))
你能解释清楚一点吗?你是如何从你所写的内容中得到结果的?我们可以假设第一列已经排序了吗?或者至少分组在相同(第一列)键值的组中?@smci是在这种情况下,您可以假定第一列已排序。
计数器({k:v代表k,v在a})
将返回[(0,1),(1,2),(2,6)]
,这不是所需要的。我不喜欢在没有必要的时候对数据进行排序;如果速度很重要,您应该在线性时间内实现相同的目标。@user2560053 OP已确认您可以假定第一列已排序。
from itertools import defaultdict
count = defaultdict(int)
for k,v in myarray:
count[k] += v
print(list(count.items()))