【发布时间】:2020-03-06 19:42:57
【问题描述】:
我有一个 4D xarray 数据集。我想在特定维度(此处为时间)上的两个变量之间进行线性回归,并将回归参数保留在 3D 数组(其余维度)中。 我设法通过使用此串行代码获得了我想要的结果,但它相当慢:
# add empty arrays to store results of the regression
res_shape = tuple(v for k,v in ds[x].sizes.items() if k != 'year')
res_dims = tuple(k for k,v in ds[x].sizes.items() if k != 'year')
ds[sl] = (res_dims, np.empty(res_shape, dtype='float32'))
ds[inter] = (res_dims, np.empty(res_shape, dtype='float32'))
# Iterate in kept dimensions
for lat in ds.coords['latitude']:
for lon in ds.coords['longitude']:
for duration in ds.coords['duration']:
locator = {'longitude':lon, 'latitude':lat, 'duration':duration}
sel = ds.loc[locator]
res = scipy.stats.linregress(sel[x], sel[y])
ds[sl].loc[locator] = res.slope
ds[inter].loc[locator] = res.intercept
我怎样才能加速和并行化这个操作?
我知道apply_ufunc 可能是一个选项(并且可以与 dask 并行),但我没有设法正确设置参数。
以下问题相关但没有答案:
- Applying numpy.polyfit to xarray Dataset
- Python: How to find regression equation of multiple 3D (lat-lon-time-value) dataArrays?
- calculating cross-correlation function in xarray
编辑 2:将之前的编辑移至答案
【问题讨论】:
-
纬度和经度不是要一起考虑的吗?给两个点(x1,y1)和(x2,y2),为什么要迭代(x1,y1),(x1,y2),(x2,y1),(x2,y2)?
-
@JohnZwinck 两个点可能在同一纬度,但经度不同。
-
是的。您不应该迭代 (x,y) 对,而不是所有 x 与所有 y 的笛卡尔积吗?
标签: python dask python-xarray