Python 以NumPy为单位的多轴平均值

Python 以NumPy为单位的多轴平均值,python,numpy,multidimensional-array,vectorization,mean,Python,Numpy,Multidimensional Array,Vectorization,Mean,我想以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() 如果你有一个足够新的NumPy,你可以这样做 m_mean = m.mean(axis=(1, 2)) 我相信这是在1.7中引入的

我想以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()

如果你有一个足够新的NumPy,你可以这样做

m_mean = m.mean(axis=(1, 2))
我相信这是在1.7中引入的,尽管我不确定。文档仅在1.10中进行了更新,以反映这一点,但其工作时间早于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]
的操作将额外的轴放在那里。

您还可以使用ufunc并将输出数组作为参数传递给
out=
,如中所示:

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

为什么
m_意味着
2D数组?为什么只创建一行的第二个numpy数组?为什么不做一个简单的列表呢?NumPythonic的方法是
m.mean(axis=(1,2))
。对于较老的numpy,你也可以只做
m.mean(axis=2)。mean(axis=1)
@Rob:Ah,你说得对。由于
m.mean(轴=2)
步骤中的所有平均值都在相同数量的元素上,
m.mean(轴=2).mean(轴=1)
正确地给出了每个元素相等的权重。