【问题标题】:Adding unit attributes to an xarray object将单元属性添加到 xarray 对象
【发布时间】:2020-07-06 08:23:31
【问题描述】:

我创建了一组等压压力水平来绘制横截面:

vertical, = cross['isobaric'].metpy.coordinates('vertical')

但是,这个数组的值以 Pa 为单位。为了转换为 hPa,我创建了一个新数组:

vert_hpa = (vertical/100)*units.hPa

然后我想用它来计算潜在温度:

temperature, pressure, relative_humidity = xr.broadcast(cross['temperature'], vert_hpa, cross['relative_humidity'])
theta = mpcalc.potential_temperature(pressure, temperature)

当我尝试运行它时,我收到一个错误,表明我创建并分配给变量“压力”的数组没有任何关联的单位:

ValueError: `potential_temperature` given arguments with incorrect units: `pressure` requires "[pressure]" but given "dimensionless".

MetPy units documentation 建议可以使用语法 array_name*units.unit 将单元添加到数组中。为什么我尝试这样做没有成功?

【问题讨论】:

    标签: python-xarray metpy


    【解决方案1】:

    您遇到的问题是,乘法单元适用于 numpy 数组,但不适用于 xarray.DataArray 实例——这是您在获得 vertical 时得到的结果。如果不是这样就好了,但目前这就是我们生活的世界。为了解决这个问题,MetPy 为xarray and units 提供了一些有用的工具。

    不过,在这种情况下,无需手动将单位从 Pa 转换为 hPa——单位支持的美妙之处在于,只要单位已知且维度正确,potential_temperature 并不关心什么他们是。这就是我编写代码的方式:

    vertical = data['temperature'].metpy.vertical
    temperature, pressure, relative_humidity = xr.broadcast(data['temperature'],
                                                            vertical,
                                                            data['relative_humidity'])
    theta = mpcalc.potential_temperature(pressure, temperature)
    

    为了将来参考,如果您确实需要获取一个 xarray 并将其转换为一个带有单元的裸 numpy 数组,您可以使用unit_array 属性:

    temp_with_units = temperature.metpy.unit_array
    

    【讨论】:

    • 谢谢!在这里从 Pa 转换为 hPa 不需要这种转换是有道理的,但稍后在脚本中我想绘制一个横截面,当压力数组(“垂直”)以 Pa 为单位时,我最终得到一个 95% 的空白区域,底部有 RH 数据。将 xarray->numpy 数组->添加单元->转换回 xarray 是我的最佳选择吗?
    • 您想要convert_units 方法,该方法显示在我在答案中链接到的 xarray 教程中。
    猜你喜欢
    • 2015-07-01
    • 2013-06-07
    • 2015-09-21
    • 2015-11-15
    • 2021-03-22
    • 2018-07-27
    • 2016-09-25
    • 1970-01-01
    相关资源
    最近更新 更多