首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >metpy.calc.wind_direction中era5数据的错误

metpy.calc.wind_direction中era5数据的错误
EN

Stack Overflow用户
提问于 2021-02-25 19:05:15
回答 2查看 558关注 0票数 1

我从ea-5下载了Era5、U和V风组件,我正在使用xarray读取.nc文件,并从数据中选择几个lon点。在我需要使用metpy.calc函数计算风速和风向之后:

代码语言:javascript
复制
ds = xr.open_mfdataset('ERA5_u10_*.nc',combine='by_coords').metpy.parse_cf()
dv = xr.open_mfdataset('ERA5_v10_*.nc',combine='by_coords').metpy.parse_cf()
#direction =mpcalc.wind_direction(ds['u10'],dv['v10'])
#dd=mpcalc.wind_direction(ds.u10,dv.v10)
locations=[]
k=0
u10 = []
v10=[]
speed=[]
direction=[]
u100 = []
v100=[]
for i,j in zip(lats,lons):
    stations_u=ds.sel(longitude=j,latitude=i,method='nearest')
    stations_v=dv.sel(longitude=j,latitude=i,method='nearest')

    u10.append(stations_u.u10)### mudar variavel
    v10.append(stations_v.v10)### mudar variavel
    speed.append(mpcalc.wind_speed(stations_u.u10,stations_v.v10))
    direction.append(mpcalc.wind_direction(stations_u.u10,stations_v.v10))

风速没有问题,但是风向引起了一个错误:

代码语言:javascript
复制
runfile('/mnt/data1/ERA5/wind/untitled0.py', wdir='/mnt/data1/ERA5/wind')
Found valid latitude/longitude coordinates, assuming latitude_longitude for projection grid_mapping variable
Found valid latitude/longitude coordinates, assuming latitude_longitude for projection grid_mapping variable
Traceback (most recent call last):

  File "/usr/local/python/anaconda3/envs/my_env/lib/python3.6/site-packages/dask/array/core.py", line 1615, in __setitem__
    y = where(key, value, self)

  File "/usr/local/python/anaconda3/envs/my_env/lib/python3.6/site-packages/dask/array/routines.py", line 1382, in where
    return elemwise(np.where, condition, x, y)

  File "/usr/local/python/anaconda3/envs/my_env/lib/python3.6/site-packages/dask/array/core.py", line 4204, in elemwise
    broadcast_shapes(*shapes)

  File "/usr/local/python/anaconda3/envs/my_env/lib/python3.6/site-packages/dask/array/core.py", line 4165, in broadcast_shapes
    "shapes {0}".format(" ".join(map(str, shapes)))

ValueError: operands could not be broadcast together with shapes (262968,) (nan,) (262968,)


The above exception was the direct cause of the following exception:

Traceback (most recent call last):

  File "/mnt/data1/ERA5/wind/untitled0.py", line 40, in <module>
    direction.append(mpcalc.wind_direction(stations_u.u10,stations_v.v10))

  File "/usr/local/python/anaconda3/envs/my_env/lib/python3.6/site-packages/metpy/xarray.py", line 1206, in wrapper
    result = func(*bound_args.args, **bound_args.kwargs)

  File "/usr/local/python/anaconda3/envs/my_env/lib/python3.6/site-packages/metpy/units.py", line 246, in wrapper
    return func(*args, **kwargs)

  File "/usr/local/python/anaconda3/envs/my_env/lib/python3.6/site-packages/metpy/calc/basic.py", line 104, in wind_direction
    wdir[mask] += 360. * units.deg

  File "/usr/local/python/anaconda3/envs/my_env/lib/python3.6/site-packages/pint/quantity.py", line 1868, in __setitem__
    self._magnitude[key] = factor.magnitude

  File "/usr/local/python/anaconda3/envs/my_env/lib/python3.6/site-packages/dask/array/core.py", line 1622, in __setitem__
    ) from e

ValueError: Boolean index assignment in Dask expects equally shaped arrays.
Example: da1[da2] = da3 where da1.shape == (4,), da2.shape == (4,) and da3.shape == (4,).

如果我试图用U中的一个元素和V中的一个元素来计算Wdir,令人惊讶的是它可以:

代码语言:javascript
复制
mpcalc.wind_direction(stations_u.u10[0],stations_v.v10[0]).values
Out[12]: array(173.41553, dtype=float32)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-02-25 22:55:55

不幸的是,metpy.calc.wind_direction已知不使用Dask数组--事实上,MetPy中的许多地方都与达斯克有着不太好的关系,尽管我们绝对想。现在,要使用wind_direction,您需要使用例如.compute()stations_u等转换为标准的numpy数组。

票数 1
EN

Stack Overflow用户

发布于 2021-02-26 12:10:10

感谢你的回答!这很有道理..。

我正在处理的数据数组非常大,所以我需要将其保持为dataArray,因为将其复制到正常的np数组将使用更多的内存,而我拥有的xD最终尝试了以statins_u作为u和v的计算,而且令人惊讶的是,它工作得很好:

代码语言:javascript
复制
mpcalc.wind_direction(stations_u.u10,stations_u.u10)## Heading ##
Out[7]: 
<xarray.DataArray 'sub-404afe706bcfce1f36810c70766c0647' (time: 262968)>
<Quantity(dask.array<sub, shape=(262968,), dtype=float32, chunksize=(87672,), chunktype=numpy.ndarray>, 'degree')>
Coordinates:
    longitude  float32 -7.1
    latitude   float32 43.8
  * time       (time) datetime64[ns] 1990-01-01 ... 2019-12-31T23:00:00

为什么在这种情况下起作用?在这种情况下,metpy.calc_wind_direction不是在使用dask数组吗?我觉得属性、名称、单位和品脱都有问题,但我无法理解它是什么.

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66374880

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档