Lat / lon使用Basemap和maskoceans混淆了" for"环

时间:2016-03-24 16:42:22

标签: python python-2.7 latitude-longitude netcdf matplotlib-basemap

我正在尝试使用时识别被遮罩像素的索引     maskoceans 所以我可以只调用我目前正在全球范围内的代码中的陆地像素,即使我不关心海洋像素。我尝试了不同的方法,并注意到我的情节看起来很奇怪。最后,我意识到在我的纬度/经度指数中出现了混乱,尽管我实际上并没有碰到它们!这是代码:

import numpy as np
import netCDF4
from datetime import datetime, timedelta
import matplotlib
import matplotlib.pyplot as plt
from matplotlib.ticker import MaxNLocator
import matplotlib.dates as mpldates
import heat_transfer_coeffs
from dew_interface import get_dew
from matplotlib.dates import date2num, num2date
import numpy as np
import netCDF4
import heat_transfer_coeffs as htc
from jug.task import TaskGenerator
import matplotlib.cm as cm
import mpl_toolkits
from mpl_toolkits import basemap
from mpl_toolkits.basemap import Basemap, maskoceans
np.seterr(all='raise')

# set global vars
ifile = netCDF4.Dataset('/Users/myfile.nc', 'r')
times = ifile.variables['time'][:].astype(np.float64)  # hours since beginning of dataset
lats_1d = ifile.variables['latitude'][:]  # 90..-90
lons_1d = ifile.variables['longitude'][:] # 0..360
lons_1d[lons_1d>180]-=360 #putting longitude into -180..180
lons, lats = np.meshgrid(lons_1d, lats_1d)
ntimes, nlats, nlons = ifile.variables['tm'].shape
ifile.close()

map1 = basemap.Basemap(resolution='c', projection='mill',llcrnrlat=-36 , urcrnrlat=10, llcrnrlon=5 , urcrnrlon=52)
#Mask the oceans
new_lon = maskoceans(lons,lats,lons,resolution='c', grid = 10)
new_lat = maskoceans(lons,lats,lats,resolution='c', grid = 10)

fig = plt.figure
pc = map1.pcolormesh(lons, lats, new_lat, vmin=0, vmax=34,  cmap=cm.RdYlBu, latlon=True)
plt.show()

for iii in range(new_lon.shape[1]):
    index = np.where(new_lon.mask[:,iii] == False)
    index2 = np.where(new_lon.mask[:,iii] == True)
    new_lon[index[0],iii] = 34
    new_lon[index2[0],iii] = 0

fig = plt.figure
pc = map1.pcolormesh(lons, lats, new_lat, vmin=0, vmax=34,  cmap=cm.RdYlBu, latlon=True)
plt.show()

我得到的第一个数字显示了非洲的预期地图,其中海洋被掩盖,陆地值对应于纬度(直到34的颜色条饱和,但该值仅作为示例)

First figure

然而,第二个数字,应该绘制与第一个完全相同的东西,出现了所有混乱,即使第一个和第二个数字之间的循环没有触及任何涉及的参数绘制它:

Second figure

如果我在图1和图2之间注释循环,图2看起来就像图1.对这里发生了什么有任何想法?

1 个答案:

答案 0 :(得分:3)

简短回答,您的循环正在间接修改变量lonslats

说明:函数maskoceans从输入数组创建一个屏蔽数组。屏蔽数组和输入数组共享相同的数据,因此lonsnew_lon共享相同的数据,latsnew_lat的数据相同。这意味着当您在循环中修改new_lon时,您也在修改lons。这是你问题的根源。唯一的区别是new_lonnew_lat与用于选择有效数据点的掩码相关联。

解决方案:在致电maskoceans之前复制一下初始数组。你可以用:

来做到这一点
import copy
lons1 = copy.copy(lons)
lats1 = copy.copy(lats)

然后,您使用lons1lats1来致电maskoceans