4

maskoceans kullanırken maskelenen piksellerin endekslerini tanımlamaya çalışıyorum, böylece sadece sahip olduğum bir kodda yalnızca arazi piksellerini çağırabilirim Şu anda tüm dünyayı dolaşıyor, okyanus piksellerini umursamama rağmen. Bunu yapmak için farklı yöntemler deniyordum ve çizimlerimin gerçekten garip görünmeye başladığını fark ettim. Sonunda, onlara dokunmadığım halde, latin/lon indekslerimde bir şeyin karıştığını fark ettim! İşte kod:Basemap ve masoceans kullanarak Lat/lon "for" döngüsünden sonra karışık hale getiriliyor

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

alıyorum ilk rakam 34 de Colorbar doyuma kadar enlem (karşılık gelen maskeli okyanuslar ve kara değerlerle Afrika'nın beklenen haritasını gösterir, ancak bu değer sadece olarak alınmıştır bir örnek)

First figure

Ancak, ilk olarak aynı şeyi çizmek gereken ikinci rakam, çıkar tüm birinci ve ikinci rakam arasındaki döngü yapmasa da, berbat Çiziminde yer alan parametrelerden herhangi birine dokunun:

Second figure

Ben şekil 1 ve 2 arasındaki döngü dışarı yorum yaparsanız, şekil 2 sadece şekil 1'de burada ne olup bittiğini hakkında herhangi bir fikir gibi görünüyor?

cevap

2

Kısa yanıt, döngü, lons ve lats değişkenlerini dolaylı olarak değiştiriyor.

Açıklama: işlev maskoceans, giriş dizisinden maskelenmiş bir dizi oluşturur. Maskelenen dizi ve giriş dizisi aynı verileri paylaşır, böyleceve new_lon, lats ve new_lat için aynı verileri paylaşır. Bu, döngüdeki new_lon'u değiştirdiğinizde, lons'u da değiştirdiğiniz anlamına gelir. Bu senin sorununun kaynağı. Tek fark, new_lon ve new_lat'un geçerli veri noktalarını seçmek için kullanılan bir maske ile ilişkilendirilmiş olmasıdır.

Çözüm: maskoceans'u aramadan önce ilk dizinin bir kopyasını alın.

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

Sonra lons1 ve lats1 kullanmak maskoceans çağırmak için: o Sen yapabilirsin.

+0

Açıklama ve düzeltme için teşekkürler, mükemmel çalışıyor! Maskelezlerin bu özelliği hakkında hiçbir fikrim yoktu ...! –

+0

Bir şey değil! Bu arada, özellik maskeleyilerden değil, temeldeki maskelenen diziden değil ve genel olarak atama işlemlerinde verilerin otomatik olarak kopyalanmadığı pythondan değildir. – innoSPG

+0

Gotcha, açıklama için teşekkürler! –

İlgili konular