在 Z 维度中将一个数组与另一个数组相加或相减,其中纬度(Y 维度)和经度(X)不同
Add or subtract one array in the Z dimension from another, where latitude (Y dimension) and longitude (X) are different
最后,我想计算模拟空气质量和测量空气质量之间的差异。
我有两个 netcdf 文件。第一个 (A) 包含来自模型的空气粒子数据,纬度 (y1) 索引长度为 100,经度 (x1) 索引长度为 200。
从这个 A 中,我想减去纬度 (y2) 索引长度为 1300 和经度 (x2) 索引长度为 1300 的观测数据 (B)。B 的实际纬度值(以北度和东度为单位)存在于 A 中,尽管不完全相同,即 A 中的值是均匀分布的(例如 55.95°、55.85°、55.75° 等),但 B 中的值有 3 位小数,并且通过大约 0.001 到 0.003 的变化增量来间隔。
感觉这应该是直截了当的:获取 lat/lon 范围内的 obs 数据(例如 50.5 到 51°N 和 8.1 到 8.2°E),然后从模型数据中减去它 lat/lon范围。
起初我尝试用 numpy
改编自 this example 计算 'departure from global temperature'。但是我让运行陷入死胡同。
然后,我尝试了很多类似的东西(这显然是错误的,但我不是编码专家):
anomaly=[]
for j in range(len(100)):
for k in range(len(200)):
for i in range(len(1300)):
if latitude_model[j] == latitude_observation[i] and longitude_model[k] == longitude_observation[i]:
departure = model_data[0,0,j,k] - observation_data[i,i] #the first two dimensions of the model data are 'time' and 'level'
anomaly = np.append(departure)
我的第三种方法是 xarray
改编自 this example。 Xarray 将允许使用 method='nearest'
和 tolerance = 0.1
函数,这将有助于处理不匹配的 lat/lon 数据(据我所知)。
但是在加载这两个 netcdf 文件后,我什至找不到如何继续代码的入口点。另外,我可能不得不重塑(但如何?)模型数据以匹配观察结果。或者,如果多个观测点落在同一网格内,则从同一模型网格中减去观测数据。
PS:本题最终与相关,是同一个数据,同一个问题
计算模型与观测值之间的偏差时,在进行分析之前匹配网格非常重要。换句话说,预处理始终是必须的。因此,在减去两个文件之前,您必须将模型的网格与观察到的网格相匹配,反之亦然,否则,由于差异,您的输出根本没有意义。最简单的方法是使用特殊运算符,如 CDO、NCO、NCL 等。
在您的命令行中(虽然 CDO 在 Python 中也可用,但需要的语法与下面不同)
### Match the grids ###
cdo remapbil,obs.nc model.nc model1.nc
### Subtract the files ###
cdo sub model1.nc obs.nc bias.nc
然后您可以轻松映射 Python 中的差异。我更喜欢这种方法,因为它比预处理 Python 中的数据更容易、更轻便。
(从智能手机发送)
如果你想使用 Python(以 CDO 作为后端,需要安装)来执行此操作,你可以使用我的包 nctoolkit (https://nctoolkit.readthedocs.io/en/latest/installing.html).
因此,如果您的两个文件分别命名为 file1 和 file2。您将首先将它们作为数据集读入。
import nctoolkit as nc
data1 = nc.open_data(file1)
data2 = nc.open_data(file2)
然后您可以重新网格化第一个数据集,使其与第一个数据集具有相同的网格。这是必要的,以便单元格匹配。
data1.regrid(data2)
您可以只从第一个数据集减去第二个数据集。
data1.sub(data2)
如果你想将其转换为 xarray 对象,你可以这样做:
d1_xr = data1.to_xarray()
或者如果您想要一个 pandas 数据框,请执行以下操作:
d1_df = data1.to_dataframe()
还有一种自动绘图方法,使用全息图:
df1_df.plot()
最后,我想计算模拟空气质量和测量空气质量之间的差异。 我有两个 netcdf 文件。第一个 (A) 包含来自模型的空气粒子数据,纬度 (y1) 索引长度为 100,经度 (x1) 索引长度为 200。 从这个 A 中,我想减去纬度 (y2) 索引长度为 1300 和经度 (x2) 索引长度为 1300 的观测数据 (B)。B 的实际纬度值(以北度和东度为单位)存在于 A 中,尽管不完全相同,即 A 中的值是均匀分布的(例如 55.95°、55.85°、55.75° 等),但 B 中的值有 3 位小数,并且通过大约 0.001 到 0.003 的变化增量来间隔。
感觉这应该是直截了当的:获取 lat/lon 范围内的 obs 数据(例如 50.5 到 51°N 和 8.1 到 8.2°E),然后从模型数据中减去它 lat/lon范围。
起初我尝试用 numpy
改编自 this example 计算 'departure from global temperature'。但是我让运行陷入死胡同。
然后,我尝试了很多类似的东西(这显然是错误的,但我不是编码专家):
anomaly=[]
for j in range(len(100)):
for k in range(len(200)):
for i in range(len(1300)):
if latitude_model[j] == latitude_observation[i] and longitude_model[k] == longitude_observation[i]:
departure = model_data[0,0,j,k] - observation_data[i,i] #the first two dimensions of the model data are 'time' and 'level'
anomaly = np.append(departure)
我的第三种方法是 xarray
改编自 this example。 Xarray 将允许使用 method='nearest'
和 tolerance = 0.1
函数,这将有助于处理不匹配的 lat/lon 数据(据我所知)。
但是在加载这两个 netcdf 文件后,我什至找不到如何继续代码的入口点。另外,我可能不得不重塑(但如何?)模型数据以匹配观察结果。或者,如果多个观测点落在同一网格内,则从同一模型网格中减去观测数据。
PS:本题最终与
计算模型与观测值之间的偏差时,在进行分析之前匹配网格非常重要。换句话说,预处理始终是必须的。因此,在减去两个文件之前,您必须将模型的网格与观察到的网格相匹配,反之亦然,否则,由于差异,您的输出根本没有意义。最简单的方法是使用特殊运算符,如 CDO、NCO、NCL 等。
在您的命令行中(虽然 CDO 在 Python 中也可用,但需要的语法与下面不同)
### Match the grids ###
cdo remapbil,obs.nc model.nc model1.nc
### Subtract the files ###
cdo sub model1.nc obs.nc bias.nc
然后您可以轻松映射 Python 中的差异。我更喜欢这种方法,因为它比预处理 Python 中的数据更容易、更轻便。
(从智能手机发送)
如果你想使用 Python(以 CDO 作为后端,需要安装)来执行此操作,你可以使用我的包 nctoolkit (https://nctoolkit.readthedocs.io/en/latest/installing.html).
因此,如果您的两个文件分别命名为 file1 和 file2。您将首先将它们作为数据集读入。
import nctoolkit as nc
data1 = nc.open_data(file1)
data2 = nc.open_data(file2)
然后您可以重新网格化第一个数据集,使其与第一个数据集具有相同的网格。这是必要的,以便单元格匹配。
data1.regrid(data2)
您可以只从第一个数据集减去第二个数据集。
data1.sub(data2)
如果你想将其转换为 xarray 对象,你可以这样做:
d1_xr = data1.to_xarray()
或者如果您想要一个 pandas 数据框,请执行以下操作:
d1_df = data1.to_dataframe()
还有一种自动绘图方法,使用全息图:
df1_df.plot()