NUMPY_API * Put values into an array according to a mask. */
| 630 | * Put values into an array according to a mask. |
| 631 | */ |
| 632 | NPY_NO_EXPORT PyObject * |
| 633 | PyArray_PutMask(PyArrayObject *self, PyObject* values0, PyObject* mask0) |
| 634 | { |
| 635 | PyArrayObject *mask, *values; |
| 636 | PyArray_Descr *dtype; |
| 637 | npy_intp itemsize, ni, nv; |
| 638 | char *src, *dest; |
| 639 | npy_bool *mask_data; |
| 640 | int copied = 0; |
| 641 | int overlap = 0; |
| 642 | NPY_BEGIN_THREADS_DEF; |
| 643 | |
| 644 | mask = NULL; |
| 645 | values = NULL; |
| 646 | if (!PyArray_Check(self)) { |
| 647 | PyErr_SetString(PyExc_TypeError, |
| 648 | "putmask: first argument must " |
| 649 | "be an array"); |
| 650 | return NULL; |
| 651 | } |
| 652 | |
| 653 | if (PyArray_FailUnlessWriteable(self, "putmask: output array") < 0) { |
| 654 | return NULL; |
| 655 | } |
| 656 | |
| 657 | mask = (PyArrayObject *)PyArray_FROM_OTF(mask0, NPY_BOOL, |
| 658 | NPY_ARRAY_CARRAY | NPY_ARRAY_FORCECAST); |
| 659 | if (mask == NULL) { |
| 660 | goto fail; |
| 661 | } |
| 662 | ni = PyArray_SIZE(mask); |
| 663 | if (ni != PyArray_SIZE(self)) { |
| 664 | PyErr_SetString(PyExc_ValueError, |
| 665 | "putmask: mask and data must be " |
| 666 | "the same size"); |
| 667 | goto fail; |
| 668 | } |
| 669 | mask_data = PyArray_DATA(mask); |
| 670 | dtype = PyArray_DESCR(self); |
| 671 | Py_INCREF(dtype); |
| 672 | values = (PyArrayObject *)PyArray_FromAny(values0, dtype, |
| 673 | 0, 0, NPY_ARRAY_CARRAY, NULL); |
| 674 | if (values == NULL) { |
| 675 | goto fail; |
| 676 | } |
| 677 | nv = PyArray_SIZE(values); /* zero if null array */ |
| 678 | if (nv <= 0) { |
| 679 | Py_XDECREF(values); |
| 680 | Py_XDECREF(mask); |
| 681 | Py_RETURN_NONE; |
| 682 | } |
| 683 | src = PyArray_DATA(values); |
| 684 | |
| 685 | overlap = arrays_overlap(self, values) || arrays_overlap(self, mask); |
| 686 | if (overlap || !PyArray_ISCONTIGUOUS(self)) { |
| 687 | int flags = NPY_ARRAY_CARRAY | NPY_ARRAY_WRITEBACKIFCOPY; |
| 688 | PyArrayObject *obj; |
| 689 |
no test coverage detected