我有一个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
实现这一目标的简单方法是什么?
答案 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)存储为字典对象中的一个键。该值应该添加到课程