如何使用NumPy将数组中的每个元素更改为数组的均值?

时间:2019-09-23 00:59:10

标签: numpy

我是Python的新手。在我的一个分配问题中,部分问题要求我们计算子矩阵中每个元素的平均值,并使用Numpy中可用的运算符将每个元素替换为均值。

矩阵的一个例子可能是

M = [[[1,2,3],[2,3,4]],[[3,4,5],[4,5,6]]]

通过一些操作,预计将获得如下所示的矩阵:

M = [[[2,2,2],[3,3,3]],[[4,4,4],[5,5,5]]]

我看过一些numpy文档,但仍然没有弄清楚,如果有人可以提供帮助,我将不胜感激。

2 个答案:

答案 0 :(得分:1)

您在这里有几个不同的选择。它们都遵循相同的总体思想。您有一个MxNxL数组,并且您希望沿最后一个轴应用归约操作,默认情况下将使您获得MxN结果。但是,您希望在开始时使用的相同MxNxL形状中广播结果。

Numpy在大多数缩小操作中都有一个参数,可让您保持输出数组中的缩小尺寸,从而可以轻松地将结果广播到正确大小的矩阵中。该参数称为keepdims,您可以在文档中进一步了解numpy.mean

以下几种方法都可以利用这一点。

设置

avg = M.mean(-1, keepdims=1)

# array([[[2.],
#         [3.]],
# 
#        [[4.],
#         [5.]]])

选项1
分配给阵列的视图。但是,它也会将平均浮点数强制为int,因此,如果要这样做,将数组强制转换为浮点数以提高精度。

M[:] = avg

选项2
使用np.broadcast_to

的高效只读视图
np.broadcast_to(avg, M.shape)

选项3
广播乘法,更多用于演示。

avg * np.ones(M.shape)

所有都会产生(除了dtype以外,其他都一样):

array([[[2., 2., 2.],
        [3., 3., 3.]],

       [[4., 4., 4.],
        [5., 5., 5.]]])

答案 1 :(得分:0)

在一行代码中:

M.mean(-1, keepdims=1) * np.ones(M.shape)