为numpy数组中的每个索引分配索引相关值

时间:2012-06-02 10:06:35

标签: python vector numpy scipy loops

我希望将多维数据置于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是否正在返回正确的解决方案。

1 个答案:

答案 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重新整形数组。

相关问题