Numpy平均结构阵列

2024-06-02 18:51:42 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个结构化的学生(字符串)和测试分数(int)数组,其中每个条目都是特定学生在特定测试中获得的分数。当然,每个学生在这个数组中有多个条目。在

示例

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)]

我如何容易地计算出每个学生的平均分?换言之,如何获取“score”维中数组的平均值?我很乐意

^{pr2}$

让纽比回来

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

但纽比抱怨道

TypeError: an integer is required

有没有一种新的方式可以轻松做到这一点?我认为这可能涉及到使用不同的数据类型查看结构化数组。任何帮助都将不胜感激。谢谢。在

编辑

>>> 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

Tags: numpy条目数组johnstudent学生分数结构化
3条回答

基于itertools的更快更简单的解决方案是

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

这与ecatmur的想法相同,但对于使用argsort()而不是sort的索引有效。在

在组别库正是我想要的。在

NumPy并不能将行组合在一起,并将聚合函数应用于这些组。你可以:

  • 使用^{}重建数组
  • 使用Pandas,它基于NumPy,非常擅长分组;或者
  • 为测试id向数组添加另一个维度(因此本例将是一个2x3数组,因为它看起来像有两个测试)。在

{这是一个非常复杂的解决方案。我推荐另外两种方法中的一种。在

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)

相关问题 更多 >