diff options
author | ahaldane <ealloc@gmail.com> | 2016-01-12 20:32:43 -0500 |
---|---|---|
committer | ahaldane <ealloc@gmail.com> | 2016-01-12 20:32:43 -0500 |
commit | bdd4558c2643c93957b7f00f2604da33ee72f83d (patch) | |
tree | 417b0e4c39fbd7f5969653023f4aa5c76a742587 /numpy | |
parent | 2df298d9ac469ec60a29373ea60cd17e0c4fd970 (diff) | |
parent | 090e85e7bd77e67c8b6bac63fc4b22331eac1950 (diff) | |
download | numpy-bdd4558c2643c93957b7f00f2604da33ee72f83d.tar.gz |
Merge pull request #6728 from gerritholl/structured_multidim_masked_array_fillvalue
BUG/TST: Fix for #6723 including test: force fill_value.ndim==0
Diffstat (limited to 'numpy')
-rw-r--r-- | numpy/ma/core.py | 20 | ||||
-rw-r--r-- | numpy/ma/tests/test_core.py | 4 |
2 files changed, 24 insertions, 0 deletions
diff --git a/numpy/ma/core.py b/numpy/ma/core.py index 9b0b1cc79..25b926e6b 100644 --- a/numpy/ma/core.py +++ b/numpy/ma/core.py @@ -3129,6 +3129,26 @@ class MaskedArray(ndarray): if isinstance(indx, basestring): if self._fill_value is not None: dout._fill_value = self._fill_value[indx] + + # If we're indexing a multidimensional field in a + # structured array (such as dtype("(2,)i2,(2,)i1")), + # dimensionality goes up (M[field].ndim == M.ndim + + # len(M.dtype[field].shape)). That's fine for + # M[field] but problematic for M[field].fill_value + # which should have shape () to avoid breaking several + # methods. There is no great way out, so set to + # first element. See issue #6723. + if dout._fill_value.ndim > 0: + if not (dout._fill_value == + dout._fill_value.flat[0]).all(): + warnings.warn( + "Upon accessing multidimensional field " + "{indx:s}, need to keep dimensionality " + "of fill_value at 0. Discarding " + "heterogeneous fill_value and setting " + "all to {fv!s}.".format(indx=indx, + fv=dout._fill_value[0])) + dout._fill_value = dout._fill_value.flat[0] dout._isfield = True # Update the mask if needed if _mask is not nomask: diff --git a/numpy/ma/tests/test_core.py b/numpy/ma/tests/test_core.py index adbbb26d1..9e5ad51bd 100644 --- a/numpy/ma/tests/test_core.py +++ b/numpy/ma/tests/test_core.py @@ -1662,6 +1662,10 @@ class TestFillingValues(TestCase): assert_equal(test, control) control = np.array((0, 0, 0), dtype="int, float, float").astype(ndtype) assert_equal(_check_fill_value(0, ndtype), control) + # but when indexing, fill value should become scalar not tuple + # See issue #6723 + M = masked_array(control) + assert_equal(M["f1"].fill_value.ndim, 0) def test_fillvalue_datetime_timedelta(self): # Test default fillvalue for datetime64 and timedelta64 types. |