4

maskoceans を使用しているときに、マスクされたピクセルのインデックスを識別しようとしています。私は海ピクセルを気にしなくても、地球全体を見渡しています。私はそうするためにさまざまな方法を試していて、私のプロットが本当に奇妙に見えていたことに気づいた。最終的に、私は実際に触っていないのに、何かが緯度/経度の指標に混ざっていることに気付きました!ここでは、コードは:"for"ループの後にBasemapとmaskoceansが混在しているLat/lon

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() 

Iを得る最初の図34におけるカラーバーの飽和まで(マスク海洋および緯度に対応するランドの値を持つアフリカの予想されるマップを示しているが、その値は、同じようにしました例)

First figure

はしかし、最初のものとまったく同じものをプロットすべき2番目の図は、すべての第一および第二の図の間でループがないにもかかわらず、台無しに出てきますプロットに含まれるパラメータのいずれかに触れてください:

Second figure

図1と図2の間のループをコメントすると、図2は図1のようになります。

答えて

2

短い答えでは、変数lonslatsを間接的に変更しています。

説明:関数maskoceansは、入力配列からマスクされた配列を作成します。マスクされた配列と入力配列は同じデータを共有するため、lonsとは同じデータを共有します。latsnew_latの場合と同じです。つまり、ループ内でnew_lonを変更すると、lonsも変更されます。それがあなたの問題の原因です。唯一の違いは、new_lonnew_latが有効なデータポイントを選択するために使用されるマスクに関連付けられていることです。

解決方法:maskoceansに電話する前に、最初のアレイのコピーを作成してください。

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

次にあなたがmaskoceansを呼び出すためにlons1lats1を使用する:あなたがしていることを行うことができます。

+0

説明と修正をありがとう、それは完全に動作します!私はこの「隠れ家」の特徴を知らなかった...! –

+0

あなたは大歓迎です!ところで、この機能はmaskoceansからではなく、基礎となるマスクされた配列から、そしてPythonから、データが代入操作で自動的にコピーされないところからです。 – innoSPG

+0

Gotcha、説明をありがとう! –

関連する問題