计算Nympy 2D数组的mean(),该数组按单独列表中的值分组,该列表中的字符串对应于2D数组中的每一行

2024-05-21 04:52:33 发布

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

我正在参加一个关于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的情况下解决它

我苦苦挣扎,谷歌搜索也无济于事。 非常感谢您的帮助

谢谢

B.R。 安德斯


Tags: 数据numpy示例pandas列表情况数组mean
2条回答

这能解决你的问题吗

import numpy as np

list = ['A','A','A','A','B','B','B','B']
array = np.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] ])
        
idxA = np.array([i for i, x in enumerate(list) if x == "A"])
idxB = np.array([i for i, x in enumerate(list) if x == "B"])

print(np.mean(array[idxA]))
print(np.mean(array[idxB]))

输出:

2.40625
2.5875000000000004

我能想到的最快的方法是将行分割并计算平均值。但是,这种方法是一种快速欺骗,如果您想将list的解决方案推广到不同的形式,那么这种方法就有缺陷:

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

一个更合适的解决办法是准备一本分类词典。然后按顺序将行附加到映射中的正确条目。我已将list重命名为keys

>>> 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替代方案

相关问题 更多 >