Python Lat/lon使用Basemap,Maskocean在“之后被混淆”;至于;环
我试图在使用时识别遮罩像素的索引 马斯科齐人 因此,我可以在一个代码中只调用陆地像素,这个代码目前正在全球范围内运行,尽管我并不关心海洋像素。我尝试了不同的方法,发现我的情节看起来很奇怪。最后,我意识到在我的lat/lon指数中有一些东西混在一起了,尽管我实际上并没有触摸它们!代码如下:Python Lat/lon使用Basemap,Maskocean在“之后被混淆”;至于;环,python,python-2.7,latitude-longitude,netcdf,matplotlib-basemap,Python,Python 2.7,Latitude Longitude,Netcdf,Matplotlib Basemap,我试图在使用时识别遮罩像素的索引 马斯科齐人 因此,我可以在一个代码中只调用陆地像素,这个代码目前正在全球范围内运行,尽管我并不关心海洋像素。我尝试了不同的方法,发现我的情节看起来很奇怪。最后,我意识到在我的lat/lon指数中有一些东西混在一起了,尽管我实际上并没有触摸它们!代码如下: import numpy as np import netCDF4 from datetime import datetime, timedelta import matplotlib import matpl
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处饱和,但该值仅作为示例)
然而,第二个图形应该与第一个图形绘制完全相同的内容,结果却乱七八糟,即使第一个图形和第二个图形之间的循环没有涉及到绘制它所涉及的任何参数:
如果我注释掉图1和图2之间的循环,图2看起来就像图1。你知道这里发生了什么吗?简单回答,你的循环间接地修改了变量
lons
和lats
说明:函数maskoceans
从输入数组创建屏蔽数组。屏蔽数组和输入数组共享相同的数据,因此lons
和new\u-lon
共享相同的数据,对于lats
和new\u-lat
,情况相同。这意味着当您修改循环中的new_lon
时,您也在修改lons
。这就是你问题的根源。唯一的区别是new_lon
和new_lat
与用于选择有效数据点的掩码相关联
解决方案:在调用maskoceans
之前复制初始数组。您可以通过以下方式实现:
import copy
lons1 = copy.copy(lons)
lats1 = copy.copy(lats)
然后使用
lons1
和lats1
调用maskoceans
感谢您的解释和修复,它工作得非常好!我不知道马斯科齐人的这一特点。。。!不客气!顺便说一句,该特性不是来自maskoceans,而是来自底层的掩码数组,通常来自python,在python中,数据不会在赋值操作中自动复制。