首页 > 解决方案 > 计算 Nympy 2D 数组的 mean(),按单独列表中的值分组,字符串对应于 2D 数组中的每一行

问题描述

我正在参加关于 Python 数据分析的课程(Numpy、Pandas 等)。

我们有一个任务,我们应该计算一个数组的 mean() - 基于另一个列表的值。这可能看起来有点不清楚,所以这里有一个例子:

list = ['A','A','A','A','B','B','B','B']
array = [ [5.1, 3.5, 1.4, 0.2],
        [4.9, 3. , 1.4, 0.2],
        [4.7, 3.2, 1.3, 0.2],
        [4.6, 3.1, 1.5, 0.2],
        [5. , 3.6, 1.4, 0.2],
        [5.4, 3.9, 1.7, 0.4],
        [4.6, 3.4, 1.4, 0.3],
        [5. , 3.4, 1.5, 0.2] ]

列表值对应于数组中行的类别,我们被要求计算按 A 和 B 分组的每一列的平均值。我想这可以通过将数据转换为 Pandas 数据框来完成 - 但分配属于Numpy,所以我想我们应该以某种方式在没有 Pandas 的情况下解决它。

我一直在努力和谷歌搜索无济于事。任何帮助深表感谢。

谢谢

BR安德斯

标签: pythonlistnumpy

解决方案


我能想到的最快方法是拆分行并计算平均值。但是,如果您想将解决方案推广到不同的形式,这种方法是一种快速的作弊方法并且不足list

>>> [x.mean() for x in np.split(np.array(array), 2)]
[2.40625, 2.58750]

一个更合适的解决方案是准备一个类别字典。然后按顺序将行附加到映射中的正确条目。我已重命名listkeys.

>>> res = {k: [] for k in set(keys)}
{'A': [], 'B': []}

>>> for k, row in zip(keys, array):
...     res[k] += row

>>> res
{'A': [5.1, 3.5, 1.4, 0.2, 4.9, 3.0, 1.4, 0.2, 4.7, 3.2, 1.3, 0.2, 4.6, 3.1, 1.5, 0.2],
 'B': [5.0, 3.6, 1.4, 0.2, 5.4, 3.9, 1.7, 0.4, 4.6, 3.4, 1.4, 0.3, 5.0, 3.4, 1.5, 0.2]}

然后计算均值:

>>> [(k, sum(v)/len(v)) for k, v in res.items()]
[('B', 2.5875), ('A', 2.40625)]

这适用于任意数量的类别和任何形式的类别序列keys。只要len(keys)等于行数。


我相信你可以自己想出一个完整的 NumPy 替代方案。


推荐阅读