From 0807e2eb287b10c205bdb289de75e645663ccc05 Mon Sep 17 00:00:00 2001 From: Slesa Adhikari Date: Mon, 8 Sep 2025 15:19:44 -0500 Subject: [PATCH 1/2] Copy masked array to a new array rather than replacing in place --- rio_stac/stac.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/rio_stac/stac.py b/rio_stac/stac.py index 1aaab81..8748e3e 100644 --- a/rio_stac/stac.py +++ b/rio_stac/stac.py @@ -159,16 +159,16 @@ def get_eobands_info( def _get_stats(arr: numpy.ma.MaskedArray, **kwargs: Any) -> Dict: """Calculate array statistics.""" # Avoid non masked nan/inf values - numpy.ma.fix_invalid(arr, copy=False) - sample, edges = numpy.histogram(arr[~arr.mask]) + masked_arr = numpy.ma.fix_invalid(arr, copy=False) + sample, edges = numpy.histogram(masked_arr[~masked_arr.mask]) return { "statistics": { - "mean": arr.mean().item(), - "minimum": arr.min().item(), - "maximum": arr.max().item(), - "stddev": arr.std().item(), + "mean": masked_arr.mean().item(), + "minimum": masked_arr.min().item(), + "maximum": masked_arr.max().item(), + "stddev": masked_arr.std().item(), "valid_percent": float( - numpy.count_nonzero(~arr.mask) / float(arr.data.size) * 100 + numpy.count_nonzero(~masked_arr.mask) / float(masked_arr.data.size) * 100 ), }, "histogram": { From 225ceedb5abe1f4dac6e4a92c72560397712bd4d Mon Sep 17 00:00:00 2001 From: vincentsarago Date: Tue, 9 Sep 2025 09:56:23 +0200 Subject: [PATCH 2/2] add tests --- rio_stac/stac.py | 15 ++++++++------- tests/fixtures/dataset_missing_nodata_nan.tif | Bin 0 -> 29549 bytes tests/test_create_item.py | 18 +++++++++++++++++- 3 files changed, 25 insertions(+), 8 deletions(-) create mode 100644 tests/fixtures/dataset_missing_nodata_nan.tif diff --git a/rio_stac/stac.py b/rio_stac/stac.py index 8748e3e..1745713 100644 --- a/rio_stac/stac.py +++ b/rio_stac/stac.py @@ -159,16 +159,17 @@ def get_eobands_info( def _get_stats(arr: numpy.ma.MaskedArray, **kwargs: Any) -> Dict: """Calculate array statistics.""" # Avoid non masked nan/inf values - masked_arr = numpy.ma.fix_invalid(arr, copy=False) - sample, edges = numpy.histogram(masked_arr[~masked_arr.mask]) + arr = numpy.ma.fix_invalid(arr, copy=True) + + sample, edges = numpy.histogram(arr[~arr.mask]) return { "statistics": { - "mean": masked_arr.mean().item(), - "minimum": masked_arr.min().item(), - "maximum": masked_arr.max().item(), - "stddev": masked_arr.std().item(), + "mean": arr.mean().item(), + "minimum": arr.min().item(), + "maximum": arr.max().item(), + "stddev": arr.std().item(), "valid_percent": float( - numpy.count_nonzero(~masked_arr.mask) / float(masked_arr.data.size) * 100 + numpy.count_nonzero(~arr.mask) / float(arr.data.size) * 100 ), }, "histogram": { diff --git a/tests/fixtures/dataset_missing_nodata_nan.tif b/tests/fixtures/dataset_missing_nodata_nan.tif new file mode 100644 index 0000000000000000000000000000000000000000..db80b94111a9c775a2da2b35e53ebac5246d8805 GIT binary patch literal 29549 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 literal 0 HcmV?d00001 diff --git a/tests/test_create_item.py b/tests/test_create_item.py index a1fb15a..01c3cd4 100644 --- a/tests/test_create_item.py +++ b/tests/test_create_item.py @@ -4,11 +4,12 @@ import json import os +import numpy import pystac import pytest import rasterio -from rio_stac.stac import create_stac_item +from rio_stac.stac import create_stac_item, get_raster_info from .conftest import requires_hdf4, requires_hdf5 @@ -356,3 +357,18 @@ def test_json_serialization(): assert item.validate() item_dict = item.to_dict() assert json.dumps(item_dict) + + +def test_stats_with_nan_missing_nodata(): + """Stats should ignore nan/inf values. + + Ref: https://github.com/developmentseed/rio-stac/issues/70 + """ + src_path = os.path.join(PREFIX, "dataset_missing_nodata_nan.tif") + with rasterio.open(src_path) as src: + arr = src.read(masked=True) + assert numpy.isnan(arr.max().item()) + + info = get_raster_info(src) + assert info[0]["statistics"]["minimum"] > 0 + assert info[0]["statistics"]["maximum"] > 0