代码之家  ›  专栏  ›  技术社区  ›  Gabriel

通过加权平均提高掩蔽性能

  •  1
  • Gabriel  · 技术社区  · 7 年前

    func()

    面具的定义( msk )加权平均所占时间大致相同。可能没有办法比如何更快地获得加权平均数 numpy 正在这样做,但遮罩的定义至少可以改进吗?

    def func(weights, x1, x2, x3, x4):
        for x in (x2, x3, x4):
            # Mask of the distance between the column '-6' of x1 versus arrays
            # x2,x3,x4
            msk = abs(x1[-6] - x[-6]) > 0.01
            # If the distance in this array is larger than the maximum allowed,
            # mask with the values taken from 'x1'.
            x[:, msk] = x1[:, msk]
    
        # Weighted average for all the arrays.
        avrg_data = np.average(np.array([x1, x2, x3, x4]), weights=weights, axis=0)
    
        return avrg_data
    
    
    # Random data with proper shape
    x1, x2, x3, x4 = np.random.uniform(1., 10., (4, 10, 1000))
    weights = np.random.uniform(0.01, .5, 4)
    
    # Call many times and time it
    s = t.time()
    for _ in range(10000):
        func(weights, x1, x2, x3, x4)
    print(t.time() - s)
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   Bemmu    7 年前

    import time as t
    import numpy as np
    
    def func(weights, x1, x2, x3, x4):
        for x in (x2, x3, x4):
            # Mask of the distance between the column '-6' of x1 versus arrays
            # x2,x3,x4
            msk = abs(x1[-6] - x[-6]) > 0.01
    
            # If the distance in this array is larger than the maximum allowed,
            # mask with the values taken from 'x1'.
            x[:, msk] = x1[:, msk]
    
        # Weighted average for all the arrays.
        avrg_data = np.average(np.array([x1, x2, x3, x4]), weights=weights, axis=0)
    
        return avrg_data
    
    def faster_func(weights, x1, x2, x3, x4):
        for x in (x2, x3, x4):
            # Mask of the distance between the column '-6' of x1 versus arrays
            # x2,x3,x4
            msk = abs(x1[-6] - x[-6]) > 0.01
    
            # If the distance in this array is larger than the maximum allowed,
            # mask with the values taken from 'x1'.
            x[:, msk] = x1[:, msk]
    
        # Scale weights so they add up to 1, then add based on them
        weights = weights / np.mean(weights) / 4    
        avrg_data = x1*weights[0] + x2*weights[1] + x3*weights[2] + x4*weights[3]
    
        return avrg_data
    
    # Random data with proper shape
    x1, x2, x3, x4 = np.random.uniform(1., 10., (4, 10, 1000))
    weights = np.random.uniform(0.01, .5, 4)
    
    # Call many times and time it
    for method in (func, faster_func):
        s = t.time()
        for _ in range(10000):
            method(weights, x1, x2, x3, x4)
        print(method, t.time() - s)
    
    # Test that the results are still the same
    result1 = func(weights, x1, x2, x3, x4)
    result2 = faster_func(weights, x1, x2, x3, x4)
    biggest_difference = np.max(abs(result1-result2))
    print("Biggest difference between two methods was %.8f" % biggest_difference)