首先,一些示例数据:
>>> import numpy as np
>>> X = np.matrix(np.arange(25).reshape((5,5)))
>>> print X
[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]
[15 16 17 18 19]
[20 21 22 23 24]]
numpy 方便地具有mean
功能。但是,默认情况下,它将为您提供数组中所有值的平均值。由于您想要每行的平均值,因此您需要指定axis
操作的:
>>> np.mean(X, axis=1)
matrix([[ 2.],
[ 7.],
[ 12.],
[ 17.],
[ 22.]])
请注意axis=1
:找到沿列的平均值(对于每一行),其中 0 = 行,1 = 列(依此类推)。现在,您可以从您的 中减去这个平均值X
,就像您最初所做的那样。
不请自来的建议
通常,最好避免使用矩阵类(请参阅文档)。如果您np.matrix
从示例数据中删除调用,那么您会得到一个普通的 numpy 数组。
不幸的是,在这种特殊情况下,使用数组会使事情稍微复杂化,因为np.mean
会返回一个一维数组:
>>> X = np.arange(25).reshape((5,5))
>>> r_means = np.mean(X, axis=1)
>>> print r_means
[ 2. 7. 12. 17. 22.]
如果您尝试从 中减去它X
,则会r_means
广播到行向量,而不是列向量:
>>> X - r_means
array([[ -2., -6., -10., -14., -18.],
[ 3., -1., -5., -9., -13.],
[ 8., 4., 0., -4., -8.],
[ 13., 9., 5., 1., -3.],
[ 18., 14., 10., 6., 2.]])
因此,您必须将一维数组重塑为N x 1
列向量:
>>> X - r_means.reshape((-1, 1))
array([[-2., -1., 0., 1., 2.],
[-2., -1., 0., 1., 2.],
[-2., -1., 0., 1., 2.],
[-2., -1., 0., 1., 2.],
[-2., -1., 0., 1., 2.]])
-1
传递的 to告诉reshape
numpy 根据原始数组形状和新数组的其余维度计算出这个维度。或者,您可以使用r_means[:, np.newaxis]
.