首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用xarray中的维度和数据来创建新的数据数组?

如何使用xarray中的维度和数据来创建新的数据数组?
EN

Stack Overflow用户
提问于 2021-07-20 21:44:03
回答 1查看 190关注 0票数 0

我在X阵列中遇到了与X阵列有关的问题。我想对数据集中已经存在的数据和坐标应用一个函数来计算一个新的数据集(实质上,w= f(x,y,z),其中x、y和z是浮动的)。

需要应用一系列函数,当一个新变量被拉进来时,结果数组的维数需要扩展。所以f(x)应该是一维数组,g(f(x),y)应该是2D,h(g(f(x),y),z)应该是从前一个二维数组创建的三维数组。我可以使用np.outer来强制进行一维-> 2D转换,但是我在2D -> 3D转换方面遇到了困难。考虑到我遇到了这么多麻烦,我怀疑我是从错误的方向来解决问题的。

下面是一些代码的片段。有人能帮我理解从NumPy/Xarray的角度来解决这个问题的正确方法吗?(我真的在努力避免陷入这个工作的循环中,…)

代码语言:javascript
运行
复制
import numpy as np
import xarray as xr

data = xr.Dataset(
    data_vars={
        "abs": (("x"), np.ones((200)))
    },
    coords={
        "x": np.linspace(1.5,1.55,200),
        "y": np.arange(5e5),
        "z": np.arange(125)
    }
)

def intensity_decay(da):
    "Return decay curve (exponential decay)."
    init_power = 1e5
    decay = init_power * np.exp(
        -1 * np.outer(da.abs, da.y * 10 ** (-7))
        )
    decay[decay < 1e-3] = 0
    return decay

data["depth_decay"] = (["x", "y"], intensity_decay(data))

def radial_decay(da):
    "Return radial decay curve."
    return np.outer(da.depth_decay, np.exp(-da.z))

radial_decay(data.isel(x=[1, 4, 10])).shape

如您所见,radial_decay函数不会广播到z维。看起来Xarray应该支持这种类型的操作,但是我不知道如何处理这个问题,甚至不知道从文档中从哪里开始。我目前有两个数据集,我想应用这些函数,所以我可以手工完成,但我想建立一个框架,我也可以使用未来的数据。

EN

回答 1

Stack Overflow用户

发布于 2021-07-26 17:40:41

在使用了这个答案中找到的函数结构之后,我能够得到一个正确形状的输出。

通过如下定义radial_decay函数,我可以得到一个三维输出数组。

代码语言:javascript
运行
复制
def radial_decay(da):
    "Return radial decay curve."
    da["radial_decay"] = (["x", "y", "z"], da.depth_decay * np.exp(-da.z))
    return da

使用这种结构,radial_decay(data.isel(x=[1, 4, 10])).radial_decay.shape的输出是(3, 500000, 125),而不是使用原始问题中定义的函数的(1500000,125)

虽然这似乎有效(我仍然需要验证这些值是否正确),但我想知道是否还有其他(更好的)?方法来实现这个目标,特别是如果有更好的方法使用NumPy来实现这个目标(以防将来由于某种原因而无法访问Xarray )。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68461688

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档