diff --git a/MeteoInfoLab/milconfig.xml b/MeteoInfoLab/milconfig.xml index 7acb57ac..13a0c93f 100644 --- a/MeteoInfoLab/milconfig.xml +++ b/MeteoInfoLab/milconfig.xml @@ -1,9 +1,6 @@ - - - - + @@ -16,24 +13,27 @@ + + + - + - + - + diff --git a/MeteoInfoLab/pylib/mipylib/meteolib/meteo$py.class b/MeteoInfoLab/pylib/mipylib/meteolib/meteo$py.class index 5f65c505..c8fa63b0 100644 Binary files a/MeteoInfoLab/pylib/mipylib/meteolib/meteo$py.class and b/MeteoInfoLab/pylib/mipylib/meteolib/meteo$py.class differ diff --git a/MeteoInfoLab/pylib/mipylib/meteolib/meteo.py b/MeteoInfoLab/pylib/mipylib/meteolib/meteo.py index a6870521..0fd62b70 100644 --- a/MeteoInfoLab/pylib/mipylib/meteolib/meteo.py +++ b/MeteoInfoLab/pylib/mipylib/meteolib/meteo.py @@ -797,4 +797,47 @@ def varimax(x, normalize=False, tol=1e-10, it_max=1000): # Final matrix. r = np.dot(x, TT) - return r, TT \ No newline at end of file + return r, TT + +def centered_rms_dev(predicted,reference): + ''' + Calculates the centered root-mean-square (RMS) difference between + two variables PREDICTED and REFERENCE (E'). The latter is calculated + using the formula: + (E')^2 = sum_(n=1)^N [(p_n - mean(p))(r_n - mean(r))]^2/N + where p is the predicted values, r is the reference values, and + N is the total number of values in p & r. Note that p & r must + have the same number of values. + Input: + PREDICTED : predicted field + REFERENCE : reference field + Output: + CRMSDIFF : centered root-mean-square (RMS) difference (E')^2 + Author: Peter A. Rochford + Symplectic, LLC + www.thesymplectic.com + prochford@thesymplectic.com + Created on Nov 24, 2016 + ''' + + # Check that dimensions of predicted and reference fields match + pdims= predicted.shape + rdims= reference.shape + if not np.array_equal(pdims,rdims): + message = 'predicted and reference field dimensions do not' + \ + ' match.\n' + \ + 'shape(predicted)= ' + str(pdims) + ', ' + \ + 'shape(reference)= ' + str(rdims) + \ + '\npredicted type: ' + str(type(predicted)) + raise ValueError(message) + + # Calculate means + pmean = np.mean(predicted) + rmean = np.mean(reference) + + # Calculate (E')^2 + crmsd = np.square((predicted - pmean) - (reference - rmean)) + crmsd = np.sum(crmsd)/predicted.size + crmsd = np.sqrt(crmsd) + + return crmsd \ No newline at end of file diff --git a/MeteoInfoLab/pylib/mipylib/numeric/core/multiarray$py.class b/MeteoInfoLab/pylib/mipylib/numeric/core/multiarray$py.class index b5d476ea..a3aaa033 100644 Binary files a/MeteoInfoLab/pylib/mipylib/numeric/core/multiarray$py.class and b/MeteoInfoLab/pylib/mipylib/numeric/core/multiarray$py.class differ diff --git a/MeteoInfoLab/pylib/mipylib/numeric/core/multiarray.py b/MeteoInfoLab/pylib/mipylib/numeric/core/multiarray.py index 6f736ebf..969adc84 100644 --- a/MeteoInfoLab/pylib/mipylib/numeric/core/multiarray.py +++ b/MeteoInfoLab/pylib/mipylib/numeric/core/multiarray.py @@ -670,7 +670,10 @@ class NDArray(object): else: r = ArrayMath.std(self._array, axis) return NDArray(r) - + + def square(self): + return self.__mul__(self) + def sqrt(self): return NDArray(ArrayMath.sqrt(self._array)) diff --git a/MeteoInfoLab/pylib/mipylib/numeric/core/numeric$py.class b/MeteoInfoLab/pylib/mipylib/numeric/core/numeric$py.class index a0823710..aaf3c49a 100644 Binary files a/MeteoInfoLab/pylib/mipylib/numeric/core/numeric$py.class and b/MeteoInfoLab/pylib/mipylib/numeric/core/numeric$py.class differ diff --git a/MeteoInfoLab/pylib/mipylib/numeric/core/numeric.py b/MeteoInfoLab/pylib/mipylib/numeric/core/numeric.py index 5f2c2c51..f58ba39e 100644 --- a/MeteoInfoLab/pylib/mipylib/numeric/core/numeric.py +++ b/MeteoInfoLab/pylib/mipylib/numeric/core/numeric.py @@ -44,7 +44,7 @@ __all__ = [ 'logspace','magnitude','max','maximum','mean','median','meshgrid','min','minimum','monthname', 'newaxis','nonzero','ones','ones_like','pol2cart','polyval','power', 'radians','ravel','reshape','repeat', - 'rolling_mean','rot90','sin','smooth5','smooth9','sort','squeeze','argsort','sqrt','std','sum','swapaxes','tan', + 'rolling_mean','rot90','sin','smooth5','smooth9','sort','squeeze','argsort','sqrt','square','std','sum','swapaxes','tan', 'tile','transpose','trapz','vdot','unique','unravel_index','var','vstack', 'where','zeros','zeros_like' ] @@ -550,6 +550,21 @@ def absolute(x): return x.abs() else: return abs(x) + +def square(x): + """ + Return the element-wise square of the input. + + :param x: (*array_like*) Input data. + + :returns: Element-wise x*x, of the same shape and dtype as x. This is a scalar if x is a scalar. + """ + if isinstance(x, list): + return array(x).square() + elif isinstance(x, NDArray): + return x.square() + else: + return x * x def sqrt(x): """ @@ -557,7 +572,7 @@ def sqrt(x): :param x: (*array_like*) The values whose square-roots are required. - :returns y: (*array_like*) An array of the same shape as *x*, containing the positive + :returns: (*array_like*) An array of the same shape as *x*, containing the positive square-root of each element in *x*. Examples::