我有一个包含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”:station.lat, station.lon = 22.125, 275.250
。
将经度转换为360度网格空间:station.lon = station.lon%360.0
我想提取一个关于我的电台的立方体。例如,剩下5个细胞,5个细胞和所有水平。 (包括电台所在的小区)
为此,我在lat
内得到lats
的索引,并在lon
内获得lons
的索引。
然后我创建了一系列索引,用于从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)
纬度存在同样的问题......因为我的观点可能在纬度边界附近。
有谁知道如何解决这个问题?
答案 0 :(得分:0)
我仍然认为答案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]
答案 1 :(得分:0)
如果您不介意从命令行执行此操作,则它在CDO中是一行:
cdo sellonlatbox,lon1,lon2,lat1,lat2 in.nc out.nc
你可以指定-180,180范围内的lon以及0 360,它会为你处理它。