我有存储在由NetCDF4格式的数据集Intensity的值与3个维度:Loop,Delay和Wavelength.我将我的坐标命名为与尺寸相同(我不知道它的好坏......)
我在Python中使用xarray(以前的xray)来加载数据集:
import xarray as xr
ds = xr.open_dataset('test_data.netcdf4')
Run Code Online (Sandbox Code Playgroud)
现在我想在跟踪原始数据的同时操纵数据.例如,我会:
对Delay坐标应用偏移量并保持原始数据Delay阵列不变.这似乎是通过以下方式完成的:
ds_ = ds.assign_coords(Delay_corr=ds_.Delay.copy(deep=True) + 25)
将坐标替换Delay为Delay_corr数据集中的所有相关数据阵列.但是,我不知道如何做到这一点,我没有在文档中找到任何东西.
有人会知道如何执行第2项吗?
要下载带有测试数据的NetCDF4文件:http://1drv.ms/1QHQTRy
假设我有两个数据集,每个数据集包含不同的关注变量,并且索引不完整(但不冲突):
In [1]: import xarray as xr, numpy as np
In [2]: ages = xr.Dataset(
{'ages': (['kid_ids'], np.random.rand((3))*20)},
coords={'kid_names':(['kid_ids'], ['carl','kathy','gail']), 'kid_ids': [10,14,16]})
In [3]: heights = xr.Dataset(
{'heights': (['kid_ids'], np.random.rand((3))*160)},
coords={'kid_names':(['kid_ids'], ['carl','keith','gail']), 'kid_ids': [10,13,16]})
Run Code Online (Sandbox Code Playgroud)
这将创建两个看起来应该很好合并的数据集:
In [4]: ages
Out[4]:
<xarray.Dataset>
Dimensions: (kid_ids: 3)
Coordinates:
* kid_ids (kid_ids) int32 10 14 16
kid_names (kid_ids) <U5 'carl' 'kathy' 'gail'
Data variables:
ages (kid_ids) float64 13.28 1.955 4.327
In [5]: heights
Out[5]:
<xarray.Dataset>
Dimensions: (kid_ids: 3)
Coordinates:
* kid_ids (kid_ids) int32 10 13 …Run Code Online (Sandbox Code Playgroud) 我有一个包含ints的数据集,我想根据某些条件选择一个子数据集,但我想保留整数数据类型。在我看来,Xarray 强制将整数数据更改为浮点数据类型。
import numpy
import xarray
nums = numpy.random.randint(0, 100, 13)
names = numpy.random.choice(["babadook", "samara", "jason"], 13)
data_vars = {"num": xarray.DataArray(nums), "name": xarray.DataArray(names)}
dataset = xarray.Dataset(data_vars)
print(dataset)
Run Code Online (Sandbox Code Playgroud)
import numpy
import xarray
nums = numpy.random.randint(0, 100, 13)
names = numpy.random.choice(["babadook", "samara", "jason"], 13)
data_vars = {"num": xarray.DataArray(nums), "name": xarray.DataArray(names)}
dataset = xarray.Dataset(data_vars)
print(dataset)
Run Code Online (Sandbox Code Playgroud)
subdataset = dataset.where(dataset.num < 50, drop=True)
print(subdataset)
Run Code Online (Sandbox Code Playgroud)
<xarray.Dataset>
Dimensions: (dim_0: 13)
Coordinates:
* dim_0 (dim_0) int64 0 1 2 …Run Code Online (Sandbox Code Playgroud) 我一直在写一些有多个变量的xarray.Datasets.目前,为了保持大小可管理,我指定了编码,例如zlib,但需要根据变量应用于变量(dataArray).
将相同的编码参数应用于所有变量的好方法是什么?例如
<xarray.Dataset>
Dimensions: (lat: 1440, lon: 2880)
Coordinates:
* lat (lat) float64 -90.0 -89.88 -89.75 -89.62 -89.5 -89.38 -89.25 ...
* lon (lon) float64 -180.0 -179.9 -179.8 -179.6 -179.5 -179.4 -179.2 ...
Data variables:
a1 (lat, lon) float64 nan nan nan nan nan nan nan nan 0.0 ...
b (lat, lon) float64 nan nan nan nan nan nan 0.0 0.0 0.0 ...
c (lat, lon) float64 nan nan nan nan nan nan nan nan 0.0 ...
d (lat, lon) …Run Code Online (Sandbox Code Playgroud) 我有一个xarray具有以下维度的数据集:
Dimensions: (subject: 30, session: 5, time: 45000)
Coordinates:
* subject (subject) object '110' '112' '114' '117' ...
* session (session) object 'week1' 'week2' 'week3' ...
* time (time) timedelta64[ns] 00:00:00 00:00:00.040000 ...
Run Code Online (Sandbox Code Playgroud)
我想将每个试验(主题/会话组合)分成更小的时间段,例如分成 3 个段,每个段有 15000 个值,结果维度可能如下所示:
(subject: 30, session: 5, segment: 3, time: 15000)
Run Code Online (Sandbox Code Playgroud)
我已经搜索并尝试了很多东西但都没有成功,这怎么办?
我一直在尝试的一件事似乎很接近,就是创建一个新的 MultiIndex 并将其拆开。
segment_data = np.repeat(range(3),len(ds.time)//3)
segment = xr.Variable(dims='time',data=segment_data)
newtime_data = np.tile(ds.time[:len(ds.time)//3],3)
newtime = xr.Variable(dims='time',data=newtime_data)
dsr = ds.assign_coords(segment=segment,newtime=newtime)
dsr = dsr.set_index(segment='segment',newtime='newtime')
dsr = dsr.stack(fragment=['segment','newtime'])
Run Code Online (Sandbox Code Playgroud)
然而,最后一行需要大量内存,并且似乎创建了一个维度fragment: len(ds.time)**2,这似乎不正确。我也不确定在这之后我必须做什么(unstack('fragment')?)。
编辑:更多的尝试让我来到这里: …
我有多个文件需要分析。首先,我将它们读入 BitString.Bits 列表。然后我将每个文件位拆分为我想要查看的特定部分并将它们保存到 Pandas.DataFrames 列表中。每个文件一个 DF。
现在为了进一步的绘图和分析目的,我想将所有数据存储在一个 Xarray.Dataset 中,其中我将 DataFrames 沿第三个轴堆叠,名称为“数据集”。
我试图将每个 DataFrame 连接到一个 DataSet:
xr.concat(data_df[:], dim="dataset")
Run Code Online (Sandbox Code Playgroud)
但我收到一个错误,说我不能连接 DataArray 或 DataSets 以外的东西。我可以将 DataFrame 动态转换为 DataArrays 吗?
谢谢你的帮助!
来自德国的问候
简
在xarray中使用DataArray对象,找到具有值的所有单元格的最佳方法是!= 0.
例如在熊猫中我会这样做
df.loc[df.col1 > 0]
Run Code Online (Sandbox Code Playgroud)
我的具体例子我正在试着看三维脑成像数据.
first_image_xarray.shape
(140, 140, 96)
dims = ['x','y','z']
Run Code Online (Sandbox Code Playgroud)
查看xarray.DataArray.where的文档,看起来我想要这样的东西:
first_image_xarray.where(first_image_xarray.y + first_image_xarray.x > 0,drop = True)[:,0,0]
Run Code Online (Sandbox Code Playgroud)
但我仍然得到零的数组.
<xarray.DataArray (x: 140)>
array([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0., 0., 0., 0., …Run Code Online (Sandbox Code Playgroud) I'm trying to open multiple netCDF files with xarray in Python. The files have data with same shape and I want to join them, creating a new dimension.
I tried to use concat_dim argument for xarray.open_mfdataset(), but it doesn't work as expected. An example is given below, which open two files with temperature data for 124 times, 241 latitudes and 480 longitudes:
DS = xr.open_mfdataset( 'eraINTERIM_t2m_*.nc', concat_dim='cases' )
da_t2m = DS.t2m
print( da_t2m )
Run Code Online (Sandbox Code Playgroud)
有了这段代码,我希望结果数据数组的形状像(情况:2,时间:124,纬度:241,经度:480)。但是,其形状为(案例:2,时间:248,纬度:241,经度:480)。它创建了一个新维度,但也将最左边的维度相加:两个数据集的“时间”维度。我想知道这是来自“ xarray.open_mfdateset”的错误还是预期的行为,因为两个数据集的“时间”维度都是无限的。
有没有一种方法可以直接使用xarray从这些文件中联接数据并获得上述预期收益?
谢谢。
马泰斯
我想获得每年以及整个时间序列最大径流量的月份。这个想法是通过查看最大径流月份来描述全球季节性特征。然后,我想尝试考虑每个像素是否具有单峰或双峰状态。
我想创建一个地图,就像这里的Pangeo示例中的一样。
这表示最大降水的小时数。我想显示最大径流量的MONTH(以整数表示)。
在这里,我下载了GRUN径流数据并创建了一个xarray对象。 注意:此处的数据集大于1GB。我正在使用它使此示例完全可重复。
# get the data
import subprocess
command = """
wget -O grun.nc https://www.research-collection.ethz.ch/bitstream/handle/20.500.11850/324386/GRUN_v1_GSWP3_WGS84_05_1902_2014.nc?sequence=1&isAllowed=y
"""
import os
if not os.path.exists('grun.nc'):
process = subprocess.Popen(command.split(), stdout=subprocess.PIPE)
output, error = process.communicate()
# read the data
import xarray as xr
ds = xr.open_dataset('grun.nc')
# select a subset so we can work with it more quickly
ds = ds.isel(time=slice(-100,-1))
ds
Out[]:
<xarray.Dataset>
Dimensions: (lat: 360, lon: 720, time: 99)
Coordinates:
* lon (lon) float64 …Run Code Online (Sandbox Code Playgroud) 我想执行N = 1000引导,并替换网格数据。一次计算大约需要0.5s。我可以访问具有48个内核的超级计算机专用节点。因为重采样是相互独立的,所以我天真地希望将工作负载分配到所有或至少多个内核上,并使性能提高0.8 * ncores。但是我不明白。
我仍然缺乏对敏捷的了解。基于设置敏捷工作者数量的最佳实践,我使用:
from dask.distributed import Client
client = Client(processes=False, threads_per_worker=8, n_workers=6, memory_limit=‘32GB')
Run Code Online (Sandbox Code Playgroud)
我也尝试过SLURMCluster,但我想我首先需要了解自己的工作,然后进行扩展。
我的MWE:
import dask
import numpy as np
import xarray as xr
from dask.distributed import Client
inits = np.arange(50)
lats = np.arange(96)
lons = np.arange(192)
data = np.random.rand(len(inits), len(lats), len(lons))
a = xr.DataArray(data,
coords=[inits, lats, lons],
dims=['init', 'lat', 'lon'])
data = np.random.rand(len(inits), len(lats), len(lons))
b = xr.DataArray(data,
coords=[inits, lats, lons],
dims=['init', 'lat', 'lon'])
def func(a,b, dim='init'): …Run Code Online (Sandbox Code Playgroud) python-xarray ×10
python ×8
numpy ×2
pandas ×2
dask ×1
data-science ×1
netcdf ×1
python-3.x ×1
resampling ×1
scipy ×1