lat = np.flip(lat) vanom = np.flip(vanom, axis=1) # Detrend the variable (taken from calc_amv_hadisst.py) # ---------------------------------------------------- start = time.time() indata = vanom.reshape(nmon, nlat * nlon).T # Transpose to [Space x Time] okdata, knan, okpts = proc.find_nan(indata, 1) x = np.arange(0, nmon, 1) if detrend == 0: # Compute global weighted average glomean = proc.area_avg(vanom.transpose(2, 1, 0), [0, 360, -90, 90], lon, lat, 1) # Regress back to the original data to get the global component beta, b = proc.regress_2d(glomean, okdata) # Subtract this from the original data okdt = okdata - beta[:, None] else: # Polynomial Detrend okdt, model = proc.detrend_poly(x, okdata, detrend) if debug: fig, ax = plt.subplots(1, 1) ax.scatter(x, okdata[44, :], label='raw') ax.plot(x, model[44, :], label='fit') ax.scatter(x, okdt[:, 44], label='dt') ax.set_title("Visualize Detrending Method %i" % detrend) #okdt = okdt.T data_dt = np.zeros((nmon, nlat * nlon)) * np.nan
usedtfunction = 1 # Set to 1 to use the new detrending function if usedtfunction == 1: start = time.time() dt_hsst, ymodall, _, _ = proc.detrend_dim(hsstnew, 2) print("Detrended in %.2fs" % (time.time() - start)) else: # Reshape to [Time x Space] and remove NaN Points start = time.time() hsstnew = np.reshape(hsstnew, (360 * 180, 1176)).T hsstok, knan, okpts = proc.find_nan(hsstnew, 0) tper = np.arange(0, hsstok.shape[0]) beta, b = proc.regress_2d(tper, hsstok) # Perform regression # Detrend dt_hsst = hsstnew[:, okpts] - (beta[:, None] * tper + b[:, None]).T # Replace NaN vaues back into the system hsstall = np.zeros(hsstnew.shape) * np.nan hsstall[:, okpts] = dt_hsst # Also save the linear model ymodall = np.zeros(hsstnew.shape) * np.nan ymodall[:, okpts] = (beta[:, None] * tper + b[:, None]).T # Reshape again dt_hsst = np.reshape(hsstall.T, (360, 180, 1176)) hsstnew = np.reshape(hsstnew.T, (360, 180, 1176))
# Get dimension sizes nens, nyr, nlat, nlon = var.shape npc = pcall.shape[2] # Combine lat and lon dimensions var = np.reshape(var, (nens, nyr, nlat * nlon)) #%% Regress for each mode and ensemble membe varpattern = np.zeros((npc, nens, nlat * nlon)) for n in range(npc): for e in range(nens): pcin = pcall[e, :, n] datain = var[e, ...] varpattern[n, e, :], _ = proc.regress_2d(pcin, datain) msg = '\rCompleted Regression for PC %02i/%02i, ENS %02i/%02i' % ( n + 1, npc, e + 1, nens) print(msg, end="\r", flush=True) # Reshape variable [pc, ens, lat, lon] varout = np.reshape(varpattern, (npc, nens, nlat, nlon)) F = np.copy(varout) outname = datpath + "NAO_EAP_%s_ForcingDJFM.npy" % flux np.save(outname, F)
flx = flx[:, [-1, 0, 1, 2], :].mean(1) # Select DJFM # Restrict PC (drop first 2 years due to ensolag + 3monwin, and end year due to 3monwin) pcin = pcall[2:-1, :] # Standardize PC pcstd = pcin / np.std(pcin, 0) # Preallocate pattern = np.zeros((nlat * nlon, N_mode)) # [space x pc] for p in range(N_mode): pc = pcstd[:, p] pattern[:, p], _ = proc.regress_2d(pc, flx, nanwarn=1) print("Regressed nhflx to PC %i" % (p + 1)) pattern = pattern.reshape(nlat, nlon, N_mode) if debug: plt.pcolormesh(lon, lat, pattern[:, :, 0], cmap=cmap), plt.colorbar(), plt.title("EOF 1"), plt.show() #%% Do the same for PSL # Read out psl values psl_all = dsall.PSL.values # Calculate DJFM Mean ntime, nlat, nlon = psl_all.shape
okdata, knan, okpts = proc.find_nan(varens, 1) okdatap, knanp, okptsp = proc.find_nan(varglo, 1) #% Perform EOF ------------- _, pcs, varexpall[e, :] = proc.eof_simple(okdata, N_mode, 1) # Standardize pc before regression along the time dimension pcstd = np.squeeze(pcs / np.std(pcs, 0)) #Loop for each mode... (NOte, can vectorize this to speed it up,.) psleofs = np.ones((192, 288, 3)) for pcn in range(N_mode): # Regress back to SLP eofpatokp, _ = proc.regress_2d(pcstd[:, pcn], okdatap, nanwarn=0) # Reshape regression pattern and put back (for psl) eofpatp = np.ones((192 * 288)) * np.nan eofpatp[okptsp] = eofpatokp eofpatp = np.reshape(eofpatp, (192, 288)) # ----- Check Sign start ----- if pcn == 0: # Check the signs and flip if necessary # EOF 1 only (need to figure out the other EOFs..) # First check using reykjavik rboxlon = np.where((lon >= lonReykjavik - tol) & (lon <= lonReykjavik + tol))[0] rboxlat = np.where((lat >= latReykjavik - tol) & (lat <= latReykjavik + tol))[0]