0

我想将多维数据集中在一个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返回了正确的解决方案。

4

1 回答 1

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,就像您最初所做的那样。

不请自来的建议

通常,最好避免使用矩阵类请参阅文档)。如果您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告诉reshapenumpy 根据原始数组形状和新数组的其余维度计算出这个维度。或者,您可以使用r_means[:, np.newaxis].

于 2012-06-02T11:35:38.537 回答