Добавление атрибутов модуля к объекту xarray - PullRequest
1 голос
/ 25 марта 2020

Я создал массив изобари c уровней давления для построения поперечного сечения:

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

однако, этот массив имеет значения в единицах Па. Чтобы преобразовать в гПа, я создал новый массив:

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. Почему моя попытка сделать это не удалась?

1 Ответ

0 голосов
/ 26 марта 2020

Проблема, с которой вы сталкиваетесь, заключается в том, что умножающие единицы работают с numpy массивами, но не с xarray.DataArray экземплярами - это то, что вы получаете, когда получаете vertical. Было бы неплохо, если бы это было не так, но сейчас это мир, в котором мы живем. Чтобы обойти этот MetPy, есть несколько полезных инструментов для xarray и юнитов .

В этом случае тем не менее, нет необходимости вручную переводить ваши единицы из Па в гПа - прелесть поддержки юнитов в том случае, если они известны и имеют правильную размерность, 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
...