summaryrefslogtreecommitdiff
path: root/numpy
diff options
context:
space:
mode:
Diffstat (limited to 'numpy')
-rw-r--r--numpy/ma/core.py20
-rw-r--r--numpy/ma/tests/test_core.py4
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.