summaryrefslogtreecommitdiff
path: root/numpy/core
diff options
context:
space:
mode:
Diffstat (limited to 'numpy/core')
-rw-r--r--numpy/core/_add_newdocs.py4
-rw-r--r--numpy/core/_internal.py3
-rw-r--r--numpy/core/_methods.py2
-rw-r--r--numpy/core/defchararray.py18
-rw-r--r--numpy/core/memmap.py4
-rw-r--r--numpy/core/numeric.py29
-rw-r--r--numpy/core/numerictypes.py5
-rw-r--r--numpy/core/records.py8
-rw-r--r--numpy/core/src/multiarray/arrayobject.c7
-rw-r--r--numpy/core/src/multiarray/ctors.c8
-rw-r--r--numpy/core/src/multiarray/dtype_transfer.c77
-rw-r--r--numpy/core/src/multiarray/mapping.c7
-rw-r--r--numpy/core/src/multiarray/multiarraymodule.c10
-rw-r--r--numpy/core/tests/test_arrayprint.py4
-rw-r--r--numpy/core/tests/test_einsum.py4
-rw-r--r--numpy/core/tests/test_indexerrors.py14
-rw-r--r--numpy/core/tests/test_mem_overlap.py2
-rw-r--r--numpy/core/tests/test_multiarray.py45
-rw-r--r--numpy/core/tests/test_numeric.py13
-rw-r--r--numpy/core/tests/test_regression.py19
-rw-r--r--numpy/core/tests/test_shape_base.py2
-rw-r--r--numpy/core/tests/test_unicode.py4
22 files changed, 156 insertions, 133 deletions
diff --git a/numpy/core/_add_newdocs.py b/numpy/core/_add_newdocs.py
index ba5c0fa68..68902d25a 100644
--- a/numpy/core/_add_newdocs.py
+++ b/numpy/core/_add_newdocs.py
@@ -152,6 +152,8 @@ add_newdoc('numpy.core', 'flatiter', ('copy',
add_newdoc('numpy.core', 'nditer',
"""
+ nditer(op, flags=None, op_flags=None, op_dtypes=None, order='K', casting='safe', op_axes=None, itershape=(), buffersize=0)
+
Efficient multi-dimensional iterator object to iterate over arrays.
To get started using this object, see the
:ref:`introductory guide to array iteration <arrays.nditer>`.
@@ -784,7 +786,7 @@ add_newdoc('numpy.core', 'broadcast', ('reset',
add_newdoc('numpy.core.multiarray', 'array',
"""
- array(object, dtype=None, copy=True, order='K', subok=False, ndmin=0)
+ array(object, dtype=None, *, copy=True, order='K', subok=False, ndmin=0)
Create an array.
diff --git a/numpy/core/_internal.py b/numpy/core/_internal.py
index f21774cb6..1378497bb 100644
--- a/numpy/core/_internal.py
+++ b/numpy/core/_internal.py
@@ -9,7 +9,6 @@ import re
import sys
import platform
-from numpy.compat import unicode
from .multiarray import dtype, array, ndarray
try:
import ctypes
@@ -365,7 +364,7 @@ def _newnames(datatype, order):
"""
oldnames = datatype.names
nameslist = list(oldnames)
- if isinstance(order, (str, unicode)):
+ if isinstance(order, str):
order = [order]
seen = set()
if isinstance(order, (list, tuple)):
diff --git a/numpy/core/_methods.py b/numpy/core/_methods.py
index 6785683a3..86ddf4d17 100644
--- a/numpy/core/_methods.py
+++ b/numpy/core/_methods.py
@@ -63,7 +63,7 @@ def _count_reduce_items(arr, axis):
axis = (axis,)
items = 1
for ax in axis:
- items *= arr.shape[ax]
+ items *= arr.shape[mu.normalize_axis_index(ax, arr.ndim)]
return items
# Numpy 1.17.0, 2019-02-24
diff --git a/numpy/core/defchararray.py b/numpy/core/defchararray.py
index 1292b738c..cd01c0e77 100644
--- a/numpy/core/defchararray.py
+++ b/numpy/core/defchararray.py
@@ -24,7 +24,7 @@ from .numeric import array as narray
from numpy.core.multiarray import _vec_string
from numpy.core.overrides import set_module
from numpy.core import overrides
-from numpy.compat import asbytes, long
+from numpy.compat import asbytes
import numpy
__all__ = [
@@ -340,7 +340,7 @@ def multiply(a, i):
i_arr = numpy.asarray(i)
if not issubclass(i_arr.dtype.type, integer):
raise ValueError("Can only multiply by integers")
- out_size = _get_num_chars(a_arr) * max(long(i_arr.max()), 0)
+ out_size = _get_num_chars(a_arr) * max(int(i_arr.max()), 0)
return _vec_string(
a_arr, (a_arr.dtype.type, out_size), '__mul__', (i_arr,))
@@ -450,7 +450,7 @@ def center(a, width, fillchar=' '):
"""
a_arr = numpy.asarray(a)
width_arr = numpy.asarray(width)
- size = long(numpy.max(width_arr.flat))
+ size = int(numpy.max(width_arr.flat))
if numpy.issubdtype(a_arr.dtype, numpy.string_):
fillchar = asbytes(fillchar)
return _vec_string(
@@ -995,7 +995,7 @@ def ljust(a, width, fillchar=' '):
"""
a_arr = numpy.asarray(a)
width_arr = numpy.asarray(width)
- size = long(numpy.max(width_arr.flat))
+ size = int(numpy.max(width_arr.flat))
if numpy.issubdtype(a_arr.dtype, numpy.string_):
fillchar = asbytes(fillchar)
return _vec_string(
@@ -1265,7 +1265,7 @@ def rjust(a, width, fillchar=' '):
"""
a_arr = numpy.asarray(a)
width_arr = numpy.asarray(width)
- size = long(numpy.max(width_arr.flat))
+ size = int(numpy.max(width_arr.flat))
if numpy.issubdtype(a_arr.dtype, numpy.string_):
fillchar = asbytes(fillchar)
return _vec_string(
@@ -1733,7 +1733,7 @@ def zfill(a, width):
"""
a_arr = numpy.asarray(a)
width_arr = numpy.asarray(width)
- size = long(numpy.max(width_arr.flat))
+ size = int(numpy.max(width_arr.flat))
return _vec_string(
a_arr, (a_arr.dtype.type, size), 'zfill', (width_arr,))
@@ -1952,10 +1952,10 @@ class chararray(ndarray):
else:
dtype = string_
- # force itemsize to be a Python long, since using NumPy integer
+ # force itemsize to be a Python int, since using NumPy integer
# types results in itemsize.itemsize being used as the size of
# strings in the new array.
- itemsize = long(itemsize)
+ itemsize = int(itemsize)
if isinstance(buffer, str):
# unicode objects do not have the buffer interface
@@ -2720,7 +2720,7 @@ def array(obj, itemsize=None, copy=True, unicode=None, order=None):
(itemsize != obj.itemsize) or
(not unicode and isinstance(obj, unicode_)) or
(unicode and isinstance(obj, string_))):
- obj = obj.astype((dtype, long(itemsize)))
+ obj = obj.astype((dtype, int(itemsize)))
return obj
if isinstance(obj, ndarray) and issubclass(obj.dtype.type, object):
diff --git a/numpy/core/memmap.py b/numpy/core/memmap.py
index 61b8ba3ac..ad66446c2 100644
--- a/numpy/core/memmap.py
+++ b/numpy/core/memmap.py
@@ -1,7 +1,7 @@
import numpy as np
from .numeric import uint8, ndarray, dtype
from numpy.compat import (
- long, os_fspath, contextlib_nullcontext, is_pathlib_path
+ os_fspath, contextlib_nullcontext, is_pathlib_path
)
from numpy.core.overrides import set_module
@@ -242,7 +242,7 @@ class memmap(ndarray):
for k in shape:
size *= k
- bytes = long(offset + size*_dbytes)
+ bytes = int(offset + size*_dbytes)
if mode in ('w+', 'r+') and flen < bytes:
fid.seek(bytes - 1, 0)
diff --git a/numpy/core/numeric.py b/numpy/core/numeric.py
index 5e8151e68..83d985a7c 100644
--- a/numpy/core/numeric.py
+++ b/numpy/core/numeric.py
@@ -384,12 +384,12 @@ def full_like(a, fill_value, dtype=None, order='K', subok=True, shape=None):
return res
-def _count_nonzero_dispatcher(a, axis=None):
+def _count_nonzero_dispatcher(a, axis=None, *, keepdims=None):
return (a,)
@array_function_dispatch(_count_nonzero_dispatcher)
-def count_nonzero(a, axis=None):
+def count_nonzero(a, axis=None, *, keepdims=False):
"""
Counts the number of non-zero values in the array ``a``.
@@ -414,6 +414,13 @@ def count_nonzero(a, axis=None):
.. versionadded:: 1.12.0
+ keepdims : bool, optional
+ If this is set to True, the axes that are counted are left
+ in the result as dimensions with size one. With this option,
+ the result will broadcast correctly against the input array.
+
+ .. versionadded:: 1.19.0
+
Returns
-------
count : int or array of int
@@ -429,15 +436,19 @@ def count_nonzero(a, axis=None):
--------
>>> np.count_nonzero(np.eye(4))
4
- >>> np.count_nonzero([[0,1,7,0,0],[3,0,0,2,19]])
+ >>> a = np.array([[0, 1, 7, 0],
+ ... [3, 0, 2, 19]])
+ >>> np.count_nonzero(a)
5
- >>> np.count_nonzero([[0,1,7,0,0],[3,0,0,2,19]], axis=0)
- array([1, 1, 1, 1, 1])
- >>> np.count_nonzero([[0,1,7,0,0],[3,0,0,2,19]], axis=1)
+ >>> np.count_nonzero(a, axis=0)
+ array([1, 1, 2, 1])
+ >>> np.count_nonzero(a, axis=1)
array([2, 3])
-
+ >>> np.count_nonzero(a, axis=1, keepdims=True)
+ array([[2],
+ [3]])
"""
- if axis is None:
+ if axis is None and not keepdims:
return multiarray.count_nonzero(a)
a = asanyarray(a)
@@ -448,7 +459,7 @@ def count_nonzero(a, axis=None):
else:
a_bool = a.astype(np.bool_, copy=False)
- return a_bool.sum(axis=axis, dtype=np.intp)
+ return a_bool.sum(axis=axis, dtype=np.intp, keepdims=keepdims)
@set_module('numpy')
diff --git a/numpy/core/numerictypes.py b/numpy/core/numerictypes.py
index 9d7bbde93..aac741612 100644
--- a/numpy/core/numerictypes.py
+++ b/numpy/core/numerictypes.py
@@ -83,7 +83,6 @@ import types as _types
import numbers
import warnings
-from numpy.compat import bytes, long
from numpy.core.multiarray import (
typeinfo, ndarray, array, empty, dtype, datetime_data,
datetime_as_string, busday_offset, busday_count, is_busday,
@@ -119,8 +118,8 @@ from ._dtype import _kind_name
# we don't export these for import *, but we do want them accessible
# as numerictypes.bool, etc.
-from builtins import bool, int, float, complex, object, str
-unicode = str
+from builtins import bool, int, float, complex, object, str, bytes
+from numpy.compat import long, unicode
# We use this later
diff --git a/numpy/core/records.py b/numpy/core/records.py
index ddefa5881..b1ee1aa11 100644
--- a/numpy/core/records.py
+++ b/numpy/core/records.py
@@ -40,7 +40,7 @@ from collections import Counter, OrderedDict
from . import numeric as sb
from . import numerictypes as nt
from numpy.compat import (
- isfileobj, bytes, long, unicode, os_fspath, contextlib_nullcontext
+ isfileobj, os_fspath, contextlib_nullcontext
)
from numpy.core.overrides import set_module
from .arrayprint import get_printoptions
@@ -188,7 +188,7 @@ class format_parser:
if names:
if type(names) in [list, tuple]:
pass
- elif isinstance(names, (str, unicode)):
+ elif isinstance(names, str):
names = names.split(',')
else:
raise NameError("illegal input names %s" % repr(names))
@@ -703,7 +703,7 @@ def fromrecords(recList, dtype=None, shape=None, formats=None, names=None,
shape = _deprecate_shape_0_as_None(shape)
if shape is None:
shape = len(recList)
- if isinstance(shape, (int, long)):
+ if isinstance(shape, int):
shape = (shape,)
if len(shape) > 1:
raise ValueError("Can only deal with 1-d array.")
@@ -792,7 +792,7 @@ def fromfile(fd, dtype=None, shape=None, offset=0, formats=None,
if shape is None:
shape = (-1,)
- elif isinstance(shape, (int, long)):
+ elif isinstance(shape, int):
shape = (shape,)
if isfileobj(fd):
diff --git a/numpy/core/src/multiarray/arrayobject.c b/numpy/core/src/multiarray/arrayobject.c
index 16896aa12..dedaf38eb 100644
--- a/numpy/core/src/multiarray/arrayobject.c
+++ b/numpy/core/src/multiarray/arrayobject.c
@@ -41,6 +41,7 @@ maintainer email: oliphant.travis@ieee.org
#include "arraytypes.h"
#include "scalartypes.h"
#include "arrayobject.h"
+#include "conversion_utils.h"
#include "ctors.h"
#include "methods.h"
#include "descriptor.h"
@@ -1624,7 +1625,7 @@ array_new(PyTypeObject *subtype, PyObject *args, PyObject *kwds)
PyArray_Descr *descr = NULL;
int itemsize;
PyArray_Dims dims = {NULL, 0};
- PyArray_Dims strides = {NULL, 0};
+ PyArray_Dims strides = {NULL, -1};
PyArray_Chunk buffer;
npy_longlong offset = 0;
NPY_ORDER order = NPY_CORDER;
@@ -1645,7 +1646,7 @@ array_new(PyTypeObject *subtype, PyObject *args, PyObject *kwds)
PyArray_BufferConverter,
&buffer,
&offset,
- &PyArray_IntpConverter,
+ &PyArray_OptionalIntpConverter,
&strides,
&PyArray_OrderConverter,
&order)) {
@@ -1660,7 +1661,7 @@ array_new(PyTypeObject *subtype, PyObject *args, PyObject *kwds)
itemsize = descr->elsize;
- if (strides.ptr != NULL) {
+ if (strides.len != -1) {
npy_intp nb, off;
if (strides.len != dims.len) {
PyErr_SetString(PyExc_ValueError,
diff --git a/numpy/core/src/multiarray/ctors.c b/numpy/core/src/multiarray/ctors.c
index a23510c8b..12bf9eace 100644
--- a/numpy/core/src/multiarray/ctors.c
+++ b/numpy/core/src/multiarray/ctors.c
@@ -1211,8 +1211,8 @@ PyArray_NewFromDescrAndBase(
* NPY_ANYORDER - Fortran if prototype is Fortran, C otherwise.
* NPY_KEEPORDER - Keeps the axis ordering of prototype.
* dtype - If not NULL, overrides the data type of the result.
- * ndim - If not 0 and dims not NULL, overrides the shape of the result.
- * dims - If not NULL and ndim not 0, overrides the shape of the result.
+ * ndim - If not -1, overrides the shape of the result.
+ * dims - If ndim is not -1, overrides the shape of the result.
* subok - If 1, use the prototype's array subtype, otherwise
* always create a base-class array.
*
@@ -1225,7 +1225,7 @@ PyArray_NewLikeArrayWithShape(PyArrayObject *prototype, NPY_ORDER order,
{
PyObject *ret = NULL;
- if (dims == NULL) {
+ if (ndim == -1) {
ndim = PyArray_NDIM(prototype);
dims = PyArray_DIMS(prototype);
}
@@ -1322,7 +1322,7 @@ NPY_NO_EXPORT PyObject *
PyArray_NewLikeArray(PyArrayObject *prototype, NPY_ORDER order,
PyArray_Descr *dtype, int subok)
{
- return PyArray_NewLikeArrayWithShape(prototype, order, dtype, 0, NULL, subok);
+ return PyArray_NewLikeArrayWithShape(prototype, order, dtype, -1, NULL, subok);
}
/*NUMPY_API
diff --git a/numpy/core/src/multiarray/dtype_transfer.c b/numpy/core/src/multiarray/dtype_transfer.c
index b26d5ac89..ecaa680ec 100644
--- a/numpy/core/src/multiarray/dtype_transfer.c
+++ b/numpy/core/src/multiarray/dtype_transfer.c
@@ -312,6 +312,7 @@ typedef struct {
NpyAuxData *wrappeddata, *todata, *fromdata;
npy_intp src_itemsize, dst_itemsize;
char *bufferin, *bufferout;
+ npy_bool init_dest, out_needs_api;
} _align_wrap_data;
/* transfer data free function */
@@ -372,6 +373,9 @@ static NpyAuxData *_align_wrap_data_clone(NpyAuxData *data)
}
}
+ newdata->init_dest = d->init_dest;
+ newdata->out_needs_api = d->out_needs_api;
+
return (NpyAuxData *)newdata;
}
@@ -391,57 +395,26 @@ _strided_to_strided_contig_align_wrap(char *dst, npy_intp dst_stride,
*todata = d->todata,
*fromdata = d->fromdata;
char *bufferin = d->bufferin, *bufferout = d->bufferout;
+ npy_bool init_dest = d->init_dest, out_needs_api = d->out_needs_api;
for(;;) {
- if (N > NPY_LOWLEVEL_BUFFER_BLOCKSIZE) {
- tobuffer(bufferin, inner_src_itemsize, src, src_stride,
- NPY_LOWLEVEL_BUFFER_BLOCKSIZE,
- src_itemsize, todata);
- wrapped(bufferout, dst_itemsize, bufferin, inner_src_itemsize,
- NPY_LOWLEVEL_BUFFER_BLOCKSIZE,
- inner_src_itemsize, wrappeddata);
- frombuffer(dst, dst_stride, bufferout, dst_itemsize,
- NPY_LOWLEVEL_BUFFER_BLOCKSIZE,
- dst_itemsize, fromdata);
- N -= NPY_LOWLEVEL_BUFFER_BLOCKSIZE;
- src += NPY_LOWLEVEL_BUFFER_BLOCKSIZE*src_stride;
- dst += NPY_LOWLEVEL_BUFFER_BLOCKSIZE*dst_stride;
- }
- else {
- tobuffer(bufferin, inner_src_itemsize, src, src_stride, N,
- src_itemsize, todata);
- wrapped(bufferout, dst_itemsize, bufferin, inner_src_itemsize, N,
- inner_src_itemsize, wrappeddata);
- frombuffer(dst, dst_stride, bufferout, dst_itemsize, N,
- dst_itemsize, fromdata);
+ /*
+ * The caller does not know if a previous call resulted in a Python
+ * exception. Much of the Python API is unsafe while an exception is in
+ * flight, so just skip all the work. Someone higher in the call stack
+ * will check for errors and propagate them.
+ */
+ if (out_needs_api && PyErr_Occurred()) {
return;
}
- }
-}
-
-static void
-_strided_to_strided_contig_align_wrap_init_dest(char *dst, npy_intp dst_stride,
- char *src, npy_intp src_stride,
- npy_intp N, npy_intp src_itemsize,
- NpyAuxData *data)
-{
- _align_wrap_data *d = (_align_wrap_data *)data;
- PyArray_StridedUnaryOp *wrapped = d->wrapped,
- *tobuffer = d->tobuffer,
- *frombuffer = d->frombuffer;
- npy_intp inner_src_itemsize = d->src_itemsize,
- dst_itemsize = d->dst_itemsize;
- NpyAuxData *wrappeddata = d->wrappeddata,
- *todata = d->todata,
- *fromdata = d->fromdata;
- char *bufferin = d->bufferin, *bufferout = d->bufferout;
-
- for(;;) {
if (N > NPY_LOWLEVEL_BUFFER_BLOCKSIZE) {
tobuffer(bufferin, inner_src_itemsize, src, src_stride,
NPY_LOWLEVEL_BUFFER_BLOCKSIZE,
src_itemsize, todata);
- memset(bufferout, 0, dst_itemsize*NPY_LOWLEVEL_BUFFER_BLOCKSIZE);
+ if (init_dest) {
+ memset(bufferout, 0,
+ dst_itemsize*NPY_LOWLEVEL_BUFFER_BLOCKSIZE);
+ }
wrapped(bufferout, dst_itemsize, bufferin, inner_src_itemsize,
NPY_LOWLEVEL_BUFFER_BLOCKSIZE,
inner_src_itemsize, wrappeddata);
@@ -455,7 +428,9 @@ _strided_to_strided_contig_align_wrap_init_dest(char *dst, npy_intp dst_stride,
else {
tobuffer(bufferin, inner_src_itemsize, src, src_stride, N,
src_itemsize, todata);
- memset(bufferout, 0, dst_itemsize*N);
+ if (init_dest) {
+ memset(bufferout, 0, dst_itemsize*N);
+ }
wrapped(bufferout, dst_itemsize, bufferin, inner_src_itemsize, N,
inner_src_itemsize, wrappeddata);
frombuffer(dst, dst_stride, bufferout, dst_itemsize, N,
@@ -477,6 +452,7 @@ _strided_to_strided_contig_align_wrap_init_dest(char *dst, npy_intp dst_stride,
* wrapped - contig to contig transfer function being wrapped
* wrappeddata - data for wrapped
* init_dest - 1 means to memset the dest buffer to 0 before calling wrapped.
+ * out_needs_api - if NPY_TRUE, check for (and break on) Python API errors.
*
* Returns NPY_SUCCEED or NPY_FAIL.
*/
@@ -487,6 +463,7 @@ wrap_aligned_contig_transfer_function(
PyArray_StridedUnaryOp *frombuffer, NpyAuxData *fromdata,
PyArray_StridedUnaryOp *wrapped, NpyAuxData *wrappeddata,
int init_dest,
+ int out_needs_api,
PyArray_StridedUnaryOp **out_stransfer,
NpyAuxData **out_transferdata)
{
@@ -519,14 +496,11 @@ wrap_aligned_contig_transfer_function(
data->bufferin = (char *)data + basedatasize;
data->bufferout = data->bufferin +
NPY_LOWLEVEL_BUFFER_BLOCKSIZE*src_itemsize;
+ data->init_dest = (npy_bool) init_dest;
+ data->out_needs_api = (npy_bool) out_needs_api;
/* Set the function and data */
- if (init_dest) {
- *out_stransfer = &_strided_to_strided_contig_align_wrap_init_dest;
- }
- else {
- *out_stransfer = &_strided_to_strided_contig_align_wrap;
- }
+ *out_stransfer = &_strided_to_strided_contig_align_wrap;
*out_transferdata = (NpyAuxData *)data;
return NPY_SUCCEED;
@@ -1171,6 +1145,7 @@ get_datetime_to_unicode_transfer_function(int aligned,
frombuffer, fromdata,
caststransfer, castdata,
PyDataType_FLAGCHK(str_dtype, NPY_NEEDS_INIT),
+ *out_needs_api,
out_stransfer, out_transferdata) != NPY_SUCCEED) {
NPY_AUXDATA_FREE(castdata);
NPY_AUXDATA_FREE(todata);
@@ -1293,6 +1268,7 @@ get_unicode_to_datetime_transfer_function(int aligned,
frombuffer, fromdata,
caststransfer, castdata,
PyDataType_FLAGCHK(dst_dtype, NPY_NEEDS_INIT),
+ *out_needs_api,
out_stransfer, out_transferdata) != NPY_SUCCEED) {
Py_DECREF(str_dtype);
NPY_AUXDATA_FREE(castdata);
@@ -1613,6 +1589,7 @@ get_cast_transfer_function(int aligned,
frombuffer, fromdata,
caststransfer, castdata,
PyDataType_FLAGCHK(dst_dtype, NPY_NEEDS_INIT),
+ *out_needs_api,
out_stransfer, out_transferdata) != NPY_SUCCEED) {
NPY_AUXDATA_FREE(castdata);
NPY_AUXDATA_FREE(todata);
diff --git a/numpy/core/src/multiarray/mapping.c b/numpy/core/src/multiarray/mapping.c
index 8a90d1767..7047304eb 100644
--- a/numpy/core/src/multiarray/mapping.c
+++ b/numpy/core/src/multiarray/mapping.c
@@ -727,8 +727,11 @@ prepare_index(PyArrayObject *self, PyObject *index,
}
}
else if (used_ndim > PyArray_NDIM(self)) {
- PyErr_SetString(PyExc_IndexError,
- "too many indices for array");
+ PyErr_Format(PyExc_IndexError,
+ "too many indices for array: "
+ "array is %d-dimensional, but %d were indexed",
+ PyArray_NDIM(self),
+ used_ndim);
goto failed_building_indices;
}
else if (index_ndim == 0) {
diff --git a/numpy/core/src/multiarray/multiarraymodule.c b/numpy/core/src/multiarray/multiarraymodule.c
index 7792fcdcb..9e8022abd 100644
--- a/numpy/core/src/multiarray/multiarraymodule.c
+++ b/numpy/core/src/multiarray/multiarraymodule.c
@@ -1582,8 +1582,9 @@ _array_fromobject(PyObject *NPY_UNUSED(ignored), PyObject *args, PyObject *kws)
"ndmin", NULL};
if (PyTuple_GET_SIZE(args) > 2) {
- PyErr_SetString(PyExc_ValueError,
- "only 2 non-keyword arguments accepted");
+ PyErr_Format(PyExc_TypeError,
+ "array() takes from 1 to 2 positional arguments but "
+ "%zd were given", PyTuple_GET_SIZE(args));
return NULL;
}
@@ -1856,14 +1857,15 @@ array_empty_like(PyObject *NPY_UNUSED(ignored), PyObject *args, PyObject *kwds)
NPY_ORDER order = NPY_KEEPORDER;
PyArrayObject *ret = NULL;
int subok = 1;
- PyArray_Dims shape = {NULL, 0};
+ /* -1 is a special value meaning "not specified" */
+ PyArray_Dims shape = {NULL, -1};
if (!PyArg_ParseTupleAndKeywords(args, kwds, "O&|O&O&iO&:empty_like", kwlist,
&PyArray_Converter, &prototype,
&PyArray_DescrConverter2, &dtype,
&PyArray_OrderConverter, &order,
&subok,
- &PyArray_IntpConverter, &shape)) {
+ &PyArray_OptionalIntpConverter, &shape)) {
goto fail;
}
/* steals the reference to dtype if it's not NULL */
diff --git a/numpy/core/tests/test_arrayprint.py b/numpy/core/tests/test_arrayprint.py
index 008ca20e6..e29217461 100644
--- a/numpy/core/tests/test_arrayprint.py
+++ b/numpy/core/tests/test_arrayprint.py
@@ -475,9 +475,7 @@ class TestPrintOptions:
assert_equal(repr(x), "array([0., 1., 2.])")
def test_0d_arrays(self):
- unicode = type(u'')
-
- assert_equal(unicode(np.array(u'café', '<U4')), u'café')
+ assert_equal(str(np.array(u'café', '<U4')), u'café')
assert_equal(repr(np.array('café', '<U4')),
"array('café', dtype='<U4')")
diff --git a/numpy/core/tests/test_einsum.py b/numpy/core/tests/test_einsum.py
index 6ec61fb1d..fd0de8732 100644
--- a/numpy/core/tests/test_einsum.py
+++ b/numpy/core/tests/test_einsum.py
@@ -605,6 +605,10 @@ class TestEinsum:
[[[1, 3], [3, 9], [5, 15], [7, 21]],
[[8, 16], [16, 32], [24, 48], [32, 64]]])
+ # Ensure explicitly setting out=None does not cause an error
+ # see issue gh-15776 and issue gh-15256
+ assert_equal(np.einsum('i,j', [1], [2], out=None), [[2]])
+
def test_subscript_range(self):
# Issue #7741, make sure that all letters of Latin alphabet (both uppercase & lowercase) can be used
# when creating a subscript from arrays
diff --git a/numpy/core/tests/test_indexerrors.py b/numpy/core/tests/test_indexerrors.py
index 9d2433fc5..a0e9a8c55 100644
--- a/numpy/core/tests/test_indexerrors.py
+++ b/numpy/core/tests/test_indexerrors.py
@@ -1,5 +1,8 @@
import numpy as np
-from numpy.testing import assert_raises
+from numpy.testing import (
+ assert_raises, assert_raises_regex,
+ )
+
class TestIndexErrors:
'''Tests to exercise indexerrors not covered by other tests.'''
@@ -110,6 +113,15 @@ class TestIndexErrors:
assert_raises(IndexError, lambda: a[(1, [0, 1])])
assert_raises(IndexError, lambda: assign(a, (1, [0, 1]), 1))
+ def test_mapping_error_message(self):
+ a = np.zeros((3, 5))
+ index = (1, 2, 3, 4, 5)
+ assert_raises_regex(
+ IndexError,
+ "too many indices for array: "
+ "array is 2-dimensional, but 5 were indexed",
+ lambda: a[index])
+
def test_methods(self):
"cases from methods.c"
diff --git a/numpy/core/tests/test_mem_overlap.py b/numpy/core/tests/test_mem_overlap.py
index 44ebf1cd2..675613de4 100644
--- a/numpy/core/tests/test_mem_overlap.py
+++ b/numpy/core/tests/test_mem_overlap.py
@@ -5,7 +5,6 @@ import numpy as np
from numpy.core._multiarray_tests import solve_diophantine, internal_overlap
from numpy.core import _umath_tests
from numpy.lib.stride_tricks import as_strided
-from numpy.compat import long
from numpy.testing import (
assert_, assert_raises, assert_equal, assert_array_equal
)
@@ -387,7 +386,6 @@ def test_shares_memory_api():
assert_equal(np.shares_memory(a, b), True)
assert_equal(np.shares_memory(a, b, max_work=None), True)
assert_raises(np.TooHardError, np.shares_memory, a, b, max_work=1)
- assert_raises(np.TooHardError, np.shares_memory, a, b, max_work=long(1))
def test_may_share_memory_bad_max_work():
diff --git a/numpy/core/tests/test_multiarray.py b/numpy/core/tests/test_multiarray.py
index 7d2e2df7c..5515ff446 100644
--- a/numpy/core/tests/test_multiarray.py
+++ b/numpy/core/tests/test_multiarray.py
@@ -16,19 +16,12 @@ from contextlib import contextmanager
from numpy.compat import pickle
-try:
- import pathlib
-except ImportError:
- try:
- import pathlib2 as pathlib
- except ImportError:
- pathlib = None
-
+import pathlib
import builtins
from decimal import Decimal
import numpy as np
-from numpy.compat import strchar, unicode
+from numpy.compat import strchar
import numpy.core._multiarray_tests as _multiarray_tests
from numpy.testing import (
assert_, assert_raises, assert_warns, assert_equal, assert_almost_equal,
@@ -691,6 +684,12 @@ class TestZeroRank:
y[()] = 6
assert_equal(x[()], 6)
+ # strides and shape must be the same length
+ with pytest.raises(ValueError):
+ np.ndarray((2,), strides=())
+ with pytest.raises(ValueError):
+ np.ndarray((), strides=(2,))
+
def test_output(self):
x = np.array(2)
assert_raises(ValueError, np.add, x, [1], x)
@@ -1469,12 +1468,12 @@ class TestZeroSizeFlexible:
assert_equal(zs.itemsize, 0)
zs = self._zeros(10, np.void)
assert_equal(zs.itemsize, 0)
- zs = self._zeros(10, unicode)
+ zs = self._zeros(10, str)
assert_equal(zs.itemsize, 0)
def _test_sort_partition(self, name, kinds, **kwargs):
# Previously, these would all hang
- for dt in [bytes, np.void, unicode]:
+ for dt in [bytes, np.void, str]:
zs = self._zeros(10, dt)
sort_method = getattr(zs, name)
sort_func = getattr(np, name)
@@ -1496,13 +1495,13 @@ class TestZeroSizeFlexible:
def test_resize(self):
# previously an error
- for dt in [bytes, np.void, unicode]:
+ for dt in [bytes, np.void, str]:
zs = self._zeros(10, dt)
zs.resize(25)
zs.resize((10, 10))
def test_view(self):
- for dt in [bytes, np.void, unicode]:
+ for dt in [bytes, np.void, str]:
zs = self._zeros(10, dt)
# viewing as itself should be allowed
@@ -1517,7 +1516,7 @@ class TestZeroSizeFlexible:
def test_pickle(self):
for proto in range(2, pickle.HIGHEST_PROTOCOL + 1):
- for dt in [bytes, np.void, unicode]:
+ for dt in [bytes, np.void, str]:
zs = self._zeros(10, dt)
p = pickle.dumps(zs, protocol=proto)
zs2 = pickle.loads(p)
@@ -4461,7 +4460,7 @@ class TestPutmask:
assert_equal(x[mask], np.array(val, T))
def test_ip_types(self):
- unchecked_types = [bytes, unicode, np.void]
+ unchecked_types = [bytes, str, np.void]
x = np.random.random(1000)*100
mask = x < 40
@@ -4515,7 +4514,7 @@ class TestTake:
assert_array_equal(x.take(ind, axis=0), x)
def test_ip_types(self):
- unchecked_types = [bytes, unicode, np.void]
+ unchecked_types = [bytes, str, np.void]
x = np.random.random(24)*100
x.shape = 2, 3, 4
@@ -4685,14 +4684,12 @@ class TestIO:
y = np.fromfile(self.filename, dtype=self.dtype)
assert_array_equal(y, self.x.flat)
- @pytest.mark.skipif(pathlib is None, reason="pathlib not found")
def test_roundtrip_pathlib(self):
p = pathlib.Path(self.filename)
self.x.tofile(p)
y = np.fromfile(p, dtype=self.dtype)
assert_array_equal(y, self.x.flat)
- @pytest.mark.skipif(pathlib is None, reason="pathlib not found")
def test_roundtrip_dump_pathlib(self):
p = pathlib.Path(self.filename)
self.x.dump(p)
@@ -5503,6 +5500,12 @@ class TestStats:
# of float32.
assert_(_mean(np.ones(100000, dtype='float16')) == 1)
+ def test_mean_axis_error(self):
+ # Ensure that AxisError is raised instead of IndexError when axis is
+ # out of bounds, see gh-15817.
+ with assert_raises(np.core._exceptions.AxisError):
+ np.arange(10).mean(axis=2)
+
def test_var_values(self):
for mat in [self.rmat, self.cmat, self.omat]:
for axis in [0, 1, None]:
@@ -5545,6 +5548,12 @@ class TestStats:
cmat_swapped = cmat.astype(cmat.dtype.newbyteorder())
assert_almost_equal(cmat.var(), cmat_swapped.var())
+ def test_var_axis_error(self):
+ # Ensure that AxisError is raised instead of IndexError when axis is
+ # out of bounds, see gh-15817.
+ with assert_raises(np.core._exceptions.AxisError):
+ np.arange(10).var(axis=2)
+
def test_std_values(self):
for mat in [self.rmat, self.cmat, self.omat]:
for axis in [0, 1, None]:
diff --git a/numpy/core/tests/test_numeric.py b/numpy/core/tests/test_numeric.py
index 05f59d9dc..1bcfe50a4 100644
--- a/numpy/core/tests/test_numeric.py
+++ b/numpy/core/tests/test_numeric.py
@@ -1201,6 +1201,17 @@ class TestNonzero:
a = np.array([[0, 0, 1], [1, 0, 1]])
assert_equal(np.count_nonzero(a, axis=()), a.astype(bool))
+ def test_countnonzero_keepdims(self):
+ a = np.array([[0, 0, 1, 0],
+ [0, 3, 5, 0],
+ [7, 9, 2, 0]])
+ assert_equal(np.count_nonzero(a, axis=0, keepdims=True),
+ [[1, 2, 3, 0]])
+ assert_equal(np.count_nonzero(a, axis=1, keepdims=True),
+ [[1], [2], [3]])
+ assert_equal(np.count_nonzero(a, keepdims=True),
+ [[6]])
+
def test_array_method(self):
# Tests that the array method
# call to nonzero works
@@ -2457,7 +2468,7 @@ class TestLikeFuncs:
(np.arange(24).reshape(2, 3, 4).swapaxes(0, 1), None),
(np.arange(24).reshape(4, 3, 2).swapaxes(0, 1), '?'),
]
- self.shapes = [(5,), (5,6,), (5,6,7,)]
+ self.shapes = [(), (5,), (5,6,), (5,6,7,)]
def compare_array_value(self, dz, value, fill_value):
if value is not None:
diff --git a/numpy/core/tests/test_regression.py b/numpy/core/tests/test_regression.py
index 97898cc20..4d7639e43 100644
--- a/numpy/core/tests/test_regression.py
+++ b/numpy/core/tests/test_regression.py
@@ -15,7 +15,7 @@ from numpy.testing import (
_assert_valid_refcount, HAS_REFCOUNT,
)
from numpy.testing._private.utils import _no_tracing
-from numpy.compat import asbytes, asunicode, long, pickle
+from numpy.compat import asbytes, asunicode, pickle
try:
RecursionError
@@ -1408,6 +1408,13 @@ class TestRegression:
dtype='U')
assert_raises(UnicodeEncodeError, np.array, a, 'S4')
+ def test_unicode_to_string_cast_error(self):
+ # gh-15790
+ a = np.array([u'\x80'] * 129, dtype='U3')
+ assert_raises(UnicodeEncodeError, np.array, a, 'S')
+ b = a.reshape(3, 43)[:-1, :-1]
+ assert_raises(UnicodeEncodeError, np.array, b, 'S')
+
def test_mixed_string_unicode_array_creation(self):
a = np.array(['1234', u'123'])
assert_(a.itemsize == 16)
@@ -1497,14 +1504,11 @@ class TestRegression:
min //= -1
with np.errstate(divide="ignore"):
- for t in (np.int8, np.int16, np.int32, np.int64, int, np.compat.long):
+ for t in (np.int8, np.int16, np.int32, np.int64, int):
test_type(t)
def test_buffer_hashlib(self):
- try:
- from hashlib import md5
- except ImportError:
- from md5 import new as md5
+ from hashlib import md5
x = np.array([1, 2, 3], dtype=np.dtype('<i4'))
assert_equal(md5(x).hexdigest(), '2a1dd1e1e59d0a384c26951e316cd7e6')
@@ -1799,7 +1803,6 @@ class TestRegression:
a = np.array(0, dtype=object)
a[()] = a
assert_raises(RecursionError, int, a)
- assert_raises(RecursionError, long, a)
assert_raises(RecursionError, float, a)
a[()] = None
@@ -1825,7 +1828,6 @@ class TestRegression:
b = np.array(0, dtype=object)
a[()] = b
assert_equal(int(a), int(0))
- assert_equal(long(a), long(0))
assert_equal(float(a), float(0))
def test_object_array_self_copy(self):
@@ -2481,4 +2483,3 @@ class TestRegression:
assert arr.size * arr.itemsize > 2 ** 31
c_arr = np.ctypeslib.as_ctypes(arr)
assert_equal(c_arr._length_, arr.size)
-
diff --git a/numpy/core/tests/test_shape_base.py b/numpy/core/tests/test_shape_base.py
index 738260327..546ecf001 100644
--- a/numpy/core/tests/test_shape_base.py
+++ b/numpy/core/tests/test_shape_base.py
@@ -11,7 +11,6 @@ from numpy.testing import (
assert_raises_regex, assert_warns
)
-from numpy.compat import long
class TestAtleast1d:
def test_0D_array(self):
@@ -49,7 +48,6 @@ class TestAtleast1d:
"""
assert_(atleast_1d(3).shape == (1,))
assert_(atleast_1d(3j).shape == (1,))
- assert_(atleast_1d(long(3)).shape == (1,))
assert_(atleast_1d(3.0).shape == (1,))
assert_(atleast_1d([[2, 3], [4, 5]]).shape == (2, 2))
diff --git a/numpy/core/tests/test_unicode.py b/numpy/core/tests/test_unicode.py
index ac065d5d6..8e0dd47cb 100644
--- a/numpy/core/tests/test_unicode.py
+++ b/numpy/core/tests/test_unicode.py
@@ -1,10 +1,8 @@
import numpy as np
-from numpy.compat import unicode
from numpy.testing import assert_, assert_equal, assert_array_equal
def buffer_length(arr):
- if isinstance(arr, unicode):
- arr = str(arr)
+ if isinstance(arr, str):
if not arr:
charmax = 0
else: