【问题标题】:vectorize numpy mean across the slices of an array在数组的各个切片中矢量化 numpy 均值
【发布时间】:2016-07-24 09:42:27
【问题描述】:

有没有办法对函数进行矢量化,以便输出是一个均值数组,其中每个均值代表输入数组的 0-index 值的均值?循环这非常简单,但我试图尽可能高效。例如0 = 平均值(0),1 = 平均值(0-1),N = 平均值(0-N)

【问题讨论】:

  • 在这种情况下,数组的“0-index”是什么?
  • 数组的开头
  • 想知道这里发布的解决方案是否适合您?

标签: python algorithm numpy vectorization


【解决方案1】:

预期的操作可以创造cumulative averaging。因此,一个明显的解决方案将涉及cumulative summation 并将这些总和除以参与每个此类总和的元素数量。因此,矢量化实现将涉及np.cumsum,然后除以可以使用np.arange 获得的参与元素的数量,并泛化为 ndarray,就像这样 -

def cummean(A,axis):
    """ Cumulative averaging

    Parameters
    ----------    
    A    : input ndarray
    axis : axis along which operation is to be performed

    Output
    ------    
    Output : Cumulative averages along the specified axis of input ndarray
    """

    return np.true_divide(A.cumsum(axis),np.arange(1,A.shape[axis]+1))

【讨论】:

    【解决方案2】:

    如果您能够使用pandas,那么expanding_mean 将直接与 NumPy 数组一起使用:

    In [10]: pandas.expanding_mean(np.arange(1, 11))
    Out[10]: array([ 1. ,  1.5,  2. ,  2.5,  3. ,  3.5,  4. ,  4.5,  5. ,  5.5])
    

    此方法也适用于列:

    In [11]: A = np.array([[1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 
                           [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]).T
    
    In [12]: A
    Out[12]: 
    array([[ 1,  1],
           [ 2,  1],
           [ 3,  1],
           [ 4,  1],
           [ 5,  1],
           [ 6,  1],
           [ 7,  1],
           [ 8,  1],
           [ 9,  1],
           [10,  1]])
    
    In [13]: pandas.expanding_mean(A)
    Out[13]: 
    array([[ 1. ,  1. ],
           [ 1.5,  1. ],
           [ 2. ,  1. ],
           [ 2.5,  1. ],
           [ 3. ,  1. ],
           [ 3.5,  1. ],
           [ 4. ,  1. ],
           [ 4.5,  1. ],
           [ 5. ,  1. ],
           [ 5.5,  1. ]])
    

    【讨论】:

      猜你喜欢
      • 2021-10-13
      • 1970-01-01
      • 2011-10-16
      • 2015-01-08
      • 2014-08-15
      • 2021-09-13
      • 2012-03-30
      • 2013-04-15
      相关资源
      最近更新 更多