python-xarray - 将单元属性添加到 xarray 对象
问题描述
我创建了一组等压压力水平来绘制横截面:
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 单位文档建议可以使用语法 array_name*units.unit将单位添加到数组中。为什么我尝试这样做没有成功?
解决方案
您遇到的问题是乘法单元适用于 numpy 数组,但不适用于xarray.DataArray
实例 - 这是您在获得vertical
. 如果不是这样就好了,但目前这就是我们生活的世界。为了解决这个问题,MetPy 有一些对xarray 和 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
推荐阅读
- numpy - f2py 不修改 inout 数组的问题
- python - 如何选择日期中特定时间的值(日期、时间、值的大列表)
- c# - 移动鼠标时WPF窗口滞后
- ios - 如何在具有核心数据的 Swiftui 中遍历没有重复的递归对象图?
- javascript - 材料 ui 'new' v5.0.0 injectionFirst 无法设置特异性
- vue.js - 在 yyyy-mm-dd 中格式化 vue-datepicker 时间
- api - 为所有页面人性化 Wikipedia 类别
- c# - 我想在合并两个纹理的同时进行平移、旋转和缩放
- python - Python readlines() 函数忽略程序写入的行
- python - jsonschema 库将数字验证为没有上限的字符串