[英]How can I use dimensions and data in xarray to create a new array of data?
我在Xarray中遇到了 DataSet 的問題。 我想對數據集中已有的數據和坐標應用一個函數來計算一組新數據(本質上, w = f ( x, y, z ),其中x 、 y和z是浮點數)。
有一系列的函數需要應用,當拉入一個新的變量時,結果數組的維度需要擴展。所以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.