使用 dask 将二次多项式拟合到滚动窗口值的最快方法?

问题描述 投票:0回答:1

我有一个 36k x 3k(行、列)的大数据集,我想将二次多项式拟合到以每列的每个值为中心的一维滚动窗口(大小=n)的值。我知道这是一项非常昂贵的操作,我想尽快完成。 在创建 dask 数组 chuncked (500 x 3k) 之后,我尝试使用两种方法获取每个二次拟合的系数:

  1. 有了
    scipy.generic_filter()

    generic_filter(scene2, function=curvature, footprint=footprint, extra_arguments=(x,)).compute()

使用仅考虑沿列值的足迹。这个过滤器使用的函数如下,

def curvature(neigh, x):
    c, b, a = Polynomial.fit(x, neigh, 2).coef
    return 2*a

但是,我不认为我并行化得很好(而且计算需要很长时间)。

我所做的另一次尝试(失败)是使用以下功能:

def window_curve_fit(arr, deg=2, size=3, x_step=0.01,**kwargs):
    #
    values= []
  
    # create x
    x = np.linspace(x_step, size*x_step, size)
    
    # process each element
    for y in sliding_window_view(arr, size, **kwargs):
        c,b,a= [Polynomial.fit(x, y, deg).coef]
        values += [2*a]

    return values

并使用以下行,

rslt= da.map_blocks(window_curve_fit, scene2, 2, 5, 0.01, dtype= np.float32, axis=1).compute()

最后一个给了我以下我不太明白的错误。

...

AttributeError: 'numpy.ndarray' object has no attribute 'chunks'
python numpy scipy dask
1个回答
0
投票

你试过和

scipy.signal.savgol_coeff
scipy.signal.savgol_filter
一起工作吗?

© www.soinside.com 2019 - 2024. All rights reserved.