子数组中元素的平均值

时间:2018-11-06 18:40:39

标签: python arrays numpy split average

我有一个像a=[1, 2, 3, 4, 5, 6, 7]这样的数组。我想将此数组拆分为3个任意大小的块。

当我将其分成3个块时,我得到3个子数组:[array([1, 2, 3]), array([4, 5]), array([6, 7])]

我的目标是得到一个数组,该数组中包含子数组中的元素的平均值:[2, 4.5, 6.5],因为(1+2+3)/3=2(第一个元素),(4+5)/2=4.5(第二个元素),依此类推

我尝试了以下代码:

import numpy as np
a=[1, 2, 3, 4, 5, 6, 7]
a_split=np.array_split(a, 3)
a_split_avg=np.mean(a_split, axis=1)

我遇到以下错误:tuple index out of range

4 个答案:

答案 0 :(得分:3)

这是一个矢量化的解决方案,它避免了拆分步骤,从而提高了性能,并直接获取了分组的求和值,因此得到了平均值-

def average_groups(a, N): # N is number of groups and a is input array
    n = len(a)
    m = n//N
    w = np.full(N,m)
    w[:n-m*N] += 1
    sums = np.add.reduceat(a, np.r_[0,w.cumsum()[:-1]])
    return np.true_divide(sums,w)

样品运行-

In [357]: a=[1, 2, 3, 4, 5, 6, 7]

In [358]: average_groups(a, N=3)
Out[358]: array([2. , 4.5, 6.5])

答案 1 :(得分:1)

尝试一下:

In [1224]: mean_arr = []
In [1225]: for i in a_split:
      ...:     mean_arr.append(np.mean(i))

In [1226]: 

In [1226]: mean_arr
Out[1226]: [2.0, 4.5, 6.5]

答案 2 :(得分:1)

您会收到错误消息,因为np.array_split返回了一个numpy数组的python列表,而不是多维numpy数组,因此axis不能使用它。以此替换最后一行:

a_split_avg = [np.mean(arr) for arr in a_split]

答案 3 :(得分:1)

您可以在计算中使用mean来将means = np.vectorize(np.mean)(a_split) 函数应用于数组列表中的每个项目:

{{1}}

结果是一个列表,其中包含您创建的每个子数组的平均值。