python - 使用 scipy.stats 拟合 xarray DataArray
问题描述
我想计算在 xarray.DataArray 的时间维度上拟合的统计分布的参数。
我想创建一个执行以下操作的函数:
from scipy import stats
import xarray as xr
def fit(arr):
return xr.apply_ufunc(stats.norm.fit, arr, ...)
它返回一个新的 DataArray,存储在时间维度上计算的分布的两个参数。因此,如果输入具有维度(时间、纬度、经度),拟合将返回具有维度(参数、纬度、经度)的 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
解决方案
Dask 数组包括 apply_along_axis 的类似物,可能是最明显的起点。请注意,设置了块的 xarray 的每个变量都会自动在.data
属性中封装一个 dask 数组。您甚至可以直接传递 xarray 变量。
推荐阅读
- python - 将元组插入空的熊猫数据框中
- jenkins - 如何连接到作为 Jenkins 管道运行的服务器
- here-api - HERE 地图交通 API 方向
- sql - 如何在 OrientDB SQL 中“描述”一个类、索引或其他对象?
- python - Keras 2D 输入到 2D 输出
- ios - 向现有数据模型添加新实体会导致用户数据消失(轻量级核心数据迁移不起作用)
- c++ - What is better practice? Pass class member by pointer or identifier?
- cakephp - CakePHP 3.4:使用联合结果集进行分页显示重复记录
- python - 使用 Tkinter 打破其父网格的图像
- python - 运行 subprocess.Popen 时在 Python 中关闭弹出警报