Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Make combine_arrays understand non-numpy arrays #1216

Merged
merged 9 commits into from May 28, 2020
15 changes: 13 additions & 2 deletions satpy/dataset.py
Expand Up @@ -17,10 +17,10 @@
# satpy. If not, see <http://www.gnu.org/licenses/>.
"""Dataset objects."""

import sys
import logging
import numbers
from collections import namedtuple
from collections.abc import Collection
from datetime import datetime

import numpy as np
Expand Down Expand Up @@ -98,10 +98,21 @@ def combine_metadata(*metadata_objects, **kwargs):
shared_info = {}
for k in shared_keys:
values = [nfo[k] for nfo in info_dicts]
any_arrays = any([isinstance(val, np.ndarray) for val in values])
any_arrays = any([hasattr(val, "__array__") for val in values])
# in the real world, the `ancillary_variables` attribute may be
# List[xarray.DataArray], this means our values are now
# List[List[xarray.DataArray]].
any_list_of_arrays = any(
[isinstance(val, Collection) and len(val) > 0 and
all([hasattr(subval, "__array__")
for subval in val])
for val in values])
if any_arrays:
if all(np.all(val == values[0]) for val in values[1:]):
shared_info[k] = values[0]
elif any_list_of_arrays:
if all(np.array_equal(val, values[0]) for val in values[1]):
gerritholl marked this conversation as resolved.
Show resolved Hide resolved
shared_info[k] = values[0]
elif 'time' in k and isinstance(values[0], datetime) and average_times:
shared_info[k] = average_datetimes(values)
elif all(val == values[0] for val in values[1:]):
Expand Down
17 changes: 17 additions & 0 deletions satpy/tests/test_dataset.py
Expand Up @@ -84,3 +84,20 @@ def test_combine_times(self):
ret = combine_metadata(*dts, average_times=False)
# times are not equal so don't include it in the final result
self.assertNotIn('start_time', ret)

def test_combine_arrays(self):
"""Test the combine_metadata with arrays."""
from satpy.dataset import combine_metadata
from numpy import arange, ones
from xarray import DataArray
dts = [
{"quality": (arange(25) % 2).reshape(5, 5).astype("?")},
{"quality": (arange(1, 26) % 3).reshape(5, 5).astype("?")},
{"quality": ones((5, 5,), "?")},
]
combine_metadata(*dts)
dts2 = [{"quality": DataArray(d["quality"])} for d in dts]
combine_metadata(*dts2)
# the ancillary_variables attribute is actually a list of data arrays
dts3 = [{"quality": [d["quality"]]} for d in dts]
combine_metadata(*dts3)