通过对行进行分组来计算NumPy数组的均值

时间:2014-10-29 15:49:32

标签: python numpy

我有一个m-by-n NumPy数组A,其中每一行代表一些数据的观察。我的行也被分配给c类中的一个,每行的类存储在m-by-1 NumPy数组B中。我现在想要为每个类计算平均观察数据M。我怎么能这样做?

例如:

A = numpy.array([[1, 2, 3], [1, 2, 3], [3, 4, 5], [4, 5, 6]])
B = numpy.array([1, 0, 0, 1]) # the first row is class 1, the second row is class 0 ...
M = # Do something

这应该给我输出:

>>M
numpy.array([[2, 3, 4], [2.5, 3.5, 4.5]])

此处,i中的行M是类i的平均值。

3 个答案:

答案 0 :(得分:3)

正如评论中所提到的,根据你想要的地方,熊猫可能更有用。但是现在这仍然可以用numpy

import numpy
A = numpy.array([[1, 2, 3], [1, 2, 3], [3, 4, 5], [4, 5, 6]])
B = numpy.array([1, 0, 0, 1])

class_indicators = B[:, numpy.newaxis] == numpy.unique(B)
mean_operator = numpy.linalg.pinv(class_indicators.astype(float))

means = mean_operator.dot(A)

此示例适用于许多类等,但正如您所见,这可能很麻烦

答案 1 :(得分:2)

使用numpy的新at功能执行此操作的另一种方法。

A = numpy.array([[1, 2, 3], [1, 2, 3], [3, 4, 5], [4, 5, 6]])
B = numpy.array([1, 0, 0, 1])

u, uinds = numpy.unique(B, return_inverse=True)
M = numpy.zeros((u.shape[0], A.shape[-1]))
numpy.add.at(M, B, A)
M /= numpy.bincount(uinds)[:, None]

M
array([[ 2. ,  3. ,  4. ],
       [ 2.5,  3.5,  4.5]])

如上所述,大熊猫会让这更容易:

import pandas as pd

>>> pd.DataFrame(A).groupby(B).mean()
     0    1    2
0  2.0  3.0  4.0
1  2.5  3.5  4.5

答案 2 :(得分:0)

这是一个典型的分组问题,可以使用numpy_indexed包在一行中解决(免责声明:我是作者):

import numpy_indexed as npi
npi.group_by(B).mean(A)