[Python-modules-commits] [python-numpy] 01/17: Import python-numpy_1.13.3.orig.tar.gz
Sandro Tosi
morph at moszumanska.debian.org
Sun Nov 26 17:40:30 UTC 2017
This is an automated email from the git hooks/post-receive script.
morph pushed a commit to branch master
in repository python-numpy.
commit 91cce07f4d5710256bb8773227edc1acc82b3e45
Author: Sandro Tosi <morph at debian.org>
Date: Sun Nov 26 09:49:56 2017 -0500
Import python-numpy_1.13.3.orig.tar.gz
---
PKG-INFO | 2 +-
doc/release/1.13.2-notes.rst | 58 +
doc/release/1.13.3-notes.rst | 64 +
doc/source/conf.py | 2 +
doc/source/release.rst | 3 +
numpy/core/code_generators/generate_umath.py | 4 +-
numpy/core/numeric.py | 2 +-
numpy/core/src/multiarray/arraytypes.c.src | 16 +-
numpy/core/src/multiarray/cblasfuncs.c | 3 +-
numpy/core/src/multiarray/item_selection.c | 44 +-
numpy/core/src/multiarray/sequence.c | 37 +-
numpy/core/src/multiarray/temp_elide.c | 6 +-
numpy/core/src/npymath/npy_math_complex.c.src | 8 +-
numpy/core/src/private/npy_config.h | 13 +
numpy/core/src/umath/loops.c.src | 10 -
numpy/core/src/umath/loops.h.src | 3 -
numpy/core/src/umath/ufunc_type_resolution.c | 74 +-
numpy/core/src/umath/ufunc_type_resolution.h | 9 +-
numpy/core/tests/test_defchararray.py | 10 +-
numpy/core/tests/test_multiarray.py | 41 +-
numpy/core/tests/test_numeric.py | 41 +-
numpy/core/tests/test_ufunc.py | 85 +-
numpy/distutils/fcompiler/gnu.py | 3 +-
numpy/distutils/fcompiler/intel.py | 2 +-
numpy/distutils/mingw32ccompiler.py | 2 +-
numpy/distutils/tests/test_fcompiler_gnu.py | 3 +-
numpy/doc/basics.py | 6 +-
numpy/lib/arraypad.py | 8 +
numpy/lib/function_base.py | 21 +-
numpy/lib/polynomial.py | 10 +-
numpy/lib/tests/test_arraypad.py | 11 +
numpy/lib/tests/test_function_base.py | 17 +-
numpy/lib/tests/test_polynomial.py | 18 +-
numpy/polynomial/chebyshev.py | 16 +-
numpy/polynomial/hermite.py | 20 +-
numpy/polynomial/hermite_e.py | 20 +-
numpy/polynomial/laguerre.py | 20 +-
numpy/polynomial/legendre.py | 20 +-
numpy/polynomial/polynomial.py | 2 +-
numpy/random/mtrand/mtrand.c | 3582 +++++++++++++++----------
numpy/random/mtrand/numpy.pxd | 12 +-
numpy/version.py | 8 +-
setup.py | 2 +-
43 files changed, 2702 insertions(+), 1636 deletions(-)
diff --git a/PKG-INFO b/PKG-INFO
index ae659b0..f0d3c38 100644
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,6 +1,6 @@
Metadata-Version: 1.2
Name: numpy
-Version: 1.13.1
+Version: 1.13.3
Summary: NumPy: array processing for numbers, strings, records, and objects.
Home-page: http://www.numpy.org
Author: NumPy Developers
diff --git a/doc/release/1.13.2-notes.rst b/doc/release/1.13.2-notes.rst
new file mode 100644
index 0000000..f2f9120
--- /dev/null
+++ b/doc/release/1.13.2-notes.rst
@@ -0,0 +1,58 @@
+==========================
+NumPy 1.13.2 Release Notes
+==========================
+
+This is a bugfix release for some problems found since 1.13.1. The most
+important fixes are for CVE-2017-12852 and temporary elision. Users of earlier
+versions of 1.13 should upgrade.
+
+The Python versions supported are 2.7 and 3.4 - 3.6. The Python 3.6 wheels
+available from PIP are built with Python 3.6.2 and should be compatible with
+all previous versions of Python 3.6. The Windows wheels are now built
+with OpenBlas instead ATLAS, which should improve the performance of the linear
+algebra functions.
+
+Contributors
+============
+
+A total of 12 people contributed to this release. People with a "+" by their
+names contributed a patch for the first time.
+
+* Allan Haldane
+* Brandon Carter
+* Charles Harris
+* Eric Wieser
+* Iryna Shcherbina +
+* James Bourbeau +
+* Jonathan Helmus
+* Julian Taylor
+* Matti Picus
+* Michael Lamparski +
+* Michael Seifert
+* Ralf Gommers
+
+Pull requests merged
+====================
+
+A total of 20 pull requests were merged for this release.
+
+* #9390 BUG: Return the poly1d coefficients array directly
+* #9555 BUG: Fix regression in 1.13.x in distutils.mingw32ccompiler.
+* #9556 BUG: Fix true_divide when dtype=np.float64 specified.
+* #9557 DOC: Fix some rst markup in numpy/doc/basics.py.
+* #9558 BLD: Remove -xhost flag from IntelFCompiler.
+* #9559 DOC: Removes broken docstring example (source code, png, pdf)...
+* #9580 BUG: Add hypot and cabs functions to WIN32 blacklist.
+* #9732 BUG: Make scalar function elision check if temp is writeable.
+* #9736 BUG: Various fixes to np.gradient
+* #9742 BUG: Fix np.pad for CVE-2017-12852
+* #9744 BUG: Check for exception in sort functions, add tests
+* #9745 DOC: Add whitespace after "versionadded::" directive so it actually...
+* #9746 BUG: Memory leak in np.dot of size 0
+* #9747 BUG: Adjust gfortran version search regex
+* #9757 BUG: Cython 0.27 breaks NumPy on Python 3.
+* #9764 BUG: Ensure `_npy_scaled_cexp{,f,l}` is defined when needed.
+* #9765 BUG: PyArray_CountNonzero does not check for exceptions
+* #9766 BUG: Fixes histogram monotonicity check for unsigned bin values
+* #9767 BUG: Ensure consistent result dtype of count_nonzero
+* #9771 BUG, MAINT: Fix mtrand for Cython 0.27.
diff --git a/doc/release/1.13.3-notes.rst b/doc/release/1.13.3-notes.rst
new file mode 100644
index 0000000..7f7170b
--- /dev/null
+++ b/doc/release/1.13.3-notes.rst
@@ -0,0 +1,64 @@
+==========================
+NumPy 1.13.3 Release Notes
+==========================
+
+This is a bugfix release for some problems found since 1.13.1. The most
+important fixes are for CVE-2017-12852 and temporary elision. Users of earlier
+versions of 1.13 should upgrade.
+
+The Python versions supported are 2.7 and 3.4 - 3.6. The Python 3.6 wheels
+available from PIP are built with Python 3.6.2 and should be compatible with
+all previous versions of Python 3.6. It was cythonized with Cython 0.26.1,
+which should be free of the bugs found in 0.27 while also being compatible with
+Python 3.7-dev. The Windows wheels were built with OpenBlas instead ATLAS,
+which should improve the performance of the linear algebra functions.
+
+The NumPy 1.13.3 release is a re-release of 1.13.2, which suffered from a
+bug in Cython 0.27.0.
+
+Contributors
+============
+
+A total of 12 people contributed to this release. People with a "+" by their
+names contributed a patch for the first time.
+
+* Allan Haldane
+* Brandon Carter
+* Charles Harris
+* Eric Wieser
+* Iryna Shcherbina +
+* James Bourbeau +
+* Jonathan Helmus
+* Julian Taylor
+* Matti Picus
+* Michael Lamparski +
+* Michael Seifert
+* Ralf Gommers
+
+Pull requests merged
+====================
+
+A total of 22 pull requests were merged for this release.
+
+* #9390 BUG: Return the poly1d coefficients array directly
+* #9555 BUG: Fix regression in 1.13.x in distutils.mingw32ccompiler.
+* #9556 BUG: Fix true_divide when dtype=np.float64 specified.
+* #9557 DOC: Fix some rst markup in numpy/doc/basics.py.
+* #9558 BLD: Remove -xhost flag from IntelFCompiler.
+* #9559 DOC: Removes broken docstring example (source code, png, pdf)...
+* #9580 BUG: Add hypot and cabs functions to WIN32 blacklist.
+* #9732 BUG: Make scalar function elision check if temp is writeable.
+* #9736 BUG: Various fixes to np.gradient
+* #9742 BUG: Fix np.pad for CVE-2017-12852
+* #9744 BUG: Check for exception in sort functions, add tests
+* #9745 DOC: Add whitespace after "versionadded::" directive so it actually...
+* #9746 BUG: Memory leak in np.dot of size 0
+* #9747 BUG: Adjust gfortran version search regex
+* #9757 BUG: Cython 0.27 breaks NumPy on Python 3.
+* #9764 BUG: Ensure `_npy_scaled_cexp{,f,l}` is defined when needed.
+* #9765 BUG: PyArray_CountNonzero does not check for exceptions
+* #9766 BUG: Fixes histogram monotonicity check for unsigned bin values
+* #9767 BUG: Ensure consistent result dtype of count_nonzero
+* #9771 BUG: MAINT: Fix mtrand for Cython 0.27.
+* #9772 DOC: Create the 1.13.2 release notes.
+* #9794 DOC: Create 1.13.3 release notes.
diff --git a/doc/source/conf.py b/doc/source/conf.py
index cce0716..91d413b 100644
--- a/doc/source/conf.py
+++ b/doc/source/conf.py
@@ -126,6 +126,8 @@ htmlhelp_basename = 'numpy'
pngmath_use_preview = True
pngmath_dvipng_args = ['-gamma', '1.5', '-D', '96', '-bg', 'Transparent']
+plot_html_show_formats = False
+plot_html_show_source_link = False
# -----------------------------------------------------------------------------
# LaTeX output
diff --git a/doc/source/release.rst b/doc/source/release.rst
index 238df42..5cba24a 100644
--- a/doc/source/release.rst
+++ b/doc/source/release.rst
@@ -2,6 +2,9 @@
Release Notes
*************
+.. include:: ../release/1.13.3-notes.rst
+.. include:: ../release/1.13.2-notes.rst
+.. include:: ../release/1.13.1-notes.rst
.. include:: ../release/1.13.0-notes.rst
.. include:: ../release/1.12.1-notes.rst
.. include:: ../release/1.12.0-notes.rst
diff --git a/numpy/core/code_generators/generate_umath.py b/numpy/core/code_generators/generate_umath.py
index 2241618..af058b4 100644
--- a/numpy/core/code_generators/generate_umath.py
+++ b/numpy/core/code_generators/generate_umath.py
@@ -314,9 +314,7 @@ defdict = {
'true_divide':
Ufunc(2, 1, None, # One is only a unit to the right, not the left
docstrings.get('numpy.core.umath.true_divide'),
- 'PyUFunc_DivisionTypeResolver',
- TD('bBhH', out='d'),
- TD('iIlLqQ', out='d'),
+ 'PyUFunc_TrueDivisionTypeResolver',
TD(flts+cmplx),
[TypeDescription('m', FullTypeDescr, 'mq', 'm'),
TypeDescription('m', FullTypeDescr, 'md', 'm'),
diff --git a/numpy/core/numeric.py b/numpy/core/numeric.py
index 6b4a93c..6b1c6e8 100644
--- a/numpy/core/numeric.py
+++ b/numpy/core/numeric.py
@@ -445,7 +445,7 @@ def count_nonzero(a, axis=None):
counts = np.apply_along_axis(multiarray.count_nonzero, axis[0], a)
if axis.size == 1:
- return counts
+ return counts.astype(np.intp, copy=False)
else:
# for subsequent axis numbers, that number decreases
# by one in this new 'counts' array if it was larger
diff --git a/numpy/core/src/multiarray/arraytypes.c.src b/numpy/core/src/multiarray/arraytypes.c.src
index b111343..6d0fca4 100644
--- a/numpy/core/src/multiarray/arraytypes.c.src
+++ b/numpy/core/src/multiarray/arraytypes.c.src
@@ -2744,6 +2744,15 @@ OBJECT_compare(PyObject **ip1, PyObject **ip2, PyArrayObject *NPY_UNUSED(ap))
* the alignment of pointers, so it doesn't need to be handled
* here.
*/
+
+ int ret;
+ /*
+ * work around gh-3879, we cannot abort an in-progress quicksort
+ * so at least do not raise again
+ */
+ if (PyErr_Occurred()) {
+ return 0;
+ }
if ((*ip1 == NULL) || (*ip2 == NULL)) {
if (ip1 == ip2) {
return 1;
@@ -2754,7 +2763,12 @@ OBJECT_compare(PyObject **ip1, PyObject **ip2, PyArrayObject *NPY_UNUSED(ap))
return 1;
}
- if (PyObject_RichCompareBool(*ip1, *ip2, Py_LT) == 1) {
+ ret = PyObject_RichCompareBool(*ip1, *ip2, Py_LT);
+ if (ret < 0) {
+ /* error occurred, avoid the next call to PyObject_RichCompareBool */
+ return 0;
+ }
+ if (ret == 1) {
return -1;
}
else if (PyObject_RichCompareBool(*ip1, *ip2, Py_GT) == 1) {
diff --git a/numpy/core/src/multiarray/cblasfuncs.c b/numpy/core/src/multiarray/cblasfuncs.c
index 3b0b2f4..8432ae5 100644
--- a/numpy/core/src/multiarray/cblasfuncs.c
+++ b/numpy/core/src/multiarray/cblasfuncs.c
@@ -456,7 +456,8 @@ cblas_matrixproduct(int typenum, PyArrayObject *ap1, PyArrayObject *ap2,
if (numbytes == 0 || l == 0) {
Py_DECREF(ap1);
Py_DECREF(ap2);
- return PyArray_Return(out_buf);
+ Py_DECREF(out_buf);
+ return PyArray_Return(result);
}
if (ap2shape == _scalar) {
diff --git a/numpy/core/src/multiarray/item_selection.c b/numpy/core/src/multiarray/item_selection.c
index e601455..b001375 100644
--- a/numpy/core/src/multiarray/item_selection.c
+++ b/numpy/core/src/multiarray/item_selection.c
@@ -869,12 +869,9 @@ _new_sortlike(PyArrayObject *op, int axis, PyArray_SortFunc *sort,
if (part == NULL) {
ret = sort(bufptr, N, op);
-#if defined(NPY_PY3K)
- /* Object comparisons may raise an exception in Python 3 */
if (hasrefs && PyErr_Occurred()) {
ret = -1;
}
-#endif
if (ret < 0) {
goto fail;
}
@@ -885,12 +882,9 @@ _new_sortlike(PyArrayObject *op, int axis, PyArray_SortFunc *sort,
npy_intp i;
for (i = 0; i < nkth; ++i) {
ret = part(bufptr, N, kth[i], pivots, &npiv, op);
-#if defined(NPY_PY3K)
- /* Object comparisons may raise an exception in Python 3 */
if (hasrefs && PyErr_Occurred()) {
ret = -1;
}
-#endif
if (ret < 0) {
goto fail;
}
@@ -2073,6 +2067,8 @@ PyArray_CountNonzero(PyArrayObject *self)
char *data;
npy_intp stride, count;
npy_intp nonzero_count = 0;
+ int needs_api = 0;
+ PyArray_Descr *dtype;
NpyIter *iter;
NpyIter_IterNextFunc *iternext;
@@ -2081,22 +2077,38 @@ PyArray_CountNonzero(PyArrayObject *self)
NPY_BEGIN_THREADS_DEF;
/* Special low-overhead version specific to the boolean type */
- if (PyArray_DESCR(self)->type_num == NPY_BOOL) {
+ dtype = PyArray_DESCR(self);
+ if (dtype->type_num == NPY_BOOL) {
return count_boolean_trues(PyArray_NDIM(self), PyArray_DATA(self),
PyArray_DIMS(self), PyArray_STRIDES(self));
}
-
nonzero = PyArray_DESCR(self)->f->nonzero;
/* If it's a trivial one-dimensional loop, don't use an iterator */
if (PyArray_TRIVIALLY_ITERABLE(self)) {
+ needs_api = PyDataType_FLAGCHK(dtype, NPY_NEEDS_PYAPI);
PyArray_PREPARE_TRIVIAL_ITERATION(self, count, data, stride);
- while (count--) {
- if (nonzero(data, self)) {
- ++nonzero_count;
+ if (needs_api){
+ while (count--) {
+ if (nonzero(data, self)) {
+ ++nonzero_count;
+ }
+ if (PyErr_Occurred()) {
+ return -1;
+ }
+ data += stride;
}
- data += stride;
+ }
+ else {
+ NPY_BEGIN_THREADS_THRESHOLDED(count);
+ while (count--) {
+ if (nonzero(data, self)) {
+ ++nonzero_count;
+ }
+ data += stride;
+ }
+ NPY_END_THREADS;
}
return nonzero_count;
@@ -2121,6 +2133,7 @@ PyArray_CountNonzero(PyArrayObject *self)
if (iter == NULL) {
return -1;
}
+ needs_api = NpyIter_IterationNeedsAPI(iter);
/* Get the pointers for inner loop iteration */
iternext = NpyIter_GetIterNext(iter, NULL);
@@ -2145,16 +2158,21 @@ PyArray_CountNonzero(PyArrayObject *self)
if (nonzero(data, self)) {
++nonzero_count;
}
+ if (needs_api && PyErr_Occurred()) {
+ nonzero_count = -1;
+ goto finish;
+ }
data += stride;
}
} while(iternext(iter));
+finish:
NPY_END_THREADS;
NpyIter_Deallocate(iter);
- return PyErr_Occurred() ? -1 : nonzero_count;
+ return nonzero_count;
}
/*NUMPY_API
diff --git a/numpy/core/src/multiarray/sequence.c b/numpy/core/src/multiarray/sequence.c
index 55b72c1..4769bda 100644
--- a/numpy/core/src/multiarray/sequence.c
+++ b/numpy/core/src/multiarray/sequence.c
@@ -15,9 +15,7 @@
#include "mapping.h"
#include "sequence.h"
-
-static int
-array_any_nonzero(PyArrayObject *mp);
+#include "calculation.h"
/*************************************************************************
**************** Implement Sequence Protocol **************************
@@ -32,16 +30,18 @@ array_contains(PyArrayObject *self, PyObject *el)
{
/* equivalent to (self == el).any() */
- PyObject *res;
int ret;
+ PyObject *res, *any;
res = PyArray_EnsureAnyArray(PyObject_RichCompare((PyObject *)self,
el, Py_EQ));
if (res == NULL) {
return -1;
}
- ret = array_any_nonzero((PyArrayObject *)res);
+ any = PyArray_Any((PyArrayObject *)res, NPY_MAXDIMS, NULL);
Py_DECREF(res);
+ ret = PyObject_IsTrue(any);
+ Py_DECREF(any);
return ret;
}
@@ -61,30 +61,3 @@ NPY_NO_EXPORT PySequenceMethods array_as_sequence = {
/****************** End of Sequence Protocol ****************************/
-/*
- * Helpers
- */
-
-/* Array evaluates as "TRUE" if any of the elements are non-zero*/
-static int
-array_any_nonzero(PyArrayObject *arr)
-{
- npy_intp counter;
- PyArrayIterObject *it;
- npy_bool anyTRUE = NPY_FALSE;
-
- it = (PyArrayIterObject *)PyArray_IterNew((PyObject *)arr);
- if (it == NULL) {
- return anyTRUE;
- }
- counter = it->size;
- while (counter--) {
- if (PyArray_DESCR(arr)->f->nonzero(it->dataptr, arr)) {
- anyTRUE = NPY_TRUE;
- break;
- }
- PyArray_ITER_NEXT(it);
- }
- Py_DECREF(it);
- return anyTRUE;
-}
diff --git a/numpy/core/src/multiarray/temp_elide.c b/numpy/core/src/multiarray/temp_elide.c
index abca0ec..b8fa4c0 100644
--- a/numpy/core/src/multiarray/temp_elide.c
+++ b/numpy/core/src/multiarray/temp_elide.c
@@ -284,7 +284,7 @@ can_elide_temp(PyArrayObject * alhs, PyObject * orhs, int * cannot)
*/
if (Py_REFCNT(alhs) != 1 || !PyArray_CheckExact(alhs) ||
!PyArray_ISNUMBER(alhs) ||
- !(PyArray_FLAGS(alhs) & NPY_ARRAY_OWNDATA) ||
+ !PyArray_CHKFLAGS(alhs, NPY_ARRAY_OWNDATA) ||
!PyArray_ISWRITEABLE(alhs) ||
PyArray_CHKFLAGS(alhs, NPY_ARRAY_UPDATEIFCOPY) ||
PyArray_NBYTES(alhs) < NPY_MIN_ELIDE_BYTES) {
@@ -362,7 +362,9 @@ can_elide_temp_unary(PyArrayObject * m1)
int cannot;
if (Py_REFCNT(m1) != 1 || !PyArray_CheckExact(m1) ||
!PyArray_ISNUMBER(m1) ||
- !(PyArray_FLAGS(m1) & NPY_ARRAY_OWNDATA) ||
+ !PyArray_CHKFLAGS(m1, NPY_ARRAY_OWNDATA) ||
+ !PyArray_ISWRITEABLE(m1) ||
+ PyArray_CHKFLAGS(m1, NPY_ARRAY_UPDATEIFCOPY) ||
PyArray_NBYTES(m1) < NPY_MIN_ELIDE_BYTES) {
return 0;
}
diff --git a/numpy/core/src/npymath/npy_math_complex.c.src b/numpy/core/src/npymath/npy_math_complex.c.src
index a82a673..fb31e8e 100644
--- a/numpy/core/src/npymath/npy_math_complex.c.src
+++ b/numpy/core/src/npymath/npy_math_complex.c.src
@@ -184,7 +184,9 @@ npy_carg at c@(@ctype@ z)
#define SCALED_CEXP_LOWERL 11357.216553474703895L
#define SCALED_CEXP_UPPERL 22756.021937783004509L
-#ifndef HAVE_CEXP at C@
+#if !defined(HAVE_CSINH at C@) || \
+ !defined(HAVE_CCOSH at C@) || \
+ !defined(HAVE_CEXP at C@)
static
@ctype@
@@ -212,6 +214,10 @@ _npy_scaled_cexp at c@(@type@ x, @type@ y, npy_int expt)
npy_ldexp at c@(mant * mantsin, expt + exsin));
}
+#endif
+
+#ifndef HAVE_CEXP at C@
+
@ctype@
npy_cexp at c@(@ctype@ z)
{
diff --git a/numpy/core/src/private/npy_config.h b/numpy/core/src/private/npy_config.h
index b8e18e9..107b3cb 100644
--- a/numpy/core/src/private/npy_config.h
+++ b/numpy/core/src/private/npy_config.h
@@ -62,6 +62,19 @@
#endif
+/* MSVC _hypot messes with fp precision mode on 32-bit, see gh-9567 */
+#if defined(_MSC_VER) && (_MSC_VER >= 1900) && !defined(_WIN64)
+
+#undef HAVE_CABS
+#undef HAVE_CABSF
+#undef HAVE_CABSL
+
+#undef HAVE_HYPOT
+#undef HAVE_HYPOTF
+#undef HAVE_HYPOTL
+
+#endif
+
/* Intel C for Windows uses POW for 64 bits longdouble*/
#if defined(_MSC_VER) && defined(__INTEL_COMPILER)
diff --git a/numpy/core/src/umath/loops.c.src b/numpy/core/src/umath/loops.c.src
index 40ebc11..0d64a20 100644
--- a/numpy/core/src/umath/loops.c.src
+++ b/numpy/core/src/umath/loops.c.src
@@ -980,16 +980,6 @@ NPY_NO_EXPORT void
/**end repeat1**/
NPY_NO_EXPORT void
- at TYPE@_true_divide(char **args, npy_intp *dimensions, npy_intp *steps, void *NPY_UNUSED(func))
-{
- BINARY_LOOP {
- const double in1 = (double)(*(@type@ *)ip1);
- const double in2 = (double)(*(@type@ *)ip2);
- *((double *)op1) = in1/in2;
- }
-}
-
-NPY_NO_EXPORT void
@TYPE at _power(char **args, npy_intp *dimensions, npy_intp *steps, void *NPY_UNUSED(func))
{
BINARY_LOOP {
diff --git a/numpy/core/src/umath/loops.h.src b/numpy/core/src/umath/loops.h.src
index 4243c65..a978b03 100644
--- a/numpy/core/src/umath/loops.h.src
+++ b/numpy/core/src/umath/loops.h.src
@@ -120,9 +120,6 @@ NPY_NO_EXPORT void
/**end repeat2**/
NPY_NO_EXPORT void
- at S@@TYPE at _true_divide(char **args, npy_intp *dimensions, npy_intp *steps, void *NPY_UNUSED(func));
-
-NPY_NO_EXPORT void
@S@@TYPE at _power(char **args, npy_intp *dimensions, npy_intp *steps, void *NPY_UNUSED(func));
NPY_NO_EXPORT void
diff --git a/numpy/core/src/umath/ufunc_type_resolution.c b/numpy/core/src/umath/ufunc_type_resolution.c
index da2e676..980c079 100644
--- a/numpy/core/src/umath/ufunc_type_resolution.c
+++ b/numpy/core/src/umath/ufunc_type_resolution.c
@@ -1235,19 +1235,63 @@ type_reso_error: {
}
}
+
+/*
+ * True division should return float64 results when both inputs are integer
+ * types. The PyUFunc_DefaultTypeResolver promotes 8 bit integers to float16
+ * and 16 bit integers to float32, so that is overridden here by specifying a
+ * 'dd->d' signature. Returns -1 on failure.
+*/
+NPY_NO_EXPORT int
+PyUFunc_TrueDivisionTypeResolver(PyUFuncObject *ufunc,
+ NPY_CASTING casting,
+ PyArrayObject **operands,
+ PyObject *type_tup,
+ PyArray_Descr **out_dtypes)
+{
+ int type_num1, type_num2;
+ static PyObject *default_type_tup = NULL;
+
+ /* Set default type for integer inputs to NPY_DOUBLE */
+ if (default_type_tup == NULL) {
+ PyArray_Descr *tmp = PyArray_DescrFromType(NPY_DOUBLE);
+
+ if (tmp == NULL) {
+ return -1;
+ }
+ default_type_tup = PyTuple_Pack(3, tmp, tmp, tmp);
+ if (default_type_tup == NULL) {
+ Py_DECREF(tmp);
+ return -1;
+ }
+ Py_DECREF(tmp);
+ }
+
+ type_num1 = PyArray_DESCR(operands[0])->type_num;
+ type_num2 = PyArray_DESCR(operands[1])->type_num;
+
+ if (type_tup == NULL &&
+ (PyTypeNum_ISINTEGER(type_num1) || PyTypeNum_ISBOOL(type_num1)) &&
+ (PyTypeNum_ISINTEGER(type_num2) || PyTypeNum_ISBOOL(type_num2))) {
+ return PyUFunc_DefaultTypeResolver(ufunc, casting, operands,
+ default_type_tup, out_dtypes);
+ }
+ return PyUFunc_DivisionTypeResolver(ufunc, casting, operands,
+ type_tup, out_dtypes);
+}
/*
- * Function to check and report floor division warning when python2.x is
- * invoked with -3 switch
+ * Function to check and report floor division warning when python2.x is
+ * invoked with -3 switch
* See PEP238 and #7949 for numpy
- * This function will not be hit for py3 or when __future__ imports division.
+ * This function will not be hit for py3 or when __future__ imports division.
* See generate_umath.py for reason
*/
NPY_NO_EXPORT int
PyUFunc_MixedDivisionTypeResolver(PyUFuncObject *ufunc,
- NPY_CASTING casting,
- PyArrayObject **operands,
- PyObject *type_tup,
- PyArray_Descr **out_dtypes)
+ NPY_CASTING casting,
+ PyArrayObject **operands,
+ PyObject *type_tup,
+ PyArray_Descr **out_dtypes)
{
/* Depreciation checks needed only on python 2 */
#if !defined(NPY_PY3K)
@@ -1256,17 +1300,15 @@ PyUFunc_MixedDivisionTypeResolver(PyUFuncObject *ufunc,
type_num1 = PyArray_DESCR(operands[0])->type_num;
type_num2 = PyArray_DESCR(operands[1])->type_num;
- /* If both types are integer, warn the user, same as python does */
+ /* If both types are integer, warn the user, same as python does */
if (Py_DivisionWarningFlag &&
- (PyTypeNum_ISINTEGER(type_num1) || PyTypeNum_ISBOOL(type_num1)) &&
- (PyTypeNum_ISINTEGER(type_num2) || PyTypeNum_ISBOOL(type_num2)))
- {
+ (PyTypeNum_ISINTEGER(type_num1) || PyTypeNum_ISBOOL(type_num1)) &&
+ (PyTypeNum_ISINTEGER(type_num2) || PyTypeNum_ISBOOL(type_num2))) {
PyErr_Warn(PyExc_DeprecationWarning, "numpy: classic int division");
- }
-#endif
-
- return PyUFunc_DivisionTypeResolver(ufunc, casting, operands,
- type_tup, out_dtypes);
+ }
+#endif
+ return PyUFunc_DivisionTypeResolver(ufunc, casting, operands,
+ type_tup, out_dtypes);
}
diff --git a/numpy/core/src/umath/ufunc_type_resolution.h b/numpy/core/src/umath/ufunc_type_resolution.h
index eaf5e91..fa9f1db 100644
--- a/numpy/core/src/umath/ufunc_type_resolution.h
+++ b/numpy/core/src/umath/ufunc_type_resolution.h
@@ -42,7 +42,7 @@ PyUFunc_AbsoluteTypeResolver(PyUFuncObject *ufunc,
PyArrayObject **operands,
PyObject *type_tup,
PyArray_Descr **out_dtypes);
-
+
NPY_NO_EXPORT int
PyUFunc_IsNaTTypeResolver(PyUFuncObject *ufunc,
NPY_CASTING casting,
@@ -79,6 +79,13 @@ PyUFunc_MixedDivisionTypeResolver(PyUFuncObject *ufunc,
PyArray_Descr **out_dtypes);
NPY_NO_EXPORT int
+PyUFunc_TrueDivisionTypeResolver(PyUFuncObject *ufunc,
+ NPY_CASTING casting,
+ PyArrayObject **operands,
+ PyObject *type_tup,
+ PyArray_Descr **out_dtypes);
+
+NPY_NO_EXPORT int
PyUFunc_DivisionTypeResolver(PyUFuncObject *ufunc,
NPY_CASTING casting,
PyArrayObject **operands,
diff --git a/numpy/core/tests/test_defchararray.py b/numpy/core/tests/test_defchararray.py
index 11d7c3b..de0bd7f 100644
--- a/numpy/core/tests/test_defchararray.py
+++ b/numpy/core/tests/test_defchararray.py
@@ -5,7 +5,8 @@ import sys
import numpy as np
from numpy.core.multiarray import _vec_string
from numpy.testing import (
- TestCase, run_module_suite, assert_, assert_equal, assert_array_equal
+ TestCase, run_module_suite, assert_, assert_equal, assert_array_equal,
+ suppress_warnings,
)
kw_unicode_true = {'unicode': True} # make 2to3 work properly
@@ -346,8 +347,11 @@ class TestMethods(TestCase):
A = np.char.array([b'\\u03a3'])
assert_(A.decode('unicode-escape')[0] == '\u03a3')
else:
- A = np.char.array(['736563726574206d657373616765'])
- assert_(A.decode('hex_codec')[0] == 'secret message')
+ with suppress_warnings() as sup:
+ if sys.py3kwarning:
+ sup.filter(DeprecationWarning, "'hex_codec'")
+ A = np.char.array(['736563726574206d657373616765'])
+ assert_(A.decode('hex_codec')[0] == 'secret message')
def test_encode(self):
B = self.B.encode('unicode_escape')
diff --git a/numpy/core/tests/test_multiarray.py b/numpy/core/tests/test_multiarray.py
index 3186802..482c864 100644
--- a/numpy/core/tests/test_multiarray.py
+++ b/numpy/core/tests/test_multiarray.py
@@ -36,7 +36,7 @@ from numpy.testing import (
)
# Need to test an object that does not fully implement math interface
-from datetime import timedelta
+from datetime import timedelta, datetime
if sys.version_info[:2] > (3, 2):
@@ -1476,6 +1476,21 @@ class TestMethods(TestCase):
arr = np.empty(1000, dt)
arr[::-1].sort()
+ def test_sort_raises(self):
+ #gh-9404
+ arr = np.array([0, datetime.now(), 1], dtype=object)
+ for kind in ['q', 'm', 'h']:
+ assert_raises(TypeError, arr.sort, kind=kind)
+ #gh-3879
+ class Raiser(object):
+ def raises_anything(*args, **kwargs):
+ raise TypeError("SOMETHING ERRORED")
+ __eq__ = __ne__ = __lt__ = __gt__ = __ge__ = __le__ = raises_anything
+ arr = np.array([[Raiser(), n] for n in range(10)]).reshape(-1)
+ np.random.shuffle(arr)
+ for kind in ['q', 'm', 'h']:
+ assert_raises(TypeError, arr.sort, kind=kind)
+
def test_sort_degraded(self):
# test degraded dataset would take minutes to run with normal qsort
d = np.arange(1000000)
@@ -2479,6 +2494,17 @@ class TestMethods(TestCase):
if HAS_REFCOUNT:
assert_(sys.getrefcount(a) < 50)
+ def test_size_zero_memleak(self):
+ # Regression test for issue 9615
+ # Exercises a special-case code path for dot products of length
+ # zero in cblasfuncs (making it is specific to floating dtypes).
+ a = np.array([], dtype=np.float64)
+ x = np.array(2.0)
+ for _ in range(100):
+ np.dot(a, a, out=x)
+ if HAS_REFCOUNT:
+ assert_(sys.getrefcount(x) < 50)
+
def test_trace(self):
a = np.arange(12).reshape((3, 4))
assert_equal(a.trace(), 15)
@@ -2762,6 +2788,10 @@ class TestMethods(TestCase):
e = np.array(['1+1j'], 'U')
assert_raises(TypeError, complex, e)
+class TestCequenceMethods(object):
+ def test_array_contains(self):
+ assert_(4.0 in np.arange(16.).reshape(4,4))
+ assert_(20.0 not in np.arange(16.).reshape(4,4))
class TestBinop(object):
def test_inplace(self):
@@ -3172,6 +3202,15 @@ class TestTemporaryElide(TestCase):
a = np.bool_()
assert_(type(~(a & a)) is np.bool_)
+ def test_elide_scalar_readonly(self):
+ # The imaginary part of a real array is readonly. This needs to go
+ # through fast_scalar_power which is only called for powers of
+ # +1, -1, 0, 0.5, and 2, so use 2. Also need valid refcount for
+ # elision which can be gotten for the imaginary part of a real
+ # array. Should not error.
+ a = np.empty(100000, dtype=np.float64)
+ a.imag ** 2
+
def test_elide_readonly(self):
# don't try to elide readonly temporaries
r = np.asarray(np.broadcast_to(np.zeros(1), 100000).flat) * 0.0
diff --git a/numpy/core/tests/test_numeric.py b/numpy/core/tests/test_numeric.py
index 0f87ffd..311acd5 100644
--- a/numpy/core/tests/test_numeric.py
+++ b/numpy/core/tests/test_numeric.py
@@ -1020,6 +1020,10 @@ class TestNonzero(TestCase):
# either integer or tuple arguments for axis
msg = "Mismatch for dtype: %s"
+ def assert_equal_w_dt(a, b, err_msg):
+ assert_equal(a.dtype, b.dtype, err_msg=err_msg)
+ assert_equal(a, b, err_msg=err_msg)
+
for dt in np.typecodes['All']:
err_msg = msg % (np.dtype(dt).name,)
@@ -1039,13 +1043,13 @@ class TestNonzero(TestCase):
m[1, 0] = '1970-01-12'
m = m.astype(dt)
- expected = np.array([2, 0, 0])
- assert_equal(np.count_nonzero(m, axis=0),
- expected, err_msg=err_msg)
+ expected = np.array([2, 0, 0], dtype=np.intp)
+ assert_equal_w_dt(np.count_nonzero(m, axis=0),
+ expected, err_msg=err_msg)
- expected = np.array([1, 1, 0])
- assert_equal(np.count_nonzero(m, axis=1),
- expected, err_msg=err_msg)
+ expected = np.array([1, 1, 0], dtype=np.intp)
+ assert_equal_w_dt(np.count_nonzero(m, axis=1),
+ expected, err_msg=err_msg)
expected = np.array(2)
assert_equal(np.count_nonzero(m, axis=(0, 1)),
@@ -1060,13 +1064,13 @@ class TestNonzero(TestCase):
# setup is slightly different for this dtype
m = np.array([np.void(1)] * 6).reshape((2, 3))
- expected = np.array([0, 0, 0])
- assert_equal(np.count_nonzero(m, axis=0),
- expected, err_msg=err_msg)
+ expected = np.array([0, 0, 0], dtype=np.intp)
+ assert_equal_w_dt(np.count_nonzero(m, axis=0),
+ expected, err_msg=err_msg)
- expected = np.array([0, 0])
- assert_equal(np.count_nonzero(m, axis=1),
- expected, err_msg=err_msg)
+ expected = np.array([0, 0], dtype=np.intp)
+ assert_equal_w_dt(np.count_nonzero(m, axis=1),
+ expected, err_msg=err_msg)
expected = np.array(0)
assert_equal(np.count_nonzero(m, axis=(0, 1)),
@@ -1107,6 +1111,19 @@ class TestNonzero(TestCase):
assert_equal(m.nonzero(), tgt)
+ def test_nonzero_invalid_object(self):
+ # gh-9295
+ a = np.array([np.array([1, 2]), 3])
+ assert_raises(ValueError, np.nonzero, a)
+
+ class BoolErrors:
+ def __bool__(self):
+ raise ValueError("Not allowed")
+ def __nonzero__(self):
+ raise ValueError("Not allowed")
+
+ assert_raises(ValueError, np.nonzero, np.array([BoolErrors()]))
+
class TestIndex(TestCase):
def test_boolean(self):
diff --git a/numpy/core/tests/test_ufunc.py b/numpy/core/tests/test_ufunc.py
index d7c3374..5f803e8 100644
--- a/numpy/core/tests/test_ufunc.py
+++ b/numpy/core/tests/test_ufunc.py
@@ -1,5 +1,8 @@
from __future__ import division, absolute_import, print_function
+import warnings
+import itertools
+
import numpy as np
import numpy.core.umath_tests as umt
import numpy.core.operand_flag_tests as opflag_tests
@@ -7,7 +10,7 @@ from numpy.core.test_rational import rational, test_add, test_add_rationals
from numpy.testing import (
TestCase, run_module_suite, assert_, assert_equal, assert_raises,
assert_array_equal, assert_almost_equal, assert_array_almost_equal,
- assert_no_warnings
+ assert_no_warnings, assert_allclose,
)
@@ -353,14 +356,78 @@ class TestUfunc(TestCase):
assert_equal(b, [0, 0, 1])
def test_true_divide(self):
- # True_divide has a non uniform signature, see #3484.
- # This also tests type_tuple_type_resolver.
- a = np.full(5, 12.5)
- b = np.full(5, 10.0)
- tgt = np.full(5, 1.25)
- assert_almost_equal(np.true_divide(a, b, dtype=np.float64), tgt)
- assert_almost_equal(np.true_divide(a, b, dtype=np.float32), tgt)
- assert_raises(TypeError, np.true_divide, a, b, dtype=np.int)
+ a = np.array(10)
+ b = np.array(20)
+ tgt = np.array(0.5)
+
+ for tc in 'bhilqBHILQefdgFDG':
+ dt = np.dtype(tc)
+ aa = a.astype(dt)
+ bb = b.astype(dt)
+
+ # Check result value and dtype.
+ for x, y in itertools.product([aa, -aa], [bb, -bb]):
+
+ # Check with no output type specified
+ if tc in 'FDG':
+ tgt = complex(x)/complex(y)
+ else:
+ tgt = float(x)/float(y)
+
+ res = np.true_divide(x, y)
+ rtol = max(np.finfo(res).resolution, 1e-15)
+ assert_allclose(res, tgt, rtol=rtol)
+
+ if tc in 'bhilqBHILQ':
+ assert_(res.dtype.name == 'float64')
+ else:
+ assert_(res.dtype.name == dt.name )
+
+ # Check with output type specified. This also checks for the
+ # incorrect casts in issue gh-3484 because the unary '-' does
+ # not change types, even for unsigned types, Hence casts in the
+ # ufunc from signed to unsigned and vice versa will lead to
+ # errors in the values.
+ for tcout in 'bhilqBHILQ':
+ dtout = np.dtype(tcout)
+ assert_raises(TypeError, np.true_divide, x, y, dtype=dtout)
+
+ for tcout in 'efdg':
+ dtout = np.dtype(tcout)
+ if tc in 'FDG':
+ # Casting complex to float is not allowed
+ assert_raises(TypeError, np.true_divide, x, y, dtype=dtout)
+ else:
+ tgt = float(x)/float(y)
+ rtol = max(np.finfo(dtout).resolution, 1e-15)
+ atol = max(np.finfo(dtout).tiny, 3e-308)
+ # Some test values result in invalid for float16.
+ with np.errstate(invalid='ignore'):
+ res = np.true_divide(x, y, dtype=dtout)
+ if not np.isfinite(res) and tcout == 'e':
+ continue
+ assert_allclose(res, tgt, rtol=rtol, atol=atol)
+ assert_(res.dtype.name == dtout.name)
+
+ for tcout in 'FDG':
+ dtout = np.dtype(tcout)
+ tgt = complex(x)/complex(y)
+ rtol = max(np.finfo(dtout).resolution, 1e-15)
+ atol = max(np.finfo(dtout).tiny, 3e-308)
+ res = np.true_divide(x, y, dtype=dtout)
+ if not np.isfinite(res):
+ continue
+ assert_allclose(res, tgt, rtol=rtol, atol=atol)
+ assert_(res.dtype.name == dtout.name)
+
+ # Check booleans
... 11067 lines suppressed ...
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/python-modules/packages/python-numpy.git
More information about the Python-modules-commits
mailing list