【发布时间】:2020-07-05 01:25:24
【问题描述】:
我通常编写代码,在其中我必须通过循环不同的选项(稍后将成为坐标)来创建一个 DataArray。自从我开始使用 Xarray 以来,我一直通过创建较小的 DataArrays 列表然后将它们连接起来:
import numpy as np
import xarray as xr
extradims = range(3)
size = 5
da_total = []
for cj, extradim in enumerate(extradims):
data = np.random.normal(scale=cj, size=size)
da = xr.DataArray(data, dims=['sample'], coords=dict(sample=range(size)))
da_total.append(da)
dafinal = xr.concat(da_total, dim='extradim').assign_coords(extradim=extradims)
但是,与 Xarray 所做的其他事情相比,这似乎非常麻烦。所以我想知道是否有更简单的方法我错过了。特别是,我想避免使用“外部”工具(如列表和 numpy),而只使用 Xarray 来完成所有工作。我得到的最接近的是这样做:
samples = range(5)
nans = np.full([len(extradims), len(samples)], np.nan)
dafinal2 = xr.DataArray(nans, dims=['extradim', 'sample'],
coords=dict(extradim=extradims, sample=samples))
for cj, extradim in enumerate(extradims):
data = np.random.normal(scale=cj, size=len(samples))
da = xr.DataArray(data, dims=['sample'], coords=dict(sample=samples))
dafinal2.loc[dict(extradim=extradim)] = da
这在循环中更加紧凑,但我想避免事先创建一个 NaNs 数组。在开始循环之前,我有时也不知道某些坐标的大小,所以最好避免这种情况。
理想情况下,我可以这样做:
dafinal3 = xr.DataArray(dims=['extradim', 'sample'])
for cj, extradim in enumerate(extradims):
data = np.random.normal(scale=cj, size=len(samples))
da = xr.DataArray(data, dims=['sample'], coords=dict(sample=samples))
dafinal2.loc[dict(extradim=extradim)] = da
但这当然行不通。
有没有办法实现我想要的?
【问题讨论】:
标签: python python-xarray