From f2440b7c8ff40c7c518da871d10cef2eb65b2892 Mon Sep 17 00:00:00 2001 From: Javier Vegas-Regidor Date: Fri, 4 Oct 2019 10:26:01 +0200 Subject: [PATCH 1/2] Update gitignore --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index f705c88..d6441b1 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,6 @@ # Compiled python modules. *.pyc - +*.pyo # Setuptools distribution folder. /dist/ -- GitLab From d226525769c7955c5375daf61dbcf8e25694b82b Mon Sep 17 00:00:00 2001 From: Javier Vegas-Regidor Date: Thu, 9 Jan 2020 15:16:44 +0100 Subject: [PATCH 2/2] Fix regmean to use ma average --- diagonals/regmean.py | 16 ++++--- test/unit/test_regmean.py | 91 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 101 insertions(+), 6 deletions(-) create mode 100644 test/unit/test_regmean.py diff --git a/diagonals/regmean.py b/diagonals/regmean.py index 5e6eb9a..3bd88aa 100644 --- a/diagonals/regmean.py +++ b/diagonals/regmean.py @@ -29,7 +29,7 @@ def compute_regmean_2D(var, basins, area): Parameters ---------- var : float32 - Masked array containing variable data. + Masked array containing variable data. Can not contain NaNs basins : float32 List containing basin names and masks. area : float32 @@ -55,7 +55,7 @@ def compute_regmean_3D(var, basins, volume): Parameters ---------- var : float32 - Masked array containing variable data. + Masked array containing variable data. Can not contain NaNs basins : float32 List containing basin names and masks. volume : float32 @@ -81,7 +81,7 @@ def compute_regmean_levels(var, basins, volume): Parameters ---------- var : float32 - Masked array containing variable data. + Masked array containing variable data. Can not contain NaNs basins : float32 List containing basin names and masks. volume : float32 @@ -192,7 +192,7 @@ def _compute_regmean_levels_cpu(var, basins, volume): w = _compute_weights_3D(mask, volume) for t in range(times): for l in range(levs): - regmean[t, l] = np.average(var[t, l, :, :], axis=(0, 1), + regmean[t, l] = np.ma.average(var[t, l, :, :], axis=(0, 1), weights=np.squeeze(w)[l, :, :]) regmean_total[basin] = regmean return regmean_total @@ -214,7 +214,9 @@ def _compute_weights_2D(mask, area): weights: float32 Masked array containing the weights for a given region. """ - weights = mask*area + weights = mask * area + if np.isnan(weights): + weights = 0 return weights @@ -234,5 +236,7 @@ def _compute_weights_3D(mask, volume): weights: float32 Masked array containing the weights for a given region. """ - weights = mask*volume + weights = mask * volume + if np.isnan(weights): + weights = 0 return weights diff --git a/test/unit/test_regmean.py b/test/unit/test_regmean.py new file mode 100644 index 0000000..116e0bc --- /dev/null +++ b/test/unit/test_regmean.py @@ -0,0 +1,91 @@ +import unittest + +import numpy as np +import diagonals.regmean as regmean + + +class TestRegmeanLevels(unittest.TestCase): + + def setUp(self): + self.data = np.ones((2, 2, 2, 2)) + self.basins = { + 'basin1': np.ones((2, 2, 2), dtype=np.float32), + 'basin2': np.ones((2, 2, 2), dtype=np.float32) + } + self.volume = np.ones((2, 2, 2), dtype=np.float32) + + def test_basic(self): + mean = regmean.compute_regmean_levels( + self.data, self.basins, self.volume) + expected = { + 'basin1': np.ones((2, 2), dtype=np.float32), + 'basin2': np.ones((2, 2), dtype=np.float32) + } + for key in expected: + np.testing.assert_equal(expected[key], mean[key]) + + def test_basin_with_nans(self): + self.data[:, 1, ...] = 2 + self.basins['basin1'][0, 0] = float('nan') + + mean = regmean.compute_regmean_levels( + self.data, self.basins, self.volume) + expected = { + 'basin1': np.ones((2, 2), dtype=np.float32), + 'basin2': np.ones((2, 2), dtype=np.float32) + } + expected['basin1'][:, 1] = 2 + expected['basin2'][:, 1] = 2 + for key in expected: + np.testing.assert_equal(expected[key], mean[key]) + + def test_basin_with_zeros(self): + self.data[:, 1, ...] = 2 + self.basins['basin1'][0, 0] = 0. + + mean = regmean.compute_regmean_levels( + self.data, self.basins, self.volume) + expected = { + 'basin1': np.ones((2, 2), dtype=np.float32), + 'basin2': np.ones((2, 2), dtype=np.float32) + } + expected['basin1'][:, 1] = 2 + expected['basin2'][:, 1] = 2 + for key in expected: + np.testing.assert_equal(expected[key], mean[key]) + + def test_data_with_nans(self): + self.data[:, 1, ...] = 2 + self.data[:, 1, 0, 0] = float('nan') + + mean = regmean.compute_regmean_levels( + self.data, self.basins, self.volume) + expected = { + 'basin1': np.ones((2, 2), dtype=np.float32), + 'basin2': np.ones((2, 2), dtype=np.float32) + } + expected['basin1'][:, 1] = float('nan') + expected['basin2'][:, 1] = float('nan') + for key in expected: + np.testing.assert_equal(expected[key], mean[key]) + + def test_data_masked(self): + self.data[:, 1, ...] = 2 + self.data = np.ma.masked_array( + self.data, mask=np.zeros(self.data.shape)) + self.data.mask[:, 1, 0, 0] = True + + mean = regmean.compute_regmean_levels( + self.data, self.basins, self.volume) + expected = { + 'basin1': np.ones((2, 2), dtype=np.float32), + 'basin2': np.ones((2, 2), dtype=np.float32) + } + expected['basin1'][:, 1] = 2 + expected['basin2'][:, 1] = 2 + for key in expected: + np.testing.assert_equal(expected[key], mean[key]) + + +if __name__ == "__main__": + unittest.main() -- GitLab