标签: python-xarray

在给定坐标的不规则网格上查找最近的地面像素

我使用在不规则二维网格上组织的卫星数据,其尺寸为扫描线(沿轨道尺寸)和地面像素(跨轨道尺寸)。每个地面像素的纬度和经度信息存储在辅助坐标变量中。

给定一个(纬度,经度)点,我想识别我的数据集上最接近的地面像素。

让我们构建一个 10x10 的玩具数据集:

import numpy as np
import xarray as xr
import cartopy.crs as ccrs
import matplotlib.pyplot as plt
%matplotlib inline

lon, lat = np.meshgrid(np.linspace(-20, 20, 10), 
                       np.linspace(30, 60, 10))
lon += lat/10
lat += lon/10
da = xr.DataArray(data = np.random.normal(0,1,100).reshape(10,10), 
                  dims=['scanline', 'ground_pixel'],
                  coords = {'lat': (('scanline', 'ground_pixel'), lat),
                            'lon': (('scanline', 'ground_pixel'), lon)})

ax = plt.subplot(projection=ccrs.PlateCarree())
da.plot.pcolormesh('lon', 'lat', ax=ax, cmap=plt.cm.get_cmap('Blues'), 
                   infer_intervals=True);
ax.scatter(lon, lat, transform=ccrs.PlateCarree())
ax.coastlines()
ax.gridlines(draw_labels=True)
plt.tight_layout()
Run Code Online (Sandbox Code Playgroud)

欧洲

请注意,纬度/经度坐标标识中心像素,像素边界由 xarray 自动推断。

现在,假设我想识别距离罗马最近的地面像素。

到目前为止,我想到的最好方法是在堆叠的扁平纬度/经度数组上使用 scipy 的 kdtree:

from scipy import …
Run Code Online (Sandbox Code Playgroud)

python numpy satellite scipy python-xarray

3
推荐指数
1
解决办法
2283
查看次数

使 DataArray 默认返回浮点数而不是 0 维数组

考虑下面使用 DataArray 的示例:

In [34]: import xarray as xr

In [35]: da=xr.DataArray(np.random.rand(5,5,5), dims=['x', 'y', 'z'], coords=dict(x=range(5), y=range(5), z=range(5)))

In [36]: da.mean()
Out[36]: 
<xarray.DataArray ()>
array(0.547996)
Run Code Online (Sandbox Code Playgroud)

均值运算返回的对象类型实际上是一个没有任何维度的 DataArray。然而,有时这很麻烦,我想xarray在那时返回一个好的旧浮动。这可能吗?理想情况下会有类似“xr.options.return_mode”或类似的东西(而不是必须在每个函数中使用额外的参数)。

numpy python-xarray

3
推荐指数
1
解决办法
1044
查看次数

重命名 xarray dataarray 中的 __xarray_dataarray_variable__

我使用 xarray concat 命令创建了一个 xarray 数据数组。这导致了一个名为 name 的数据数组__xarray_dataarray_variable__。但是,我似乎无法使用rename命令重命名它。还有其他方法可以重命名吗?

\n\n

我试过这个:

\n\n
da.rename({\'__xarray_dataarray_variable__\': \'new\'})\n
Run Code Online (Sandbox Code Playgroud)\n\n

但我收到此错误:*** ValueError: cannot rename \'__xarray_dataarray_variable__\' because it is not a variable or dimension in this dataset

\n\n

数据数组如下所示:

\n\n
<xarray.DataArray (time: 2, band: 1, y: 2334, x: 4258)>\ndask.array<shape=(2, 1, 2334, 4258), dtype=float32, chunksize=(1, 1, 2334, 4258)>\nCoordinates:\n  * band     (band) int32 1\n  * y        (y) float64 4.406e+06 4.406e+06 4.406e+06 4.406e+06 4.406e+06 ...\n  * x        (x) float64 1.125e+05 1.126e+05 1.127e+05 1.128e+05 1.129e+05 ...\n …
Run Code Online (Sandbox Code Playgroud)

python numpy python-xarray

3
推荐指数
1
解决办法
3901
查看次数

使用xarray创建netCDF文件,定义变量数据类型

我使用 xarray 创建了一个 netCDF 文件,用于将地形高度信息、表面类型信息等输入到数值天气预报模型中。我设法创建了一个文件,但是,该模型要求不同的变量是不同的数据类型。

我的数据集 bolund_static 如下所示:

<xarray.Dataset>
Dimensions:          (x: 800, y: 200)

Coordinates:
  * y                (y) float64 1.0 3.0 5.0 7.0 9.0 ... 393.0 395.0 397.0 399.0
  * x                (x) float64 1.0 3.0 5.0 ... 1.595e+03 1.597e+03 1.599e+03
Data variables:
    zt               (y, x) float64 1.0 1.0 1.0 1.0 1.0 ... 1.0 1.0 1.0 1.0 1.0
    vegetation_type  (y, x) float64 -127.0 -127.0 -127.0 ... -127.0 -127.0
    water_type       (y, x) float64 3.0 3.0 3.0 3.0 3.0 ... 3.0 3.0 3.0 …
Run Code Online (Sandbox Code Playgroud)

netcdf python-xarray

3
推荐指数
1
解决办法
2153
查看次数

以附加到列表作为结果的多处理 for 循环

我需要并行化 for 循环。我当前的代码是循环遍历从 xarray 数据集中获取的 id 列表,从 xarray 数据集中获取具有当前 id 的行数据,调用函数(计算数据的三角分布),附加结果分布将函数转换为列表,完成后,它将列表转换为 xarray 数据集,其中每个结果都链接到当前的 id,因此稍后可以通过 ID 将这个数据集附加到“主”数据集。

我的代码看起来有点像这样:

from sklearn.preprocessing import MinMaxScaler
import xarray as xr
import scipy.stats as st

function call_func(data):
   scaler = MinMaxScaler()
   norm_data = scaler.fit_transform(np.reshape(data, (len(data),1)))
   params = st.triang.fit(norm_data)
   arg,loc,scale = params[:-2],params[-2],params[-1]
   dist = st.triang(loc=loc, scale=scale, *arg)
   return dist

if __name__ == "__main__":
for id in my_dataset['id'].values:
        row_data= my_dataset.sel(id=id)['data'].values[0]
        if len(row_data)>3 and all(row_data== 0) == False:
                result = call_func(row_data)
                result_list.append(result)
        else:
            result_list.append([])

new_dataset = xr.Dataset({'id': my_dataset['id'].values,
                          'dist_data':(['id','dist'],
                           np.reshape(np.array(result_list),(len(result_list),1))) …
Run Code Online (Sandbox Code Playgroud)

python for-loop append multiprocessing python-xarray

3
推荐指数
1
解决办法
5203
查看次数

使用坐标因变量对 xarray 数据集进行切片

我在 python3 中构建了一个 xarray 数据集,其中包含(time, levels)一天观测期间识别所有云底和云顶的坐标。该变量levels是在给定时间可以识别的云底/云顶的维度。它存储每次的云底/最高高度值。

现在我想选择位于给定高度范围内随时间变化的所有云底和顶部。高度范围由数组bottom_mod和标识top_mod。这些数组具有time维度并包含要选择的高度范围的边缘。

xarray 数据集是cloudStandard_mod_reshaped

Dimensions:     (levels: 8, time: 9600)
Coordinates:
  * levels      (levels) int64 0 1 2 3 4 5 6 7
  * time        (time) datetime64[ns] 2013-04-14 ... 2013-04-14T23:59:51
Data variables:
    cloudTop    (time, levels) float64 nan nan nan nan nan ... nan nan nan nan
    cloudThick  (time, levels) float64 nan nan nan nan nan ... nan nan nan nan
    cloudBase   (time, levels) float64 …
Run Code Online (Sandbox Code Playgroud)

dataset slice python-3.x python-xarray

3
推荐指数
1
解决办法
4914
查看次数

在 xarray 中取一个“nanmean”

我知道我可以使用 numpy nanmean 函数来获取 numpy 数组的平均值,同时忽略 NaN 值。有没有类似的方法可以用 xarray 来实现这一点?我将举一个例子...

numpy_array=[1,2,3,4,float('nan'),5]

np.mean(numpy_array)
> NaN

np.nanmean(numpy_array)
> 3.0
Run Code Online (Sandbox Code Playgroud)

在 xarray 中,我可以做

xarray_example.mean(dim='dimension')
Run Code Online (Sandbox Code Playgroud)

我怎样才能将其更改为nanmean?

谢谢。

python numpy nan python-xarray

3
推荐指数
1
解决办法
3930
查看次数

open_mfdataset 与 xarray 无法找到坐标

我正在尝试下载一堆 GOES-16 辐射数据并在 xarray 中将其全部打开以使用该xr.open_mfdataset()函数进行分析。这些 netcdf 文件有一个坐标t,它是我尝试用作连接的时间戳,但当我ValueError: Could not find any dimension coordinates to use to order the datasets for concatenation尝试执行此操作时出现错误。这是我的代码以及下载两个示例 .nc 文件的链接。

下载两个文件:

wget https://noaa-goes16.s3.amazonaws.com/ABI-L1b-RadF/2019/141/02/OR_ABI-L1b-RadF-M6C14_G16_s20191410240370_e20191410250078_c20191410250143.nc
wget https://noaa-goes16.s3.amazonaws.com/ABI-L1b-RadF/2019/141/03/OR_ABI-L1b-RadF-M6C14_G16_s20191410310370_e20191410320078_c20191410320142.nc
Run Code Online (Sandbox Code Playgroud)

和代码:

import xarray as xr
ds_sst = xr.open_mfdataset("OR_ABI-L1b-RadF*nc", concat_dim='t',combine='by_coords')
Run Code Online (Sandbox Code Playgroud)

我可以做些什么来完成这项工作,以便我可以一起打开几十个这样的文件吗?

python netcdf python-xarray

3
推荐指数
1
解决办法
5852
查看次数

如何调整 xarray 图中的 Matplotlib 颜色条范围?

我有一个看起来像这样的情节

伪彩色贴图

我无法理解如何手动更改或设置颜色条的数据值范围。我想根据图中显示的数据值尝试范围,并将颜色条更改为 (-4,4)。我看到plt.clim,vminvmax是可能使用的函数。

这是我的代码:

import cdsapi
import xarray as xr
import matplotlib.pyplot as plt
import numpy as np
import cartopy.crs as ccrs
# Also requires cfgrib library.

c = cdsapi.Client()

url = c.retrieve(
    'reanalysis-era5-single-levels-monthly-means',
    {
        'product_type': 'monthly_averaged_reanalysis',
        'format': 'grib',
        'variable': ['100m_u_component_of_wind','100m_v_component_of_wind'],
        'year': ['2006','2007','2008','2009','2010','2011','2012','2013','2014','2015','2016','2017','2018','2019','2020','2021'],
        'month': ['01','02','03','04','05','06','07','08','09','10','11','12'],
        'time': '00:00',
        'grid': [0.25, 0.25],
        'area': [70.00, -180.00, -40.00, 180.00],
    },
    "C:\\Users\\U321103\\.spyder-py3\\ERA5_MAPPING\\100m_wind_U_V.grib")
path = "C:\\Users\\U321103\\.spyder-py3\\ERA5_MAPPING\\100m_wind_U_V.grib"
ds = xr.load_dataset(path, engine='cfgrib')

wind_abs = np.sqrt(ds.u100**2 + ds.v100**2)
monthly_means = wind_abs.mean(dim='time')
wind_abs_clim = …
Run Code Online (Sandbox Code Playgroud)

python matplotlib colorbar python-xarray

3
推荐指数
1
解决办法
6566
查看次数

如何更改 matplotlib 四网格中的颜色条标签

我有一个 xarray DataArray,其坐标间隔不均匀,如下所示:

print(da)

<xarray.DataArray 'Sa' (y: 679, x: 87)>
array([[1.      , 0.677667, 0.658552, ..., 0.583562, 0.443248, 0.366353],
       [0.799933, 0.929478, 1.      , ..., 0.386675, 0.316399, 0.284364],
       [0.952748, 0.844993, 0.793359, ..., 0.724242, 0.554958, 0.295785],
       ...,
       [0.983343, 0.98983 , 1.      , ..., 0.601416, 0.592084, 0.586747],
       [0.997548, 1.      , 0.99682 , ..., 0.596712, 0.591876, 0.58533 ],
       [0.995427, 1.      , 0.990861, ..., 0.581317, 0.588433, 0.585797]])
Coordinates:
  * y        (y) float64 -0.1274 -0.1224 -0.1174 -0.1124 ... 3.253 3.258 3.263
  * x        (x) float64 4.002 3.971 …
Run Code Online (Sandbox Code Playgroud)

python matplotlib python-xarray

3
推荐指数
1
解决办法
2124
查看次数