我有一个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
的平均值。
答案 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)