Маскируйте 2D-массив разными масками для каждого измерения

У меня есть три разных массива.

Один - это массив широты (от -90 до 90), другой - массив долготы (от 0 до 360), а последний - это двумерный массив температуры с формой (len (lats), len (lons), где len (lats)! = Len (долго).

Я получил маску долготы другими способами и создал маску широты с помощью:

latmask = np.ma.masked_where(np.logical_or(lat < -60, lat > 60), lat).mask

Итак, теперь у меня есть две одномерные маски, которые я хочу применить к 2D-данным вдоль соответствующей оси с помощью логики «или» (иначе говоря, если широта или долгота в этом индексе были замаскированы, тогда 2D-данные должны быть замаскированы).

Я попытался объединить две одномерные маски в двухмерную маску, используя:

2dmask = np.logical_or(latmask , lonmask)
2dmask = latmask * lonmask

но они дают ошибку, говоря, что два массива не одинаковой формы.

2dmask = latmask[np.newaxis, :] & lonmask[:, np.newaxis]

но когда я пытаюсь применить эту маску к своим данным вот так и построить график результата:

testdata = np.ma.masked_array(nt[0,50,:,:], mask = 2dmask)

Получается такой сюжет:

Плохая маскировка

но на этом графике должны быть замаскированы данные выше и ниже +/- 60 градусов широты и данные, за исключением некоторой непрерывной полосы долгот, замаскированных (в основном выщипывание прямоугольника данных).

Я потратил последние 30-45 минут на поиск в документации и переполнение стека для подобных проблем, но безуспешно.

Спасибо за любую помощь!

-Воля


person Will.Evo    schedule 22.11.2017    source источник


Ответы (1)


Я предполагаю, что ваше решение почти правильное, просто переверните размеры:

twodmask = latmask[:, None] & lonmask[None, :]

а возможно использовать или вместо и? (Не уверен в этом.)

twodmask = latmask[:, None] | lonmask[None, :]
person Paul Panzer    schedule 23.11.2017
comment
Сделал свое дело. Я использовал или и перевернул размеры. Спасибо за помощь! - person Will.Evo; 27.11.2017