Создайте маску земли из массивов широты и долготы

Имея массивы широты и долготы, я пытаюсь создать land_mask, массив того же размера, который сообщает, является ли координата землей или нет.

lon=np.random.uniform(0,150,size=[1000,1000])
lat=np.random.uniform(-90,90,size=[1000,1000])

from global_land_mask import globe
land_mask=globe.is_land(lat,lon)

Это очень эффективный метод создания маски местности, если определены все значения. Но если некоторые значения широты или долготы замаскированы или являются значениями nan, возникает ошибка.

Я пытался использовать циклы for, чтобы избежать этой ошибки, но это занимает почти 15-20 минут. Мне нужно запустить его на массиве с элементами 3000×3000, некоторые из которых замаскированы.

Что было бы лучше для создания маски земли для массивов со значениями masked/nan?

Этот минимальный пример работает для меня. Можете ли вы сначала удалить нан или маскированные координаты? Или построить из них маску и передать ее? Откуда ваши значения lat, lon?

GeoMonkey 27.11.2022 21:24

@GeoMonkey Думаю, будет полезна дополнительная информация. Мои фактические массивы широты и долготы не маскируются, у них есть значение заполнения (327,67), которое позже используется для их маскировки. Теперь я не могу передать широту или долготу = 327,67 в функцию is_land. Итак, вы говорите, что я создаю маску (скажем, nan_mask), используя значение заполнения, но не применяю ее к массивам широты и долготы. Замените значение заполнения, скажем, на 0, передайте массивы в is_land и создайте маску земли. Затем примените к нему nan_mask. Поправьте меня если я ошибаюсь.

Pixel_Bear 27.11.2022 21:31

@Pixel_Bear Верно. Я думаю, это сработает.

Nick ODell 27.11.2022 21:35

да, я думаю, что это в основном. Но я бы заменил 327.67 на np.nans, а затем использовал np.ma для передачи маски в функцию globe.is_land(). проверю и что-нибудь выложу

GeoMonkey 27.11.2022 21:42

@GeoMonkey «используйте np.ma для передачи маски в глобус.is_land ()», эту часть я не могу сделать прямо сейчас. Было бы интересно посмотреть, как это делается.

Pixel_Bear 27.11.2022 21:45

@Pixel_Bear хорошо, поэтому я не могу передать маску в функцию. Я думаю, что решение может состоять в том, чтобы просто заменить их значениями, выходящими за пределы вашей области исследования (если возможно, например, (-90, 0)) и затем замаскировать полученные массивы.

GeoMonkey 27.11.2022 21:56
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
6
332
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

поэтому кажется, что globe.is_land(y,x) не принимает замаскированный массив. Справедливым решением было бы использовать координаты за пределами вашего домена (если это возможно). Так:

lon[lon==327.67] = 170
lat[lat==327.67] = -90

from global_land_mask import globe
land_mask=globe.is_land(lat,lon)

masked = np.where((lat==-90)|(lon==170), False, land_mask)

В качестве альтернативы вы можете замаскировать значения перед их передачей:

lat_mask = np.where(lat==326.67, np.nan, lat)
lon_mask = np.where(lon==326.67, np.nan, lon)

master_mask = np.where((lat_mask==np.nan)|(lon_mask==np.nan), False, True)

lat[master_mask]==True 
lon[master_mask]==True 

from global_land_mask import globe
land_mask=globe.is_land(lat,lon)

Второе решение изменит (сгладит) ваши массивы широты и долготы, но не потребует от вас поиска области за пределами вашего домена.

Думаю, я понял. Если land_mask==True, применяется, это земля. Однако, если land_mask==False, это не означает море/океан. Это также может означать, что здесь широта|долгота==327,67. Я запутался, потому что пытался создать массив со значениями True (земля), False (океан), np.nan (широта | lon == 327,67), но разные типы данных не разрешены. Спасибо за ответ.

Pixel_Bear 27.11.2022 22:43

Другие вопросы по теме