在NumPy中对多个轴进行平均值计算

20

我想以Pythonic的方式编写以下代码,对两个轴应用均值。最好的方法是什么?

import numpy as np

m = np.random.rand(30, 10, 10)  
m_mean = np.zeros((30, 1))    
for j in range(30):
    m_mean[j, 0] = m[j, :, :].mean()

为什么 m_mean 是一个二维数组? - user2357112
1
为什么要创建一个只有一行的第二个numpy数组呢?为什么不只用一个简单的列表? - R Nar
6
NumPy 的简洁写法是 m.mean(axis=(1,2)),意思为对第二和第三个轴进行平均值计算。 - Divakar
2个回答

40

如果您拥有足够新的NumPy,您可以执行以下操作

m_mean = m.mean(axis=(1, 2))

我相信这是在1.7版本中引入的,但我不确定。文档只在1.10版本中更新以反映这一点,但它在那之前就已经起作用了。

如果你的NumPy版本太老了,你可以手动进行平均操作:

m_mean = m.sum(axis=2).sum(axis=1) / np.prod(m.shape[1:3])

这两种方法都会产生一维结果。如果你真的想要额外的长度为1的轴,你可以像这样做:m_mean = m_mean[:, np.newaxis],在那里添加额外的轴。


使用旧版的numpy,您也可以只需执行m.mean(axis=2).mean(axis=1) - Rob
@Rob:啊,你说得对。由于在 m.mean(axis=2) 步骤中所有的平均值都是在相同数量的元素上计算的,所以 m.mean(axis=2).mean(axis=1) 正确地给每个元素赋予了相等的权重。 - user2357112

2
您也可以使用numpy.mean()函数,并将输出数组作为参数传递给out=,如下所示:
最初的回答
np.mean(m, axis=(1, 2), out=m_mean)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接