我希望将多维数据置于n x m
矩阵(<class 'numpy.matrixlib.defmatrix.matrix'>
)中,比方说X
。我定义了一个新数组ones(645)
,让我们说centVector
来生成矩阵X
中每一行的均值。现在我想迭代X
中的每一行,计算均值并将此值分配给centVector
中的相应索引。 scipy / numpy中的这一行是不是可能?我不习惯这种语言并且想到类似的东西:
centVector = ones(645)
for key, val in X:
centVector[key] = centVector[key] * (val.sum/val.size)
之后我只需要减去每一行的均值:
X = X - centVector
我该如何简化?
编辑:此外,上面的代码实际上没有工作 - 对于键值循环我需要enumerate(X)
之类的东西。而且我不确定X - centVector
是否正在返回正确的解决方案。
答案 0 :(得分:1)
首先,一些示例数据:
>>> 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
中减去这个均值。
通常,最好避免矩阵类(see docs)。如果从示例数据中删除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.]])
因此,您必须将1D数组重新整形为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
的{{1}}告诉numpy根据原始数组形状和新数组的其余维度计算出这个维度。或者,您可以使用reshape
重新整形数组。