在二维数组中计算某个维度上的平均值

103

我有一个数组a,像这样:

a = [[40, 10], [50, 11]]

我需要分别计算每个维度的平均值,结果应该是这样的:

[45, 10.5]

45a[*][0]的平均值,10.5a[*][1]的平均值。不使用循环,最优雅的解决方法是什么?

3个回答

161

a.mean() 接受一个 axis 参数:

In [1]: import numpy as np

In [2]: a = np.array([[40, 10], [50, 11]])

In [3]: a.mean(axis=1)     # to take the mean of each row
Out[3]: array([ 25. ,  30.5])

In [4]: a.mean(axis=0)     # to take the mean of each col
Out[4]: array([ 45. ,  10.5])

或者,作为一个独立的函数:
In [5]: np.mean(a, axis=1)
Out[5]: array([ 25. ,  30.5])

你的切片操作无效的原因是因为这是切片的语法格式:
In [6]: a[:,0].mean() # first column
Out[6]: 45.0

In [7]: a[:,1].mean() # second column
Out[7]: 10.5

感谢您的快速回复。In [n]:是什么意思?这是代码的一部分吗? - otmezger
1
我正在使用numpy,所以第2行和第3行非常好用,但是要使用axis=0而不是axis=1 - otmezger
@otmezger axis=0 在下一行。我编辑了以显示更多信息,刷新一下,也许就可以了? - askewchan
1
@otmezger 不用谢。请注意,许多numpy数组方法都像这样带有一个轴参数。 - askewchan
1
@askewchan:mean = np.mean(a, axis=(0,2,3)) 这句话是什么意思?已知输入张量(a)的形状为(batch,channel,width,height)? - Hossein

16

这里是一个不使用numpy的解决方案:

>>> a = [[40, 10], [50, 11]]
>>> [float(sum(l))/len(l) for l in zip(*a)]
[45.0, 10.5]

6

如果你需要频繁进行此操作,NumPy 是一个不错的选择。

如果因为某些原因不能使用 NumPy:

>>> map(lambda x:sum(x)/float(len(x)), zip(*a))
[45.0, 10.5]

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