我目前正在处理一些海洋模型输出。在每个时间步,它有 42*1800*3600 个网格点。
我发现我的程序中的瓶颈是切片,并调用 xarray_built in 方法来提取值。更有趣的是,相同的语法有时需要截然不同的时间。
ds = xarray.open_dataset(filename, decode_times=False)
vvel0=ds.VVEL.sel(lat=slice(-60,-20),lon=slice(0,40))/100 #in CCSM output, unit is cm/s convert to m/s
uvel0=ds.UVEL.sel(lat=slice(-60,-20),lon=slice(0,40))/100 ## why the speed is that different? now it's regional!!
temp0=ds.TEMP.sel(lat=slice(-60,-20),lon=slice(0,40)) #de
Run Code Online (Sandbox Code Playgroud)
以此为例,读取 VVEL 和 UVEL 需要约 4 秒,而读取 TEMP 只需要约 6 毫秒。在没有切片的情况下,VVEL 和 UVEL 需要大约 1 秒,而 TEMP 需要 120 纳秒。
我一直认为,当我只输入完整数组的一部分时,我需要的内存更少,因此时间更少。事实证明,XARRAY 加载到完整数组中,任何额外的切片都需要更多时间。但是,有人可以解释为什么从同一个 netcdf 文件中读取不同的变量需要不同的时间吗?
该程序旨在提取逐步截面,并计算横截面热传输,因此我需要选择 UVEL 或 VVEL,乘以沿截面的 TEMP。所以,看起来,在 TEMP 中加载这么快是好的,不是吗?
不幸的是,情况并非如此。当我沿着规定的部分循环大约 250 个网格点时......
# Calculate VT flux orthogonal to the chosen grid cells, which is …Run Code Online (Sandbox Code Playgroud) 我有这个包含全球气温的样本数据集,更重要的是,一个 mask land,标记陆地/非水域区域。
<xarray.Dataset>
Dimensions: (lat: 55, lon: 143, time: 5)
Coordinates:
* time (time) datetime64[ns] 2016-01-01 2016-01-02 2016-01-03 ...
* lat (lat) float64 -52.5 -50.0 -47.5 -45.0 -42.5 -40.0 -37.5 -35.0 ...
* lon (lon) float64 -177.5 -175.0 -172.5 -170.0 -167.5 -165.0 -162.5 ...
land (lat, lon) bool False False False False False False False False ...
Data variables:
airt (time, lat, lon) float64 7.952 7.61 7.389 7.267 7.124 6.989 ...
Run Code Online (Sandbox Code Playgroud)
我现在可以掩盖海洋并绘制它
dry_areas = ds.where(ds.land)
dry_areas.airt.plot()
Run Code Online (Sandbox Code Playgroud)
希望是一个快速的。我无法从文档或此处的问题中找出如何执行此操作。
我想提取坐标变量的值。
例如,我创建一个DataArray为:
import xarray as xr
import numpy as np
import pandas as pd
years_arr=range(1982,1986)
time = pd.date_range('14/1/' + str(years_arr[0]) + ' 12:00:00', periods=len(years_arr), freq=pd.DateOffset(years=1))
lon = range(20,24)
lat = range(10,14)
arr1 = xr.DataArray(data, coords=[time, lat, lon], dims=['time', 'latitude', 'longitude'])
Run Code Online (Sandbox Code Playgroud)
我现在想从arr1输出lon值。我要求arr1进入函数,所以我可能没有lon值可用。
干杯,雷
我想根据特定组对 xarray 数据集进行下采样,因此我使用的groupby是选择组,然后在每个组中抽取 10% 的样本。我正在使用下面的代码,但我得到IndexError: index 1330 is out of bounds for axis 0 with size 1330它向我表明我的函数正在返回一个空数组,但subset绝对具有非零维度。
squeeze=True根据GroupBy 文档,我正在使用我认为可以允许新维度的内容,但这没有帮助,所以我将其更改为squeeze=False.
你知道会发生什么吗?谢谢!
# Set random seed for reproducibility
np.random.seed(0)
def select_random_cell_subset(x):
size = int(0.1 * len(x.cell))
random_cells = sorted(np.random.choice(x.cell, size=size, replace=False))
print('number of random cells:', len(random_cells))
print('\tsome random cells:', random_cells[:5])
subset = x.sel(cell=random_cells)
print('subset:', subset)
return subset
# squeeze=False because the final dataset is smaller than the original
ds_subset …Run Code Online (Sandbox Code Playgroud) 我有一个相当大xr.Dataset的大约 20 个数据变量。我只对保留其中两个感兴趣。我看到xr.Dataset.drop数据集的 drop 变量。
我正在寻找保持变量的语法。我试过f['hs','t01']了
回溯(最近一次调用):文件“/nethome/rxb826/local/bin/miniconda3/lib/python3.6/site-packages/xarray/core/dataset.py”,第 662 行,_construct_dataarray 变量 = self._variables [名称] KeyError: ('hs', 't01')
如果没有简单的语法,我可以看看开发 xr.Dataset.keep
我也可以笨拙地手动创建数据集
ds = xr.Dataset({'hs': f['hs'], 't01': f['t01']})
xarray 的文档解释了如何计算每月climatology 的异常值。在这里,我试图做一些稍微不同的事情:从每日时间序列,我想计算本月平均值(而不是每月气候学)的每日异常。
我设法使用 groupby 和手动创建的每月邮票(下面的代码)来做到这一点。有没有更好、更简单的方法来获得相同的结果?
import xarray as xr
import numpy as np
import pandas as pd
# Create a data array
t = pd.date_range('2001', '2003', freq='D')
da = xr.DataArray(np.arange(len(t)), coords={'time':t}, dims='time')
# Monthly time stamp for groupby
da.coords['stamp'] = ('time', [str(y) + '-' + str(m) for (y, m) in
zip(da['time.year'].values,
da['time.month'].values)])
# Anomaly
da_ano = da.groupby('stamp') - da.groupby('stamp').mean()
da_ano.plot();
Run Code Online (Sandbox Code Playgroud)
我有大量(200 多个)netCDF 文件,这些文件按日期/时间进行索引,并包含单个位置 3 小时的降水测量值,涵盖 20 年,下面显示了一个简短的示例。
ppt latitude longitude
time
2017-03-01 00:00:00 0.00 16.625 -62.375
2017-03-01 03:00:00 0.00 16.625 -62.375
2017-03-01 06:00:00 0.00 16.625 -62.375
2017-03-01 09:00:00 0.00 16.625 -62.375
2017-03-01 12:00:00 0.00 16.625 -62.375
2017-03-01 15:00:00 0.00 16.625 -62.375
Run Code Online (Sandbox Code Playgroud)
每个文件都包含一个月的数据。我的目标是将所有这些文件连接成一个包含 20 年所有数据的文件。到目前为止,我已经推断出一种可能的前进方式是从每个 netCDF 文件中提取数据并将它们放入一个数据帧中:
import xarray as xr
import pandas as pd
ds = xr.open_dataset('ppt_1_201703.nc')
df = ds.to_dataframe()
Run Code Online (Sandbox Code Playgroud)
如果我有少量文件,使用 concat([df, df2, df3]) 就足够了,我会手动从每个 netCDF 文件中提取数据。然而,对于如此大量的文件,这种方法至少可以说是耗时的。
到目前为止,我的想法是相信最好的方法是一个 for 循环,它根据每个文件的名称循环遍历每个文件并为每个文件生成一个数据帧。然后我需要另一个 for 循环来连接每个数据帧。
我正在纠结如何构建这些循环。文件名是这样的:
ppt_1_199801.nc
ppt_1_199802.nc
ppt_1_199803.nc
...
ppt_1_201610.nc
ppt_1_201611.nc
ppt_1_201612.nc …Run Code Online (Sandbox Code Playgroud) 我有一个(大)多维 xarray 数据数组或数据集,并且想沿着一维路径选择或插入数据,而没有缓慢的循环或列表理解(例如,在纬度和经度上定义了二维数据,我想获取数据沿着由纬度和经度给出的路径):
import xarray as xr
import numpy as np
lats, lons = np.arange(0, 6), np.arange(10, 17)
path_lats, path_lons = np.arange(0.3, 5, 0.5), np.arange(10.6, 15.6, 0.5)
da = xr.DataArray(np.random.rand(len(lats), len(lons)), coords=[lats, lons], dims=['latitude', 'longitude'])
Run Code Online (Sandbox Code Playgroud)
下面返回一个包含 path_lats 和 path_lons 的所有组合的 2D DataArray,类似于使用 itertools.product(path_lats, path_lons) 的 for 循环:
da_path = da.interp(latitude=path_lats, longitude=path_lons)
Run Code Online (Sandbox Code Playgroud)
对于大于二维的更大的 Dataarrays\Datasets,这将消耗大量内存,因为它包含大量此任务不需要的数据。
我想要的是使用 zip(path_lats, path_lons) 的 for 循环 \ 列表理解的快速版本,例如(此处无效语法)
da_pathZIP = da.interp((latitude, longitude) = (path_lats, path_lons))
Run Code Online (Sandbox Code Playgroud)
这将返回一个一维数据数组(坐标:路径的索引),可能还有数据附加的纬度和经度。生成的 Dataarray 应包含以下数据:
[float(da.interp(latitude=p_lat, longitude=p_lon)) for p_lat, p_lon in zip(path_lats, path_lons)]
Run Code Online (Sandbox Code Playgroud)
在不使用循环的情况下,这可以在 …
我有一个 NetCDF 文件,其中的变量存储在 0 到 360 度经度。我想将其转换为 -180 到 180 度。这应该是一项相当简单的任务,但出于某种原因,我似乎无法使教程中给出的一些示例得到解决。
ds = xr.open_dataset(file_)
>ds
<xarray.Dataset>
Dimensions: (lev: 1, lon: 720, time: 1460)
Coordinates:
* lon (lon) float64 0.0 0.5 1.0 1.5 2.0 2.5 ... -2.5 -2.0 -1.5 -1.0 -0.5
* lev (lev) float32 1.0
* time (time) datetime64[ns] 2001-01-01 ... 2001-12-31T18:00:00
Data variables:
V (time, lev, lon) float32 13.281297 11.417505 ... -19.312767
Run Code Online (Sandbox Code Playgroud)
我尝试使用Dataset.assign_coord的帮助
ds.V.assign_coords(lon=((ds.V.lon + 180) % 360 - 180))
#gives me a new array with lon …Run Code Online (Sandbox Code Playgroud) 我是一名 matlab 用户,最近尝试更多地使用 Python 进行计算。我正在使用 xarray 并希望将我的经度数组从地球物理场的 0 - 360 更改为 -180 到 180。但是当我这样做时:
df=xr.open_dataset(ecmwf_winds.nc)
u10=df['u10']
lon=df['longitude']
lon = np.where(lon > 180, lon-360, lon)
[X,Y]=np.meshgrid(lon,df.latitude)
plt.contourf(X,Y,u10)
Run Code Online (Sandbox Code Playgroud)
等高线图因间隙而变得凌乱,这是没有意义的。任何人都可以帮我解决这个问题。我不确定我哪里做错了。