Skip to content

Commit

Permalink
BUG: value_indices unfixed types
Browse files Browse the repository at this point in the history
* Fixes scipygh-19423

* Add a few more `case` statements to account for
the (i.e., Windows) data types that don't have a fixed
width, and add a regression test.

[skip circle] [skip cirrus]
  • Loading branch information
tylerjereddy committed May 5, 2024
1 parent 4a537b7 commit 266330b
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 0 deletions.
8 changes: 8 additions & 0 deletions scipy/ndimage/src/nd_image.c
Original file line number Diff line number Diff line change
Expand Up @@ -999,6 +999,8 @@ static PyObject *NI_ValueIndices(PyObject *self, PyObject *args)
case NPY_UINT32: CASE_VALUEINDICES_SET_MINMAX(npy_uint32); break;
case NPY_INT64: CASE_VALUEINDICES_SET_MINMAX(npy_int64); break;
case NPY_UINT64: CASE_VALUEINDICES_SET_MINMAX(npy_uint64); break;
case NPY_UINT: CASE_VALUEINDICES_SET_MINMAX(npy_uint); break;
case NPY_INT: CASE_VALUEINDICES_SET_MINMAX(npy_int); break;
}
NI_ITERATOR_NEXT(ndiIter, arrData);
}
Expand All @@ -1016,6 +1018,8 @@ static PyObject *NI_ValueIndices(PyObject *self, PyObject *args)
case NPY_UINT32: CASE_VALUEINDICES_MAKEHISTOGRAM(npy_uint32); break;
case NPY_INT64: CASE_VALUEINDICES_MAKEHISTOGRAM(npy_int64); break;
case NPY_UINT64: CASE_VALUEINDICES_MAKEHISTOGRAM(npy_uint64); break;
case NPY_INT: CASE_VALUEINDICES_MAKEHISTOGRAM(npy_int); break;
case NPY_UINT: CASE_VALUEINDICES_MAKEHISTOGRAM(npy_uint); break;
}
}

Expand Down Expand Up @@ -1047,6 +1051,8 @@ static PyObject *NI_ValueIndices(PyObject *self, PyObject *args)
case NPY_UINT32: CASE_VALUEINDICES_MAKE_VALUEOBJ_FROMOFFSET(npy_uint32, ii); break;
case NPY_INT64: CASE_VALUEINDICES_MAKE_VALUEOBJ_FROMOFFSET(npy_int64, ii); break;
case NPY_UINT64: CASE_VALUEINDICES_MAKE_VALUEOBJ_FROMOFFSET(npy_uint64, ii); break;
case NPY_INT: CASE_VALUEINDICES_MAKE_VALUEOBJ_FROMOFFSET(npy_int, ii); break;
case NPY_UINT: CASE_VALUEINDICES_MAKE_VALUEOBJ_FROMOFFSET(npy_uint, ii); break;
}
/* Create a tuple of <ndim> index arrays */
t = PyTuple_New(ndim);
Expand Down Expand Up @@ -1093,6 +1099,8 @@ static PyObject *NI_ValueIndices(PyObject *self, PyObject *args)
case NPY_UINT32: CASE_VALUEINDICES_GET_VALUEOFFSET(npy_uint32); break;
case NPY_INT64: CASE_VALUEINDICES_GET_VALUEOFFSET(npy_int64); break;
case NPY_UINT64: CASE_VALUEINDICES_GET_VALUEOFFSET(npy_uint64); break;
case NPY_INT: CASE_VALUEINDICES_GET_VALUEOFFSET(npy_int); break;
case NPY_UINT: CASE_VALUEINDICES_GET_VALUEOFFSET(npy_uint); break;
}

if (ignoreValIsNone || (!valueIsIgnore)) {
Expand Down
10 changes: 10 additions & 0 deletions scipy/ndimage/tests/test_measurements.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
assert_equal,
suppress_warnings,
)
import pytest
from pytest import raises as assert_raises

import scipy.ndimage as ndimage
Expand Down Expand Up @@ -1407,3 +1408,12 @@ def test_watershed_ift09(self):
expected = [[1, 1],
[1, 1]]
assert_allclose(out, expected)


@pytest.mark.parametrize("dt", [np.intc, np.uintc])
def test_gh_19423(dt):
rng = np.random.default_rng(123)
max_val = 8
image = rng.integers(low=0, high=max_val, size=(10, 12)).astype(dtype=dt)
val_idx = ndimage.value_indices(image)
assert len(val_idx.keys()) == max_val

0 comments on commit 266330b

Please sign in to comment.