簡體   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