【问题标题】:NetCDF: How to extract data which crosses a boundary?NetCDF:如何提取跨越边界的数据?
【发布时间】:2018-03-19 10:47:22
【问题描述】:

我有一个具有 4 个维度的 NetCDF 文件:时间、级别、纬度和经度。 数据的形状为:1, 60, 1440, 2880

这意味着有1个时间点,60个级别,1440个纬度和2880个经度。

纬度范围从 -90 到 90,增量为 0.125。例如:

lats = np.arange(-90,90.125, 0.125)

经度范围从 0 到 360,增量为 0.125。例如:

lons = np.arange(0,360, 0.125)

我有一个带有 GPS 位置的“站”:station.lat, station.lon = 22.125, 275.250。 将经度转换为 360 度网格空间:station.lon = station.lon%360.0

我想提取一个关于我站的立方体。例如,左侧 5 个单元格,右侧 5 个单元格和所有级别。 (包括站所在小区)

为此,我在lats 内获得lat 的索引,并在lons 内获得lon 的索引。

然后我创建一系列索引,用于从 netCDF 文件中提取数据:

    lat_index_range = np.arange(nearest_latitude_index-5, nearest_latitude_index+5, 1)%1441
    lon_index_range = np.arange(nearest_longitude_index-5, nearest_longitude_index+5, 1)%2881

让我们想象一下

lat_index_range = [1220,1221,1223,1224,1225,1226,1227,1228,1229,1230,1231]
lon_index_range = [2250,2251,2252,2253,2254,2255,2256,2257,2258,2259,2260,2261]

然后我提取数据:

factor = dataset[parameter][0]
factor[:,min(lat_index_range):max(lat_index_range),min(lon_index_range):max(lon_index_range)

这很好用,但是,索引 2880 将代表 360 度,所以如果我的点位于边界附近(即它的经度被映射到 2879),我需要回到起点。我的lon_index_range 看起来像这样:

lon_index_range = [2879,2880,0,1,2,3,4,5,6,7,8]

现在无法提取我的数据...

factor = dataset[parameter][0]
factor[:,1220:1231,0:2879) # this would take ALL the longitude data from 0 to 2879!!

同样,我不能有这样的东西:factor[:,1220:1231,2879:8)

同样的问题也存在于纬度...因为我的观点可能在纬度边界附近。

有谁知道我该如何解决这个问题?

【问题讨论】:

  • 我认为 Numpy 的 roll() 在这里会有所帮助(现在您已经导入了 Numpy,您还可以使用例如 lons = np.arange(...)np.linspace(...) 摆脱那些丑陋的列表推导)跨度>
  • 谢谢,但我不是在问如何创建一个循环数组。我的问题是关于从 NetCDF 文件中提取数据。 Ps 感谢np.arange 的提示 - 这让事情变得更漂亮了。

标签: python python-3.x netcdf netcdf4 cdo-climate


【解决方案1】:

我仍然认为here 的答案可以提供帮助。作为一个非常小的例子;

import numpy as np

def cslice(a, start, stop): 
    if start > stop:
        part1  = a[start:]
        part2  = a[:stop ]
        return np.concatenate([part1, part2])
    else:
        return a[start:stop]

lons = np.arange(0,360,60)

print(lons)
print(cslice(lons, 0, 4))
print(cslice(lons, 4, 2))

结果:

[  0  60 120 180 240 300]
[  0  60 120 180]
[240 300   0  60]

【讨论】:

    【解决方案2】:

    如果您不介意从命令行执行此操作,则它是 CDO 中的一行:

    cdo sellonlatbox,lon1,lon2,lat1,lat2 in.nc out.nc
    

    您可以在 -180,180 和 0 360 范围内指定 lon,它会为您处理。

    【讨论】:

    • 它会处理从 257 到 8 吗?
    猜你喜欢
    • 1970-01-01
    • 2021-04-16
    • 1970-01-01
    • 2020-05-30
    • 2018-09-11
    • 1970-01-01
    • 2012-06-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多