Имея массивы широты и долготы, я пытаюсь создать 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?
@GeoMonkey Думаю, будет полезна дополнительная информация. Мои фактические массивы широты и долготы не маскируются, у них есть значение заполнения (327,67), которое позже используется для их маскировки. Теперь я не могу передать широту или долготу = 327,67 в функцию is_land. Итак, вы говорите, что я создаю маску (скажем, nan_mask), используя значение заполнения, но не применяю ее к массивам широты и долготы. Замените значение заполнения, скажем, на 0, передайте массивы в is_land и создайте маску земли. Затем примените к нему nan_mask. Поправьте меня если я ошибаюсь.
@Pixel_Bear Верно. Я думаю, это сработает.
да, я думаю, что это в основном. Но я бы заменил 327.67 на np.nans, а затем использовал np.ma для передачи маски в функцию globe.is_land(). проверю и что-нибудь выложу
@GeoMonkey «используйте np.ma для передачи маски в глобус.is_land ()», эту часть я не могу сделать прямо сейчас. Было бы интересно посмотреть, как это делается.
@Pixel_Bear хорошо, поэтому я не могу передать маску в функцию. Я думаю, что решение может состоять в том, чтобы просто заменить их значениями, выходящими за пределы вашей области исследования (если возможно, например, (-90, 0)) и затем замаскировать полученные массивы.
поэтому кажется, что 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), но разные типы данных не разрешены. Спасибо за ответ.
Этот минимальный пример работает для меня. Можете ли вы сначала удалить нан или маскированные координаты? Или построить из них маску и передать ее? Откуда ваши значения lat, lon?