NumPy的平均结构数组(Numpy Mean Structured Array)

2019-06-27 02:33发布

假设我有个同学(串)和考试成绩(整数),其中每个条目的分数上的特定测试获得了特定学生的结构数组。 每个学生都有这个阵列中的多个条目,自然。

import numpy
grades = numpy.array([('Mary', 96), ('John', 94), ('Mary', 88), ('Edgar', 89), ('John', 84)],
                     dtype=[('student', 'a50'), ('score', 'i')])

print grades
#[('Mary', 96) ('John', 94) ('Mary', 88) ('Edgar', 89) ('John', 84)]

如何轻松地计算每个学生的平均成绩? 换句话说,我怎么走阵的平均值在“分数”维度? 我想这样做

grades.mean('score')

并有NumPy的回报

[('Mary', 92), ('John', 89), ('Edgar', 89)]

但NumPy的抱怨

TypeError: an integer is required

是否有一个numpy的式的方法可以轻松地做到这一点? 我想这可能涉及采取结构化阵列的观点与不同的D型。 任何帮助,将不胜感激。 谢谢。

编辑

>>> grades = numpy.zeros(5, dtype=[('student', 'a50'), ('score', 'i'), ('testid', 'i'])
>>> grades[0] = ('Mary', 96, 1)
>>> grades[1] = ('John', 94, 1)
>>> grades[2] = ('Mary', 88, 2)
>>> grades[3] = ('Edgar', 89, 1)
>>> grades[4] = ('John', 84, 2)
>>> np.mean(grades, 'testid')
TypeError: an integer is required

Answer 1:

NumPy的目的不是要能够组行一起,将集合函数应用于这些组中。 你可以:

  • 使用itertools.groupby和重构阵列;
  • 使用熊猫 ,这是基于NumPy的,是在分组很大; 要么
  • 添加另一个维度的数组中测试ID(所以这种情况是2×3的阵列,因为它看起来像有两个测试)。

这里的itertools解决方案,但你可以看到它是相当复杂和低效。 我建议其他两种方法之一。

np.array([(k, np.array(list(g), dtype=grades.dtype).view(np.recarray)['score'].mean())
          for k, g in groupby(np.sort(grades, order='student').view(np.recarray),
                              itemgetter('student'))], dtype=grades.dtype)


Answer 2:

matplotlib.mlab.rec_groupby正是我一直在寻找。



Answer 3:

一点点更快和更简单的解决方案基于itertools ,而不使用图(),是

[(k,e['score'][list(g)].mean()) for k, g in groupby(argsort(e),e['student'].__getitem__ )]

这是ecatmur同样的想法,但采用argsort)在指数方面的工作(而不是排序。



Answer 4:

collapseByField(等级,“学生”),给你想要的东西,后:

def collapseByField(e,collapsefield,keepFields=None,agg=None):
   import numpy as np
   assert isinstance(e,np.ndarray) # Structured array
   if agg is None:
       agg=np.mean
   if keepFields is None:
       newf=[(n,agg,n) for n in e.dtype.names if n not in (collapsefield)]
   import matplotlib as mpl
   return(mpl.mlab.rec_groupby(e,[collapsefield],newf))


文章来源: Numpy Mean Structured Array