检查纬度/经度是否在陆地或海洋上

时间:2019-05-09 02:00:13

标签: python numpy multidimensional-array logical-operators

我有一组纬度(纬度,最小值= -88,最大值= 88,形状= 89)和经度(经度,最小值= 0,最大值= 358,形状= 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

我不确定如何使用我拥有的2d陆地遮罩执行此操作。也许还有比嵌套循环更快和/或更pythonic的实现此代码的更好方法吗?预先感谢。

2 个答案:

答案 0 :(得分:1)

我想象下面的想法会起作用。

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.]])

这意味着您可以使用蒙版仅修改形状相同的数组的特定条目。

答案 1 :(得分:0)

您可以尝试以下方法:

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

但是这在python中会非常慢。通过将循环替换为矢量化,可以使Numpy操作更快。因此,如果您告诉我们do something部分应该做什么,可能会有更好的方法。