【问题标题】:Using scipy.stats to fit xarray DataArray使用 scipy.stats 拟合 xarray DataArray
【发布时间】:2018-09-21 05:15:41
【问题描述】:

我想计算在 xarray.DataArray 的时间维度上拟合的统计分布的参数。

我想创建一个执行以下操作的函数:

from scipy import stats
import xarray as xr

def fit(arr):
    return xr.apply_ufunc(stats.norm.fit, arr, ...)

返回一个新的 DataArray,存储在时间维度上计算的分布的两个参数。因此,如果输入具有维度(时间、纬度、经度),则 fit 将返回具有维度(参数、纬度、经度)的 DataArray。下一步是使用这些参数来计算各种百分位数(例如 stats.norm.ppf)。

经过多次不成功的试验,我怀疑 apply_ufunc 是否支持这个用例,我应该更愿意使用来进行计算

params = np.apply_along_axis(stats.norm.fit, arr.get_axis_num('time'), arr.data)

然后手动创建 DataArray,复制维度和属性。

想法?有什么建议吗?


这是我最终做的,感觉有点像黑客:

# Fit the parameters (lazy computation)
data = dask.array.apply_along_axis(dc.fit, arr.get_axis_num('time'), arr)

# Create a DataArray with the desired dimensions to copy them over to the parameter array.
mean = arr.mean(dim='time', keep_attrs=True)
coords = dict(mean.coords.items())
coords['dparams'] = ([] if dc.shapes is None else dc.shapes.split(',')) + ['loc', 'scale']
out = xr.DataArray(data=data, coords=coords, dims=(u'dparams',) + mean.dims)
out.attrs = arr.attrs

【问题讨论】:

  • 正态分布是您想要拟合的唯一分布,还是您仅将其用作 some 分布的示例?
  • 只是一个例子,我希望能够从 scipy 列表中选择任何发行版。
  • 你有什么运气吗?我正在尝试使用 sp.stats 中的测试功能。我得到一个神秘的 ValueError:沿维度 'dim' 的索引不相等

标签: python scipy dask python-xarray


【解决方案1】:

Dask 数组包含apply_along_axis 的类似物,可能是最明显的起点。请注意,设置了块的 xarray 的每个变量都会自动将 dask 数组封装在 .data 属性中。您甚至可以直接传递 xarray 变量。

【讨论】:

  • 谢谢,我确实可以直接传递xarray变量,得到结果数组。但是,我仍然丢失了“数据集”信息(维度、元数据等)。
猜你喜欢
  • 1970-01-01
  • 2021-10-08
  • 2019-01-18
  • 2017-01-30
  • 2022-01-17
  • 1970-01-01
  • 1970-01-01
  • 2017-10-10
  • 2020-10-26
相关资源
最近更新 更多