我有一些昏暗的数组,'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数组...)
我有一个具有不规则间隔纬度和经度坐标的 xarray 数据集。我的目标是在最接近某个纬度/经度的点处找到变量的值。
由于x和y尺寸不是纬度/经度值,因此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) 我有以下 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) 何时增长大于 …
我有一个 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)
但我想将它们提升到数组的维度。我该怎么做呢?
我需要对xarray数组中的值应用一个非常简单的'match statement':
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) 目前,我的代码大量使用具有多维数据类型的结构化掩码数组,其中包含数十个字段和数千字节的项目大小。看起来这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 …
我正在尝试重新整理 NetCDF 文件集合并在 AWS S3 上创建 Zarr 数据集。我有 168 个原始 NetCDF4 经典文件,其维度数组time: 1, y: 3840, x: 4608分块为chunks={'time':1, 'y':768, 'x':922}.
我想将此输出写入 Zarr,并且我想针对时间序列提取进行优化,因此在我的块中包含更多时间记录。我想我会使用 xarray 来帮助完成工作,因为我有很多处理器可以利用 Dask,而 xarrayxr.open_mfdataset和ds.to_zarr.
我第一次尝试rechunking来chunks={'time':24, 'y':768, 'x':922}匹配输入NetCDF4在分块x和y,但是当我试图写Zarr它抱怨,因为它需要在两个均匀的块大小x和y,只允许非均匀大小沿的最后一块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) 我对使用 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) 背景
我正在尝试通过 xarray 和 OPeNDAP 下载 GFS 天气数据 netcdf4 文件。非常感谢Vorticity0123之前的帖子,这使我能够对 python 脚本的框架进行排序(如下所示)。
问题
事实是,GFS 数据集有 195 个数据变量,但我不需要大多数,我只需要其中的 10 个。
请求帮助
我已经浏览了 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) 我想按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)