繁体   English   中英

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

[英]How can I use dimensions and data in xarray to create a new array of data?

我在Xarray遇到了 DataSet 的问题。 我想对数据集中已有的数据和坐标应用一个函数来计算一组新数据(本质上, w = f ( x, y, z ),其中xyz是浮点数)。

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

下面是部分代码的片段。 有人可以帮助我从 NumPy/Xarray 的角度理解解决这个问题的正确方法吗(我真的在努力避免陷入这个工作的循环......)

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 应该支持这种类型的操作,但我不知道如何解决这个问题,甚至不知道从文档中的哪里开始。 我目前有两个数据集,我想应用这些函数,所以我可以手工完成,但我想制作一个框架,我也可以在未来的数据上使用。

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

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

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 )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM