在Python中添加2D数组中的值

时间:2014-02-04 08:46:54

标签: python arrays python-2.7 numpy

我有一个numpy 2D数组如下

gona = array([['a1', 3], ['a2', 5], ['a3', 1], ['a3', 2], ['a3', 1], ['a1', 7]])

此数组有2列

我想要做的是创建一个包含2列的数组。第1列的'行'中应包含'a1','a2','a3'值,第2列应该具有相应值的总和。

new_gona = array([['a1', 10], ['a2', 5], ['a3', 4]])

此处,对应的值如下:

'a1' : 3 + 7 = 10
'a2' : 5 
'a3' : 1 + 2 + 1 = 4

实现这一目标的简单方法是什么?

5 个答案:

答案 0 :(得分:3)

使用pandas及其索引魔法:

import pandas as pd
import numpy as np

gona = np.array([['a1', 3], ['a2', 5], ['a3', 1], 
              ['a3', 2], ['a3', 1], ['a1', 7]])

# Create series where second items are data and first items are index
series = pd.Series(gona[:,1],gona[:,0],dtype=np.float)

# Compute sums across index
sums = series.sum(level=0)

# Construct new array in the format you want
new_gona = np.array(zip(sums.index,sums.values))

new_gona
# out[]:
# array([['a1', '10.0'],
#        ['a2', '5.0'],
#        ['a3', '4.0']], 
#       dtype='|S4')

值得注意的是np.array只能容纳一种数据类型。因此,需要通过指定dtype=np.float来纠正字符串和数字类型的混合。如果需要,可以使用np.int

答案 1 :(得分:2)

一个只有numpy的解决方案:

>>> labels, indices = np.unique(gona[:, 0], return_inverse=True)
>>> sums = np.bincount(indices, weights=gona[:, 1].astype(np.float))
>>> new_gona = np.column_stack((labels, sums))
>>> new_gona
array([['a1', '10'],
       ['a2', '5.'],
       ['a3', '4.']], 
      dtype='|S2')

答案 2 :(得分:1)

from collections import defaultdict 
from operator import itemgetter

sums = defaultdict(int)
for key, value in gona:
    sums[key] += value

new_gona = sorted(sums.iteritems(), key=itemgetter(0))

作弊?

答案 3 :(得分:0)

然后,列表理解将非常简单:

def fst(x): return x[0]
[(a, sum([int(m[1]) for m in gona if a == m[0]])) for a in set(map(fst, gona)) ]    

这是基本的Python。没有图书馆参与。定义第一个函数只是避免最后map中的lambda表达式。已经提到的Pandas和NumPy解决方案看起来都很有趣。两者都是+1!

答案 4 :(得分:-2)

你必须在gona周围写一个循环并将(a1)存储为字典对象中的一个键。该值应该添加到课程