NumPy 1.19.0 Release Notes¶
Code compatibility with Python versions < 3.5 (including Python 2) was dropped from both the python and C code. The shims in numpy.compat will remain to support third-party packages, but they may be deprecated in a future release.
dtype=object for ragged input¶
np.array([[1, [1, 2, 3]]) will issue a
per NEP 34. Users should explicitly use
dtype=object to avoid the
shape=0 to factory functions in
numpy.rec is deprecated¶
0 is treated as a special case and is aliased to
None in the functions:
0 will not be special cased, and will be treated as an array
length like any other integer.
Deprecation of probably unused C-API functions¶
The following C-API functions are probably unused and have been deprecated:
In most cases
PyArray_GetArrayParamsFromObject should be replaced
by converting to an array, while
PyUFunc_GenericFunction can be
PyObject_Call (see documentation for details).
Converting certain types to dtypes is Deprecated¶
The super classes of scalar types, such as
np.inexact will now give a deprecation warning when converted
to a dtype (or used in a dtype keyword argument).
The reason for this is that np.integer is converted to
while it would be expected to represent any integer (e.g. also
dtype=np.floating is currently identical to
dtype=np.float64, even though also
np.float32 is a subclass of
numpy.delete can no longer be passed an axis on 0d arrays¶
This concludes a deprecation from 1.9, where when an
axis argument was
passed to a call to
delete on a 0d array, the
obj argument and indices would be completely ignored.
In these cases,
insert(arr, "nonsense", 42, axis=0) would actually overwrite the
entire array, while
delete(arr, "nonsense", axis=0) would be
axis on a 0d array raises
numpy.delete no longer ignores out-of-bounds indices¶
This concludes deprecations from 1.8 and 1.9, where
np.delete would ignore
both negative and out-of-bounds items in a sequence of indices. This was at
odds with its behavior when passed a single index.
Now out-of-bounds items throw
IndexError, and negative items index from the
numpy.delete no longer accept non-integral indices¶
This concludes a deprecation from 1.9, where sequences of non-integers indices
were allowed and cast to integers. Now passing sequences of non-integral
IndexError, just like it does when passing a single
numpy.delete no longer casts boolean indices to integers¶
This concludes a deprecation from 1.8, where
np.delete would cast boolean
arrays and scalars passed as an index argument into integer indices. The
behavior now is to treat boolean arrays as a mask, and to raise an error
on boolean scalars.
Scalar promotion in
The promotion of mixed scalars and arrays in
has been changed to adhere to those used by
This means that input such as
(1000, np.array(, dtype=np.uint8)))
will now return
uint16 dtypes. In most cases the behaviour is unchanged.
Note that the use of this C-API function is generally discouraged.
This also fixes
np.choose to behave the same way as the rest of NumPy
in this respect.
Fasttake and fastputmask slots are deprecated and NULL’ed¶
The fasttake and fastputmask slots are now never used and must always be set to NULL. This will result in no change in behaviour. However, if a user dtype should set one of these a DeprecationWarning will be given.
np.ediff1d casting behaviour with
np.ediff1d now uses the
"same_kind" casting rule for
to_begin arguments. This
ensures type safety except when the input array has a smaller
integer type than
In rare cases, the behaviour will be more strict than it was
previously in 1.16 and 1.17. This is necessary to solve issues
with floating point NaN.
Converting of empty array-like objects to NumPy arrays¶
len(obj) == 0 which implement an “array-like” interface,
meaning an object implementing
obj.__array_struct__, or the python
buffer interface and which are also sequences (i.e. Pandas objects)
will now always retain there shape correctly when converted to an array.
If such an object has a shape of
(0, 1) previously, it could
be converted into an array of of shape
(0,) (losing all dimensions
after the first 0).
As part of the continued removal of Python 2 compatibility,
multiarray.int_asbuffer was removed. On Python 3, it threw a
NotImplementedError and was unused internally. It is expected that there
are no downstream use cases for this method with Python 3.
numpy.distutils.compat has been removed¶
This module contained only the function
get_exception(), which was used as:
try: ... except Exception: e = get_exception()
Its purpose was to handle the change in syntax introduced in Python 2.6, from
except Exception, e: to
except Exception as e:, meaning it was only
necessary for codebases supporting Python 2.5 and older.
issubdtype no longer interprets
numpy.issubdtype had a FutureWarning since NumPy 1.14 which
has expired now. This means that certain input where the second
argument was neither a datatype nor a NumPy scalar type
(such as a string or a python type like
will now be consistent with passing in
This makes the result consistent with expectations and leads to
a false result in some cases which previously returned true.
C API changes¶
Better support for
const dimensions in API functions¶
The following functions now accept a constant array of
Previously the caller would have to cast away the const-ness to call these functions.
Const qualify UFunc inner loops¶
UFuncGenericFunction now expects pointers to const
strides as arguments. This means inner loops may no longer modify
strides. This change leads to an
incompatible-pointer-types warning forcing users to either ignore
the compiler warnings or to const qualify their own loop signatures.
numpy.frompyfunc now accepts an identity argument¶
np.str_ scalars now support the buffer protocol¶
np.str_ arrays are always stored as UCS4, so the corresponding scalars
now expose this through the buffer interface, meaning
memoryview(np.str_('test')) now works.
subok option for
A new kwarg,
subok, was added to
numpy.copy to allow users to toggle the
numpy.copy with respect to array subclasses. The default value
False which is consistent with the behavior of
previous numpy versions. To create a copy that preserves an array subclass with
np.copy(arr, subok=True). This addition better documents
that the default behavior of
numpy.copy differs from the
numpy.ndarray.copy method which respects array subclasses by default.
Remove handling of extra argument to
A code path and test have been in the code since NumPy 0.4 for a two-argument
__array__(dtype=None, context=None). It was activated when
However that variant is not documented, and it is not clear what the intention
was for its use. It has been removed.
numpy.random._bit_generator moved to
Cython access to the random distributions is provided via a pxd file¶
c_distributions.pxd provides access to the c functions behind many of the
random distributions from Cython, making it convenient to use and extend them.