t2m = xr.open_dataarray('ERA5_t2m_hourly_2004_2024.nc')
vwind = xr.open_dataarray('ERA5_vwind_hourly_2004_2024.nc')
uwind = xr.open_dataarray('ERA5_uwind_hourly_2004_2024.nc')
def wind_tot(uwind, vwind):
wind_mag = np.sqrt(vwind**2 + uwind**2)
wind_dir = np.arctan2(vwind/wind_mag, uwind/wind_mag)
wind_dir = wind_dir * 180/np.pi
return wind_mag, wind_dir
wind_mag, wind_dir = wind_tot(uwind, vwind)
wind_chill = metpy.calc.windchill(
t2m * units.K,
wind_mag * units('m/s'),
)
windchill_ma = wind_chill.to_masked_array()
mask = ma.getmask(windchill_ma)
蒙版是带有布尔值的numpy ndarray。 我想在保留数据阵列结构的同时将所有被掩盖的值(在掩码中设置为true)转换为NP.NAN。
例如:wind_chill = xr.DataArray(array([[[1,6,4,8],[2,4,3,5]],[[2,5,3,6],[2,6,4,8]]]))
mask = array([[[True,True,False,False],[........
masked_wind_chill = xr.DataArray(array([[[NaN,NaN,4,8......
masked_wind_chill = wind_chill.where(~mask)
where(mask = false)的其他变体和最终根本没有将掩码应用于数据。如果我使用的位置(bask = true),则所有数据点都被掩盖,而不管该数据点的值是true还是False。我在使用错误吗?
Edit:实施ARR.FILL:
windchill_ma = wind_chill.to_masked_array()
masked_windchill = windchill_ma.filled(np.nan)
windchill_da = xr.DataArray(masked_windchill, coords={
'time':wind_chill.time,
'lat':wind_chill.lat,
'lon':wind_chill.lon,
})
windchill_da
Gives类似的结果。我发现我正在使用的方法正在按预期工作,但是我似乎并不与标记为“ - ”的区域相对应,因为它们是我想要掩盖的,因为它们高于必要的温度且低于风阈值。
mask = ma.getmask(windchill_ma)
在时间段上返回一个充满“错误”的数组,这些数组完全标记为wind_chill,而wind_chill则在面具中应该是真实的。我使用的面具是不正确的吗?
蒙面阵列,您可以使用
.filled()
方法用NAN填充蒙版值:
import numpy as np
arr = np.ma.array([1., 2., 3.], mask=[False, True, False])
filled_arr = arr.filled(np.nan)
gives
array([ 1., nan, 3.])