python – Lat / lon使用Basemap和maskoceans在“for”循环后混淆

前端之家收集整理的这篇文章主要介绍了python – Lat / lon使用Basemap和maskoceans在“for”循环后混淆前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

  1. import numpy as np
  2. import netCDF4
  3. from datetime import datetime,timedelta
  4. import matplotlib
  5. import matplotlib.pyplot as plt
  6. from matplotlib.ticker import MaxNLocator
  7. import matplotlib.dates as mpldates
  8. import heat_transfer_coeffs
  9. from dew_interface import get_dew
  10. from matplotlib.dates import date2num,num2date
  11. import numpy as np
  12. import netCDF4
  13. import heat_transfer_coeffs as htc
  14. from jug.task import TaskGenerator
  15. import matplotlib.cm as cm
  16. import mpl_toolkits
  17. from mpl_toolkits import basemap
  18. from mpl_toolkits.basemap import Basemap,maskoceans
  19. np.seterr(all='raise')
  20. # set global vars
  21. ifile = netCDF4.Dataset('/Users/myfile.nc','r')
  22. times = ifile.variables['time'][:].astype(np.float64) # hours since beginning of dataset
  23. lats_1d = ifile.variables['latitude'][:] # 90..-90
  24. lons_1d = ifile.variables['longitude'][:] # 0..360
  25. lons_1d[lons_1d>180]-=360 #putting longitude into -180..180
  26. lons,lats = np.meshgrid(lons_1d,lats_1d)
  27. ntimes,nlats,nlons = ifile.variables['tm'].shape
  28. ifile.close()
  29. map1 = basemap.Basemap(resolution='c',projection='mill',llcrnrlat=-36,urcrnrlat=10,llcrnrlon=5,urcrnrlon=52)
  30. #Mask the oceans
  31. new_lon = maskoceans(lons,lats,lons,resolution='c',grid = 10)
  32. new_lat = maskoceans(lons,grid = 10)
  33. fig = plt.figure
  34. pc = map1.pcolormesh(lons,new_lat,vmin=0,vmax=34,cmap=cm.RdYlBu,latlon=True)
  35. plt.show()
  36. for iii in range(new_lon.shape[1]):
  37. index = np.where(new_lon.mask[:,iii] == False)
  38. index2 = np.where(new_lon.mask[:,iii] == True)
  39. new_lon[index[0],iii] = 34
  40. new_lon[index2[0],iii] = 0
  41. fig = plt.figure
  42. pc = map1.pcolormesh(lons,latlon=True)
  43. plt.show()

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

First figure

然而,第二个图形应该绘制与第一个图形完全相同的东西,即使第一个和第二个图形之间的循环没有触及绘制它所涉及的任何参数,它们都会混乱.

Second figure

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

最佳答案
简短的回答,你的循环是间接修改变量lons和lats.

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

解决方案:在调用maskoceans之前复制初始数组.你可以这样做:

  1. import copy
  2. lons1 = copy.copy(lons)
  3. lats1 = copy.copy(lats)

然后你使用lons1和lats1来调用maskoceans.

猜你在找的Python相关文章