如何在数组中求和相同的值

时间:2015-01-27 08:22:06

标签: python numpy

如果数组中的第一列值相同,如何对第二列值求和?

例如,如果我有一个数组[0,1],[1,1],[1,2],[2,5],[2,6]。结果应为[0,1],[1,3],[2,11]

在我的情况下,我正在使用一个numpy数组,如果这有所不同。

5 个答案:

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