diff options
author | Mark Wiebe <mwwiebe@gmail.com> | 2011-08-22 14:08:41 -0700 |
---|---|---|
committer | Charles Harris <charlesr.harris@gmail.com> | 2011-08-27 07:26:59 -0600 |
commit | d7076dcb8920e24d01507677efe4f206bd0fa1eb (patch) | |
tree | d82e6cd60f0e5b04f81defc60fabfb143bf51499 /numpy | |
parent | 0e1a4e9525b2c1e4abae97a6927cf59b5b2d534b (diff) | |
download | numpy-d7076dcb8920e24d01507677efe4f206bd0fa1eb.tar.gz |
ENH: missingdata: Make ndarray.view validate the maskna= parameter better
Diffstat (limited to 'numpy')
-rw-r--r-- | numpy/core/src/multiarray/methods.c | 39 | ||||
-rw-r--r-- | numpy/core/tests/test_maskna.py | 3 |
2 files changed, 38 insertions, 4 deletions
diff --git a/numpy/core/src/multiarray/methods.c b/numpy/core/src/multiarray/methods.c index 8ea186ead..b26350fbd 100644 --- a/numpy/core/src/multiarray/methods.c +++ b/numpy/core/src/multiarray/methods.c @@ -171,17 +171,38 @@ array_view(PyArrayObject *self, PyObject *args, PyObject *kwds) PyObject *out_type = NULL; PyArray_Descr *dtype = NULL; PyObject *ret; - int maskna = 0, ownmaskna = 0; + int maskna = -1, ownmaskna = 0; + PyObject *maskna_in = Py_None; static char *kwlist[] = {"dtype", "type", "maskna", "ownmaskna", NULL}; - if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OOii", kwlist, + if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OOOi", kwlist, &out_dtype, &out_type, - &maskna, + &maskna_in, &ownmaskna)) { return NULL; } + /* Treat None the same as not providing the parameter */ + if (maskna_in != Py_None) { + maskna = PyObject_IsTrue(maskna_in); + if (maskna == -1) { + return NULL; + } + } + + /* 'ownmaskna' forces 'maskna' to be True */ + if (ownmaskna) { + if (maskna == 0) { + PyErr_SetString(PyExc_ValueError, + "cannot specify maskna=False and ownmaskna=True"); + return NULL; + } + else { + maskna = 1; + } + } + /* If user specified a positional argument, guess whether it represents a type or a dtype for backward compatibility. */ if (out_dtype) { @@ -213,8 +234,11 @@ array_view(PyArrayObject *self, PyObject *args, PyObject *kwds) } ret = PyArray_View(self, dtype, (PyTypeObject*)out_type); + if (ret == NULL) { + return NULL; + } - if (maskna || ownmaskna) { + if (maskna == 1) { /* Ensure there is an NA mask if requested */ if (PyArray_AllocateMaskNA((PyArrayObject *)ret, ownmaskna, 0, 1) < 0) { @@ -223,6 +247,13 @@ array_view(PyArrayObject *self, PyObject *args, PyObject *kwds) } return ret; } + else if (maskna == 0 && PyArray_HASMASKNA(ret)) { + PyErr_SetString(PyExc_ValueError, + "Cannot take a view of an NA-masked array " + "with maskna=False"); + Py_DECREF(ret); + return NULL; + } else { return ret; } diff --git a/numpy/core/tests/test_maskna.py b/numpy/core/tests/test_maskna.py index ba10a2ce4..134a48e3a 100644 --- a/numpy/core/tests/test_maskna.py +++ b/numpy/core/tests/test_maskna.py @@ -334,6 +334,9 @@ def test_array_maskna_view_function(): assert_(c.flags.maskna) assert_(not c.flags.ownmaskna) + # Taking a view of a masked array with maskna=False is invalid + assert_raises(ValueError, b.view, maskna=False) + # Taking a view of a masked array, making sure there's a mask c = b.view(maskna = True) assert_(b.flags.maskna) |