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

我正在尝试使用时识别屏蔽像素的索引
    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,grid = 10)

fig = plt.figure
pc = map1.pcolormesh(lons,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,latlon=True)
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之前复制初始数组.你可以这样做:

import copy
lons1 = copy.copy(lons)
lats1 = copy.copy(lats)

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

相关文章

功能概要:(目前已实现功能)公共展示部分:1.网站首页展示...
大体上把Python中的数据类型分为如下几类: Number(数字) ...
开发之前第一步,就是构造整个的项目结构。这就好比作一幅画...
源码编译方式安装Apache首先下载Apache源码压缩包,地址为ht...
前面说完了此项目的创建及数据模型设计的过程。如果未看过,...
python中常用的写爬虫的库有urllib2、requests,对于大多数比...