我在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的角度来解决这个问题的正确方法吗?(我真的在努力避免陷入这个工作的循环中,…)
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应该支持这种类型的操作,但是我不知道如何处理这个问题,甚至不知道从文档中从哪里开始。我目前有两个数据集,我想应用这些函数,所以我可以手工完成,但我想建立一个框架,我也可以使用未来的数据。
发布于 2021-07-26 17:40:41
在使用了这个答案中找到的函数结构之后,我能够得到一个正确形状的输出。
通过如下定义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 )。
https://stackoverflow.com/questions/68461688
复制相似问题