Python 求numpy阵列的多轴平均值

Python 求numpy阵列的多轴平均值,python,numpy,Python,Numpy,在numpy中,有没有一种快速计算多轴平均值的方法?我在计算一个n维数组的0轴以外的所有轴的平均值 我目前正在这样做 for i in range(d.ndim - 1): d = d.mean(axis=1) 我想知道是否有一种解决方案不使用python循环。我的方法是重塑数组,使所有高维变平,然后在轴1上运行平均值。这就是你要找的吗 In [14]: x = np.array([[[1,2],[3,4]],[[5,6],[7,8]]]) In [16]: x.reshape((x

在numpy中,有没有一种快速计算多轴平均值的方法?我在计算一个n维数组的0轴以外的所有轴的平均值

我目前正在这样做

for i in range(d.ndim - 1):
    d = d.mean(axis=1)

我想知道是否有一种解决方案不使用python循环。

我的方法是重塑数组,使所有高维变平,然后在轴1上运行平均值。这就是你要找的吗

In [14]: x = np.array([[[1,2],[3,4]],[[5,6],[7,8]]])

In [16]: x.reshape((x.shape[0], -1)).mean(axis=1)
Out[16]: array([ 2.5,  6.5])

(步骤2只计算较高DIM长度的乘积)

根据@dsg101的建议,这是您想要的吗

>>> import numpy as np
>>> d=np.reshape(np.arange(5*4*3),[5,4,3])
>>> d
array([[[ 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, 25, 26],
        [27, 28, 29],
        [30, 31, 32],
        [33, 34, 35]],

       [[36, 37, 38],
        [39, 40, 41],
        [42, 43, 44],
        [45, 46, 47]],

       [[48, 49, 50],
        [51, 52, 53],
        [54, 55, 56],
        [57, 58, 59]]])
>>> np.mean(np.reshape(d,[d.shape[0],np.product(d.shape[1:])]),axis=1)
array([  5.5,  17.5,  29.5,  41.5,  53.5])

在numpy 1.7中,您可以为
np指定多个轴。平均值

d.mean(axis=tuple(range(1, d.ndim)))

我猜这将与其他建议的解决方案类似,除非重新调整阵列以展平所有维度会触发数据副本,在这种情况下,这应该快得多。因此,这可能会提供更一致的性能。

您也可以使用numpy.apply\u over\u axes:

import numpy as np

x = np.array([[[1,2],[3,4]],[[5,6],[7,8]]])
y = np.apply_over_axes(np.mean, x, (1, 2))
y = array([[[ 2.5]],[[ 6.5]]])

谢谢此外,-1也可以用来代替更高的亮度。@dsg101太棒了!现在编辑!对于numpy 1.7和更新版本,请看是的,我认为这将比OP soln更快。产品(d.shape[1:])的拼写更好
-1
非常好!但我目前使用的是numpy 1.6。我无法确认该功能是否存在,无论是在numpy的1.7.1版还是1.8.2版中。一厢情愿?你有没有试过,但没有成功?相信我,它是在1.7中出现的。对所有UFUNC进行了更改,因此它会自动传播到依赖于
np.add
的所有函数,如
np.mean
。它没有被添加到
mean
和其他类似函数的文档中,尽管有必要修复它。但您可以查看哪些更新了,并在1.7.0版中将相关更改标记为新的。@Jamie D'oh!我已经尝试过了,但是使用了整数的
列表
,而不是
元组
,灵感来自于您使用
范围
(在Python 2.7中返回列表)的示例。在我看来,numpy函数应该与类型无关,支持任何iterable(list、tuple、range…)。在此之前,您应该更改您的示例,使其真正起作用。=)