This is an automated email from the ASF dual-hosted git repository. fgreg pushed a commit to branch v1.0.0-rc1 in repository https://gitbox.apache.org/repos/asf/incubator-sdap-ningesterpy.git
commit 7388987bb4ebcb0b97d299897c30cde97bfbe1a0 Author: nchung <[email protected]> AuthorDate: Wed Feb 28 15:23:02 2018 -0800 SDAP-26 Create new ningesterpy processor to delete axis from data array --- sdap/processors/__init__.py | 2 ++ sdap/processors/deleteunitaxis.py | 43 +++++++++++++++++++++++++++++++++ tests/deleteunitaxis_test.py | 51 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 96 insertions(+) diff --git a/sdap/processors/__init__.py b/sdap/processors/__init__.py index 8f30cb8..8a48500 100644 --- a/sdap/processors/__init__.py +++ b/sdap/processors/__init__.py @@ -52,6 +52,7 @@ class NexusTileProcessor(Processor): from sdap.processors.callncpdq import CallNcpdq from sdap.processors.callncra import CallNcra from sdap.processors.computespeeddirfromuv import ComputeSpeedDirFromUV +from sdap.processors.deleteunitaxis import DeleteUnitAxis from sdap.processors.emptytilefilter import EmptyTileFilter from sdap.processors.kelvintocelsius import KelvinToCelsius from sdap.processors.normalizetimebeginningofmonth import NormalizeTimeBeginningOfMonth @@ -65,6 +66,7 @@ INSTALLED_PROCESSORS = { "CallNcpdq": CallNcpdq, "CallNcra": CallNcra, "ComputeSpeedDirFromUV": ComputeSpeedDirFromUV, + "DeleteUnitAxis": DeleteUnitAxis, "EmptyTileFilter": EmptyTileFilter, "KelvinToCelsius": KelvinToCelsius, "NormalizeTimeBeginningOfMonth": NormalizeTimeBeginningOfMonth, diff --git a/sdap/processors/deleteunitaxis.py b/sdap/processors/deleteunitaxis.py new file mode 100644 index 0000000..602f71b --- /dev/null +++ b/sdap/processors/deleteunitaxis.py @@ -0,0 +1,43 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import numpy +from nexusproto.serialization import from_shaped_array, to_shaped_array + +from sdap.processors import NexusTileProcessor + + +class DeleteUnitAxis(NexusTileProcessor): + + def __init__(self, dimension, *args, **kwargs): + super().__init__(*args, **kwargs) + + self.dimension = dimension + + def process_nexus_tile(self, nexus_tile): + axis = [x.split(':')[0] for x in nexus_tile.summary.section_spec.split(',')].index(self.dimension) + + the_tile_type = nexus_tile.tile.WhichOneof("tile_type") + + the_tile_data = getattr(nexus_tile.tile, the_tile_type) + + var_data = from_shaped_array(the_tile_data.variable_data) + + if numpy.size(var_data, axis) == 1: + the_tile_data.variable_data.CopyFrom(to_shaped_array(numpy.squeeze(var_data, axis=axis))) + else: + raise RuntimeError("Cannot delete axis for dimension %s because length is not 1." % self.dimension) + + yield nexus_tile diff --git a/tests/deleteunitaxis_test.py b/tests/deleteunitaxis_test.py new file mode 100644 index 0000000..32e4d94 --- /dev/null +++ b/tests/deleteunitaxis_test.py @@ -0,0 +1,51 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import unittest +from os import path + +from nexusproto import DataTile_pb2 as nexusproto +from nexusproto.serialization import from_shaped_array + +import sdap.processors + + +class TestDeleteTimeAxis(unittest.TestCase): + def setUp(self): + self.module = sdap.processors.DeleteUnitAxis("time") + + def test_kelvin_to_celsius(self): + test_file = path.join(path.dirname(__file__), 'dumped_nexustiles', 'avhrr_nonempty_nexustile.bin') + + with open(test_file, 'rb') as f: + nexustile_str = f.read() + + nexus_tile_before = nexusproto.NexusTile.FromString(nexustile_str) + + sst_before = from_shaped_array(nexus_tile_before.tile.grid_tile.variable_data) + + self.assertEqual((1, 10, 10), sst_before.shape) + + results = list(self.module.process(nexustile_str)) + + nexus_tile_after = results[0] + + sst_after = from_shaped_array(nexus_tile_after.tile.grid_tile.variable_data) + + self.assertEqual((10, 10), sst_after.shape) + + +if __name__ == '__main__': + unittest.main()
