【问题标题】:Lat/lon using Basemap and maskoceans getting mixed up after "for" loop使用底图的纬度/经度和掩码在“for”循环后混淆
【发布时间】:2016-07-12 08:34:59
【问题描述】:

我正在尝试在使用时识别蒙版像素的索引 面具海洋 因此,即使我不关心海洋像素,我也可以只调用我目前正在全球范围内的代码中的陆地像素。我正在尝试不同的方法来做到这一点,并注意到我的情节看起来很奇怪。最终,我意识到我的纬度/经度指数中有些东西混淆了,即使我实际上并没有触摸它们!代码如下:

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。你知道这里发生了什么吗?

【问题讨论】:

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


    【解决方案1】:

    简短的回答,您的循环正在间接修改变量 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

    【讨论】:

    • 感谢您的解释和修复,它完美运行!我不知道maskoceans的这个功能...!
    • 不客气!顺便说一句,该功能不是来自 maskoceans,而是来自底层的掩码数组,并且通常来自 python,其中数据不会在赋值操作中自动复制。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-19
    • 2018-09-08
    • 2020-04-23
    • 2016-06-16
    • 2016-02-01
    • 2017-09-22
    相关资源
    最近更新 更多