与具有nan值的数组的可变边界集成

时间:2018-10-23 15:45:55

标签: python numpy python-xarray

我有xr.Dataset数据,这些数据是我要积分的大气测量数据。数据具有维度纬度和高度。高度具有单位米。在此示例中,我用一个和一个nan填充了xr.DataArray。我想从一个较低的边界(在本例中为“底部”)进行积分,其中海拔= 0直至边界中指定的海拔值。边界值也以米为单位,并且每个纬度都不同。

data = xr.DataArray(np.ones((5, 5)),[
('latitude', ['a', 'b', 'c', 'd', 'e']), 
('altitude', [0, 100, 200, 300, 400])])
data[2][0] = np.nan 
data['boundary'] = ('latitude', [200, 300, 500, 300, 100])

要获得我感兴趣的价值观,我的方法是

arr = data.where(data.altitude < data.boundary)  

此操作的结果是:

<xarray.DataArray (latitude: 5, altitude: 5)>
array([[ 1.,  1., nan, nan, nan],
       [ 1.,  1.,  1., nan, nan],
       [nan,  1.,  1.,  1.,  1.],
       [ 1.,  1.,  1., nan, nan],
       [ 1., nan, nan, nan, nan]])
Coordinates:
  * latitude  (latitude) <U1 'a' 'b' 'c' 'd' 'e'
  * altitude  (altitude) int64 0 100 200 300 400
    boundary  (latitude) int64 200 300 500 300 100

我想使用numpy.trapz在海拔高度上整合我的数据,结果应该是这样。

<xarray.DataArray (latitude: 5)>
array([100, 200, 300, 200, 0])
Coordinates:
  * latitude  (latitude) <U1 'a' 'b' 'c' 'd' 'e'
    boundary  (latitude) int64 200 300 500 300 100

虽然numpy.trapz函数不接受nan值,所以我必须在应用集成之前过滤数据并删除所有nan。我可以使用for循环来做到这一点:

integration = []
for lat in latitudes: 
     a = arr.sel(latitude = lat).dropna(dim = "altitude") 
     integration.append(np.trapz(a, a.altitude))

或者我现在的解决方案是GroupBy方法,因为我的数据中还有一个时间维度,它具有不同的边界。

def integration(ds): 
     ds = ds.dropna(dim = "altitude") 
     ds['integrated'] = np.trapz(ds, ds.altitude) 
     return ds.integrated

integration = arr.groupby('latitude').apply(integration) 

我使用的不同界限例如对流层顶和层顶顶。当我分析对流层时,我会进行从地面到对流层顶的积分。对于平流层,我要进行从对流层顶到层顶层的整合。

但是使用“ for循环”或“ GroupBy循环”,我的计算花费了很长时间,因为我要分析很多数据。因此,我正在寻找一种优雅的xarray解决方案,在其中不必使用过多的循环或groupbys。在每个时间维度和每个图层中,每个纬度的下边界和上边界都不同。我想为numpy.trapz提供所需的值,而海拔边界不包含nans。

0 个答案:

没有答案