【问题标题】:Average of elements in a subarray子数组中元素的平均值
【发布时间】:2018-11-06 18:40:38
【问题描述】:

我有一个类似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

【问题讨论】:

    标签: python arrays numpy split average


    【解决方案1】:

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

    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])
    

    【讨论】:

      【解决方案2】:

      您收到错误是因为 np.array_split 返回一个 numpy 数组的 python 列表,而不是一个多维 numpy 数组,所以 axis 无法使用它。将最后一行替换为:

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

      【讨论】:

      • 感谢您的帮助。
      【解决方案3】:

      试试这个:

      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]
      

      【讨论】:

      • 我很感激。
      【解决方案4】:

      您可以在计算中使用np.vectorizemean 函数应用于数组列表中的每个项目:

      means = np.vectorize(np.mean)(a_split)
      

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

      【讨论】:

      • 您可能想从np.vectorize 上的文档中添加此内容:The vectorize function is provided primarily for convenience, not for performance. The implementation is essentially a for loop.
      • 我很感激。
      猜你喜欢
      • 2013-12-29
      • 1970-01-01
      • 2019-08-28
      • 2022-01-11
      • 2013-08-02
      • 2014-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多