标签: python-xarray

xarray中的布尔索引

我有一些昏暗的数组,'time', 'lat', 'lon'有些只是'lat', 'lon'。为了使用2d(纬度)掩码来掩盖时间相关的数据,我经常必须这样做:

x.data[:, mask.data] = np.nan
Run Code Online (Sandbox Code Playgroud)

当然,计算会按预期进行广播。如果y是2d纬度数据,则将其值广播到x中的所有时间坐标:

z = x + y
Run Code Online (Sandbox Code Playgroud)

但是索引不会像我期望的那样广播。我希望能够执行此操作,但是会引发ValueError:缓冲区的维数错误

x[mask] = np.nan
Run Code Online (Sandbox Code Playgroud)

最后,似乎xr.where 确实按预期跨时间坐标广播了掩码的值,但是您不能以这种方式设置值。

x_masked = x.where(mask)
Run Code Online (Sandbox Code Playgroud)

因此,在这里我缺少什么可以使用缺少尺寸(并且需要广播)的布尔掩码方便设置值的方法吗?我在顶部提供的选项确实是执行此操作的方式吗(在这种情况下,我不妨使用标准的numpy数组...)

python numpy python-xarray

9
推荐指数
1
解决办法
1099
查看次数

xarray 选择最近的纬度/经度与多维坐标

我有一个具有不规则间隔纬度和经度坐标的 xarray 数据集。我的目标是在最接近某个纬度/经度的点处找到变量的值。

由于xy尺寸不是纬度/经度值,因此ds.sel()在这种情况下似乎不能单独使用该方法。是否有一种以 xarray 为中心的方法来通过参考多维纬度/经度维度来定位最接近所需纬度/经度的点?例如,我想提取最接近lat=21.2和的 SPEED 值lon=-122.68

下面是一个示例数据集...

lats = np.array([[21.138  , 21.14499, 21.15197, 21.15894, 21.16591],
                 [21.16287, 21.16986, 21.17684, 21.18382, 21.19079],
                 [21.18775, 21.19474, 21.20172, 21.2087 , 21.21568],
                 [21.21262, 21.21962, 21.22661, 21.23359, 21.24056],
                 [21.2375 , 21.2445 , 21.25149, 21.25848, 21.26545]])  

lons = np.array([[-122.72   , -122.69333, -122.66666, -122.63999, -122.61331],
                 [-122.7275 , -122.70082, -122.67415, -122.64746, -122.62078],
                 [-122.735  , -122.70832, -122.68163, -122.65494, -122.62825],
                 [-122.7425 , -122.71582, -122.68912, -122.66243, -122.63573],
                 [-122.75001, -122.72332, -122.69662, -122.66992, …
Run Code Online (Sandbox Code Playgroud)

python python-xarray

9
推荐指数
3
解决办法
5854
查看次数

xarray 反向插值(在坐标上,而不是在数据上)

我有以下 DataArray

arr = xr.DataArray([[0.33, 0.25],[0.55, 0.60],[0.85, 0.71],[0.92,0.85],[1.50,0.96],[2.5,1.1]],[('x',[0.25,0.5,0.75,1.0,1.25,1.5]),('y',[1,2])])

Run Code Online (Sandbox Code Playgroud)

这给出了以下输出

<xarray.DataArray (x: 6, y: 2)>
array([[0.33, 0.25],
       [0.55, 0.6 ],
       [0.85, 0.71],
       [0.92, 0.85],
       [1.5 , 0.96],
       [2.5 , 1.1 ]])
Coordinates:
  * x        (x) float64 0.25 0.5 0.75 1.0 1.25 1.5
  * y        (y) int32 1 2
Run Code Online (Sandbox Code Playgroud)

或为方便起见,将 x 和输出 (z) 排列在下面。

x         z (y=1)   z(y=2)
0.25      0.33      0.25
0.50      0.55      0.60
0.75      0.85      0.71
1.00      0.92      0.85
1.25      1.50      0.96
1.50      2.50      1.10
Run Code Online (Sandbox Code Playgroud)

我拥有的数据是几个输入值的结果。其中之一是 x 值。其他输入值还有其他几个维度(例如 y)。我想知道我的输出值 (z) 何时增长大于 …

python interpolation python-xarray

9
推荐指数
2
解决办法
664
查看次数

xarray 相当于 np.reshape

我有一个 3d 数组 (10x10x3),由于某种原因,它被保存为 2d xr.DataArray (100x3)。它看起来有点像这样:

data = xr.DataArray(np.random.randn(100, 3),
                    dims=('ct', 'x'),
                    coords={'ct': range(100)})

c = [x%10 for x in range(100)]
t = [1234+x//10 for x in range(100)]
Run Code Online (Sandbox Code Playgroud)

c 和 t 是在 ct 中捆绑在一起的坐标。

过去我已经解决了分离二维的问题,如下:

t_x_c,x = data.shape
nc = 10
data = np.reshape(data.values,(t_x_c//nc,nc, x))
Run Code Online (Sandbox Code Playgroud)

但这需要数据结构中的许多假设,这些假设在不久的将来可能不成立(例如,c 和 t 可能不像我的示例中那样规则)。

我已设法将 c 和 t 作为附加坐标分配给数组:

data2 = data.assign_coords(
    coords={"c": ("ct", c),
            "t": ("ct", t),
},)
Run Code Online (Sandbox Code Playgroud)

但我想将它们提升到数组的维度。我该怎么做呢?

python numpy python-xarray

9
推荐指数
1
解决办法
5158
查看次数

在xarray中过滤数据的简明方法

我需要对xarray数组中的值应用一个非常简单的'match statement':

  1. 值> 0时,使2
  2. 值== 0时,设为0
  3. 价值在哪里NaN,制造NaN

这是我目前的解决方案.我正在使用NaNs ,, .fillna和类型强制来代替2d索引.

valid = date_by_items.notnull()
positive = date_by_items > 0
positive = positive * 2
result = positive.fillna(0.).where(valid)
result
Run Code Online (Sandbox Code Playgroud)

这改变了这个:

In [20]: date_by_items = xr.DataArray(np.asarray((list(range(3)) * 10)).reshape(6,5), dims=('date','item'))
    ...: date_by_items
    ...: 
Out[20]: 
<xarray.DataArray (date: 6, item: 5)>
array([[0, 1, 2, 0, 1],
       [2, 0, 1, 2, 0],
       [1, 2, 0, 1, 2],
       [0, 1, 2, 0, 1],
       [2, 0, 1, 2, 0],
       [1, 2, 0, 1, …
Run Code Online (Sandbox Code Playgroud)

python python-xarray

8
推荐指数
2
解决办法
1578
查看次数

具有掩码数组的 xarray,同时保留整数数据类型

目前,我的代码大量使用具有多维数据类型的结构化掩码数组,其中包含数十个字段和数千字节的项目大小。看起来这xarray可能是一个很好的选择,但是当我尝试向它传递一个掩码数组时,它会将其数据类型更改为 float:

In [137]: x = arange(30, dtype="i1").reshape(3, 10)

In [138]: xr.Dataset({"count": (["x", "y"], ma.masked_where(x%5>3, x))}, coords={"x": range(3), "y":
     ...: range(10)})
Out[138]:
<xarray.Dataset>
Dimensions:  (x: 3, y: 10)
Coordinates:
  * y        (y) int64 0 1 2 3 4 5 6 7 8 9
  * x        (x) int64 0 1 2
Data variables:
    count    (x, y) float64 0.0 1.0 2.0 3.0 nan 5.0 6.0 7.0 8.0 nan 10.0 ...
Run Code Online (Sandbox Code Playgroud)

这对我来说是不可取的,因为(1)我的数据集的内存消耗将会爆炸(它已经很大),并且(2)我的许多整数数据类型都是位字段,不能表示为浮点数。尽管int32位域可以无损地表示为 a float64,但来回比较丑陋且容易出错。

是否可以xarray.Dataset …

python python-xarray masked-array

8
推荐指数
1
解决办法
2190
查看次数

如何最好地将 NetCDF 文件集合重新分块到 Zarr 数据集

我正在尝试重新整理 NetCDF 文件集合并在 AWS S3 上创建 Zarr 数据集。我有 168 个原始 NetCDF4 经典文件,其维度数组time: 1, y: 3840, x: 4608分块为chunks={'time':1, 'y':768, 'x':922}.

我想将此输出写入 Zarr,并且我想针对时间序列提取进行优化,因此在我的块中包含更多时间记录。我想我会使用 xarray 来帮助完成工作,因为我有很多处理器可以利用 Dask,而 xarrayxr.open_mfdatasetds.to_zarr.

我第一次尝试rechunking来chunks={'time':24, 'y':768, 'x':922}匹配输入NetCDF4在分块xy,但是当我试图写Zarr它抱怨,因为它需要在两个均匀的块大小xy,只允许非均匀大小沿的最后一块time尺寸(不幸在x维度中,总大小 4608 不是块大小 922 的倍数。

然后我尝试chunks={'time':168, 'y':384, 'x':288}并开始工作,并且非常快速地进行了几分钟,然后变得越来越慢。最终在 50 分钟后,集群死亡:

4072 distributed.core - INFO - Event loop was unresponsive in Worker for 1.41s.  This is often caused by long-running …
Run Code Online (Sandbox Code Playgroud)

python python-xarray netcdf4 dask-distributed zarr

8
推荐指数
1
解决办法
1198
查看次数

就地更新 xarray 中的属性

我对使用 xarrays 还很陌生。我想就地修改 NetCDF 文件的属性。但是,内置函数提供了另一个新的数据集。

ds = xr.open_dataset(file_)
# ds has "time" as one of the coordinates whose attributes I want to modify
#here is ds for more clarity
ds
>><xarray.Dataset>
Dimensions:  (lat: 361, lev: 1, lon: 720, time: 1)
Coordinates:
* lon      (lon) float32 0.0 0.5 1.0 1.5 2.0 ... 357.5 358.0 358.5 359.0 359.5
* lat      (lat) float32 -90.0 -89.5 -89.0 -88.5 -88.0 ... 88.5 89.0 89.5 90.0
* lev      (lev) float32 1.0
* time     (time) timedelta64[ns] 00:00:00 …
Run Code Online (Sandbox Code Playgroud)

python netcdf python-xarray

8
推荐指数
2
解决办法
9493
查看次数

如何从 xarray 数据集中选择特定数据变量

背景

我正在尝试通过 xarray 和 OPeNDAP 下载 GFS 天气数据 netcdf4 文件。非常感谢Vorticity0123之前的帖子,这使我能够对 python 脚本的框架进行排序(如下所示)。

问题

事实是,GFS 数据集有 195 个数据变量,但我不需要大多数,我只需要其中的 10 个。

  • ugrd100m、vgrd100m、dswrfsfc、tcdcclm、tcdcblcll、tcdclcll、tcdcmcll、tcdchcll、tmp2m、gustsfc

请求帮助

我已经浏览了 xarray readthedocs 页面和其他地方,但我无法找到一种方法将我的数据集缩小到仅十个数据变量。有谁知道如何缩小数据集中的变量列表?

Python脚本

import numpy as np
import xarray as xr

# File Details
dt = '20201124'
res = 25
step = '1hr'
run = '{:02}'.format(18)

# URL
URL = f'http://nomads.ncep.noaa.gov:80/dods/gfs_0p{res}_{step}/gfs{dt}/gfs_0p{res}_{step}_{run}z'

# Load data
dataset = xr.open_dataset(URL)
time = dataset.variables['time']
lat = dataset.variables['lat'][:]
lon = dataset.variables['lon'][:]
lev = dataset.variables['lev'][:]

# Narrow Down Selection
time_toplot = …
Run Code Online (Sandbox Code Playgroud)

python opendap python-xarray

8
推荐指数
1
解决办法
1万
查看次数

如何对 xr.Dataset 的坐标和变量进行排序

我想按Dataset字母顺序对 xarray 的坐标和变量进行排序。我尝试使用 来做到这一点ds.transpose(*sorted(ds.dims))DataArray这似乎对 中每个的坐标/尺寸进行排序Dataset,但不对其本身的坐标进行排序Dataset

例子:

>>> ds = xr.Dataset(
...     {
...         'z': (['c', 'a', 'b'], np.ones(shape=(2, 2, 2))),
...         'x': (['a', 'b', 'c'], np.zeros(shape=(2, 2, 2))),
...         'y': (['c'], [0, 1]),
...     },
...     coords={'c': [30, 31], 'a': [10, 11], 'b': [20, 21]}
... )
    
>>> ds.transpose('a', 'b', 'c')
<xarray.Dataset>
Dimensions:  (c: 2, a: 2, b: 2)
Coordinates:
  * c        (c) int64 30 31
  * a        (a) int64 …
Run Code Online (Sandbox Code Playgroud)

python python-xarray

8
推荐指数
1
解决办法
1925
查看次数