Cyn*_* GS 6 python latitude-longitude netcdf python-2.7 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()
Run Code Online (Sandbox Code Playgroud)
我得到的第一个数字显示了非洲的预期地图,其中海洋被屏蔽,地面值对应于纬度(直到34的颜色条饱和,但该值仅作为示例)
然而,第二个图形应该绘制与第一个图形完全相同的东西,即使第一个和第二个图形之间的循环没有触及绘制它所涉及的任何参数,它们都会混乱.
如果我在图1和图2之间注释循环,图2看起来就像图1.任何关于这里发生了什么的想法?
简而言之,您的循环正在间接修改lons变量lats。
说明:该函数maskoceans从输入数组创建一个掩码数组。屏蔽数组和输入数组共享相同的数据,因此lons和new_lon共享相同的数据,对于lats和来说也是如此new_lat。这意味着当您new_lon在循环中进行修改时,您也在修改lons. 这就是你的问题的根源。唯一的区别是new_lon和 与new_lat用于选择有效数据点的掩码相关联。
解决方案:在调用 之前复制初始数组maskoceans。您可以通过以下方式做到这一点:
import copy
lons1 = copy.copy(lons)
lats1 = copy.copy(lats)
Run Code Online (Sandbox Code Playgroud)
然后你使用lons1和lats1来调用maskoceans。
| 归档时间: |
|
| 查看次数: |
776 次 |
| 最近记录: |