如果数组中的第一列值相同,如何对第二列值求和?
例如,如果我有一个数组[0,1],[1,1],[1,2],[2,5],[2,6]
。结果应为[0,1],[1,3],[2,11]
。
在我的情况下,我正在使用一个numpy数组,如果这有所不同。
答案 0 :(得分:2)
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())
答案 1 :(得分:2)
您可以使用字典,因为第一项实际上是一个键:
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]
答案 2 :(得分:1)
这是一个没有numpy的单行解决方案(但使用内置的itertools):
>>> from itertools import groupby, imap
>>> arr = [[0, 1], [1, 1], [1, 2], [2, 5], [2, 6]]
>>> [[k, sum(imap(lambda x: x[1], g))] for (k, g) in groupby(sorted(arr), lambda x: x[0])]
[[0, 1], [1, 3], [2, 11]]
答案 3 :(得分:0)
使用numpy智能索引:
[[k,np.sum(x[x[:,0]==k][:,1])] for k in np.unique(x[:,0])]
答案 4 :(得分:0)
虽然你可以玩各种有趣的技巧来获得一个内衬(我最喜欢纯粹的韧性将是Counter(chain.from_iterable([k] * v for k,v in myarray)).items()
),但最可读和最有效的方法是使用defaultdict和显式循环:
from itertools import defaultdict
count = defaultdict(int)
for k,v in myarray:
count[k] += v
print(list(count.items()))