22

在 numpy 中是否有一种快速计算多轴平均值的方法?我正在计算除 n 维数组的 0 轴之外的所有轴的平均值。

我目前正在这样做;

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

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

4

4 回答 4

41

在 numpy 1.7 中,您可以将多个轴赋予np.mean

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

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

于 2013-07-01T11:27:22.480 回答
10

我的方法是重塑数组以展平所有更高的维度,然后在轴 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 步只计算较高尺寸的长度的乘积)

于 2013-07-01T04:28:45.820 回答
3

您还可以使用 numpy.apply_over_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]]])
于 2015-11-06T02:29:29.283 回答
0

根据@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])
于 2013-07-01T04:38:39.043 回答