Проверьте, находится ли точка широты / долготы над сушей или океаном - PullRequest
0 голосов
/ 09 мая 2019

У меня есть массив широт (лат, min = -88, max = 88, shape = 89) и долгот (lons, min = 0, max = 358, shape = 180) и маска земли (land_mask, океан = 1, суша = 0, форма = (89,180)).

xlon,xlat = np.meshgrid(lons,lats)
PP.pcolormesh(xlon,xlat,land_mask)
PP.colorbar()
PP.show()

Land Mask

Я бы хотел пройтись по всем латам и лонам и сделать расчет для тех пар широт / долг, которые находятся над океаном, и ничего не делать, т. Е. Перейти к следующей паре широта / долгота, если над землей. Какой-то псевдокод:

# loop over lats
for lat in lats:
    # loop over lons
    for lon in lons:
        # check to see if the current 
        # lat/lon is in the ocean.
        # if True, do something
        if (lat,lon) in ocean:
            do something
        # else if current lat/lon
        # over land, do nothing and
        # move to the next lat/lon
        # pair
        else: # ie if over land, skip this point
            continue

Я не уверен, как это сделать с 2-й маской земли, которая у меня есть. Также, возможно, есть лучший способ реализовать этот код, который быстрее и / или более питоничен, чем вложенные в циклы? Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 09 мая 2019

Я думаю, что идея, подобная приведенной ниже, сработает.

import numpy
a = numpy.arange(9).reshape(3, 3)
# array([[0, 1, 2],
#        [3, 4, 5],
#        [6, 7, 8]])
b = a > 4
# array([[False, False, False],
#        [False, False,  True],
#        [ True,  True,  True]])
c = numpy.zeros(a.shape)
# array([[0., 0., 0.],
#        [0., 0., 0.],
#        [0., 0., 0.]])
c[~b] = 1
# array([[1., 1., 1.],
#        [1., 1., 0.],
#        [0., 0., 0.]])

Это означает, что вы можете использовать свою маску для изменения только определенных элементов массива, имеющих одинаковую форму.

0 голосов
/ 09 мая 2019

Вы можете попробовать это:

nlats, nlons = land_mask.shape
for i in range(nlons):
   for j in range(nlats):
       if land_mask(j,i) == 1:
           do something

Но это будет очень медленно в питоне.Numpy операции можно сделать быстрее, заменив циклы векторизацией.Так что, возможно, есть лучший способ сделать это, если вы скажете нам, что должна делать часть do something.

...