Python 如何对数组中的相同值求和

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

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

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 = {}
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()))