You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在xarray Dataset中按坐标逐点应用自定义函数?

在xarray Dataset中按坐标逐点应用自定义函数

假设我有一个通过以下代码生成的xarray Dataset,命名为ds:

import pandas as pd
import pymc as pm
import numpy as np

data = pd.DataFrame(dict(
    r = pm.Uniform.dist(shape=100).eval(),
    h = pm.Normal.dist(3, 0.5, shape=100).eval(),
    t = range(100)
)).set_index('t')
    
ds = data.to_xarray()

此时,t序列成为坐标,数据集包含两个数据变量(数据数组)r和h。

现在我有如下自定义函数:

def vol(r, h):
    return h * r ** 2 * np.pi

请问如何在该xarray数据集中按坐标逐点应用此函数?最终我希望得到一个与原坐标t一致的DataArray。

在原始的pandas DataFrame中,我可以通过以下代码实现相同效果:

data.apply(lambda row: vol(row.r, row.h), axis=1)

解决方案

方法1:直接向量化调用(最简单)

xarray的DataArray原生支持向量化运算,直接将对应变量传入函数即可自动按t维度逐点计算:

vol_da = vol(ds['r'], ds['h'])

返回的vol_da是与原数据集t坐标完全一致的DataArray。

方法2:使用xarray.apply_ufunc(通用场景)

如果函数本身非向量化,或需要更精细的维度控制,可使用apply_ufunc处理:

import xarray as xr

vol_da = xr.apply_ufunc(
    vol,
    ds['r'],
    ds['h'],
    vectorize=True
)

该方法会自动处理维度对齐,保留xarray的元数据信息。

方法3:用Dataset.apply对齐pandas逻辑

若想和pandas的apply逻辑保持一致,可指定按t维度逐行处理:

vol_da = ds.apply(lambda row: vol(row['r'], row['h']), dim='t')

内容的提问来源于stack exchange,提问作者vonPetrushev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 23:05:24