为numpy数组中的每个索引分配依赖于索引的值

2024-10-01 22:40:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我想把多维数据放在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)

然后我只需要减去每一行的平均值:

^{pr2}$

我该如何简化? 另外,上面的代码实际上不起作用—对于键值循环,我需要类似enumerate(X)的代码。我不确定X - centVector是否返回正确的解决方案。在


Tags: 数据key代码numpy定义ones矩阵val
1条回答
网友
1楼 · 发布于 2024-10-01 22:40:13

首先,一些示例数据:

>>> 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

^{pr2}$

注意,axis=1表示:沿列查找平均值(对于每一行),其中0=行,1=列(依此类推)。现在,你可以像原来一样,从你的X中减去这个平均值。在

主动建议

通常,最好避开matrix类see docs)。如果从示例数据中删除np.matrix调用,则得到一个普通的numpy数组。

不幸的是,在这种特殊情况下,使用数组会稍微复杂一些,因为np.mean将返回一个1D数组:

>>> 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根据原始数组形状和新数组的其余维度计算出这个维度。或者,您可以使用r_means[:, np.newaxis]重塑数组。在

相关问题 更多 >

    热门问题