NumPy 1.22.0 Release Notes
NumPy 1.22.0 is a big release featuring the work of 152 contributers
spread over 602 pull requests. There have been many improvements,
highlights are:
- Annotations of the main namespace are essentially complete. Upstream
is a moving target, so there will likely be further improvements,
but the major work is done. This is probably the most user visible
enhancement in this release. - A preliminary version of the proposed Array-API is provided. This is
a step in creating a standard collection of functions that can be
used across application such as CuPy and JAX. - NumPy now has a DLPack backend. DLPack provides a common interchange
format for array (tensor) data. - New methods for
quantile
,percentile
, and related functions. The
new methods provide a complete set of the methods commonly found in
the literature. - A new configurable allocator for use by downstream projects.
These are in addition to the ongoing work to provide SIMD support for
commonly used functions, improvements to F2PY, and better documentation.
The Python versions supported in this release are 3.8-3.10, Python 3.7
has been dropped. Note that 32 bit wheels are only provided for Python
3.8 and 3.9 on Windows, all other wheels are 64 bits on account of
Ubuntu, Fedora, and other Linux distributions dropping 32 bit support.
All 64 bit wheels are also linked with 64 bit integer OpenBLAS, which should fix
the occasional problems encountered by folks using truly huge arrays.
Expired deprecations
Deprecated numeric style dtype strings have been removed
Using the strings "Bytes0"
, "Datetime64"
, "Str0"
, "Uint32"
,
and "Uint64"
as a dtype will now raise a TypeError
.
(gh-19539)
Expired deprecations for loads
, ndfromtxt
, and mafromtxt
in npyio
numpy.loads
was deprecated in v1.15, with the recommendation that
users use pickle.loads
instead. ndfromtxt
and mafromtxt
were both
deprecated in v1.17 - users should use numpy.genfromtxt
instead with
the appropriate value for the usemask
parameter.
(gh-19615)
Deprecations
Use delimiter rather than delimitor as kwarg in mrecords
The misspelled keyword argument delimitor
of
numpy.ma.mrecords.fromtextfile()
has been changed to delimiter
,
using it will emit a deprecation warning.
(gh-19921)
Passing boolean kth
values to (arg-)partition has been deprecated
numpy.partition
and numpy.argpartition
would previously accept
boolean values for the kth
parameter, which would subsequently be
converted into integers. This behavior has now been deprecated.
(gh-20000)
The np.MachAr
class has been deprecated
The numpy.MachAr
class and finfo.machar <numpy.finfo>
attribute have
been deprecated. Users are encouraged to access the property if interest
directly from the corresponding numpy.finfo
attribute.
(gh-20201)
Compatibility notes
Distutils forces strict floating point model on clang
NumPy now sets the -ftrapping-math
option on clang to enforce correct
floating point error handling for universal functions. Clang defaults to
non-IEEE and C99 conform behaviour otherwise. This change (using the
equivalent but newer -ffp-exception-behavior=strict
) was attempted in
NumPy 1.21, but was effectively never used.
(gh-19479)
Removed floor division support for complex types
Floor division of complex types will now result in a TypeError
>>> a = np.arange(10) + 1j* np.arange(10)
>>> a // 1
TypeError: ufunc 'floor_divide' not supported for the input types...
(gh-19135)
numpy.vectorize
functions now produce the same output class as the base function
When a function that respects numpy.ndarray
subclasses is vectorized
using numpy.vectorize
, the vectorized function will now be
subclass-safe also for cases that a signature is given (i.e., when
creating a gufunc
): the output class will be the same as that returned
by the first call to the underlying function.
(gh-19356)
Python 3.7 is no longer supported
Python support has been dropped. This is rather strict, there are
changes that require Python >= 3.8.
(gh-19665)
str/repr of complex dtypes now include space after punctuation
The repr of
np.dtype({"names": ["a"], "formats": [int], "offsets": [2]})
is now
dtype({'names': ['a'], 'formats': ['<i8'], 'offsets': [2], 'itemsize': 10})
,
whereas spaces where previously omitted after colons and between fields.
The old behavior can be restored via
np.set_printoptions(legacy="1.21")
.
(gh-19687)
Corrected advance
in PCG64DSXM
and PCG64
Fixed a bug in the advance
method of PCG64DSXM
and PCG64
. The bug
only affects results when the step was larger than $2^{64}$ on platforms
that do not support 128-bit integers(e.g., Windows and 32-bit Linux).
(gh-20049)
Change in generation of random 32 bit floating point variates
There was bug in the generation of 32 bit floating point values from the
uniform distribution that would result in the least significant bit of
the random variate always being 0. This has been fixed.
This change affects the variates produced by the random.Generator
methods random
, standard_normal
, standard_exponential
, and
standard_gamma
, but only when the dtype is specified as
numpy.float32
.
(gh-20314)
C API changes
Masked inner-loops cannot be customized anymore
The masked inner-loop selector is now never used. A warning will be
given in the unlikely event that it was customized.
We do not expect that any code uses this. If you do use it, you must
unset the selector on newer NumPy version. Please also contact the NumPy
developers, we do anticipate providing a new, more specific, mechanism.
The customization was part of a never-implemented feature to allow for
faster masked operations.
(gh-19259)
New Features
NEP 49 configurable allocators
As detailed in NEP 49, the
function used for allocation of the data segment of a ndarray can be
changed. The policy can be set globally or in a context. For more
information see the NEP and the data_memory
{.interpreted-text
role="ref"} reference docs. Also add a NUMPY_WARN_IF_NO_MEM_POLICY
override to warn on dangerous use of transfering ownership by setting
NPY_ARRAY_OWNDATA
.
(gh-17582)
Implementation of the NEP 47 (adopting the array API standard)
An initial implementation of NEP47, adoption
of the array API standard, has been added as numpy.array_api
. The
implementation is experimental and will issue a UserWarning on import,
as the array API standard is still in
draft state. numpy.array_api
is a conforming implementation of the
array API standard, which is also minimal, meaning that only those
functions and behaviors that are required by the standard are
implemented (see the NEP for more info). Libraries wishing to make use
of the array API standard are encouraged to use numpy.array_api
to
check that they are only using functionality that is guaranteed to be
present in standard conforming implementations.
(gh-18585)
Generate C/C++ API reference documentation from comments blocks is now possible
This feature depends on Doxygen in
the generation process and on
Breathe to integrate it
with Sphinx.
(gh-18884)
Assign the platform-specific c_intp
precision via a mypy plugin
The mypy plugin, introduced in
numpy/numpy#17843, has
again been expanded: the plugin now is now responsible for setting the
platform-specific precision of numpy.ctypeslib.c_intp
, the latter
being used as data type for various numpy.ndarray.ctypes
attributes.
Without the plugin, aforementioned type will default to
ctypes.c_int64
.
To enable the plugin, one must add it to their mypy configuration
file:
[mypy]
plugins = numpy.typing.mypy_plugin
(gh-19062)
Add NEP 47-compatible dlpack support
Add a ndarray.__dlpack__()
method which returns a dlpack
C structure
wrapped in a PyCapsule
. Also add a np._from_dlpack(obj)
function,
where obj
supports __dlpack__()
, and returns an ndarray
.
(gh-19083)
keepdims
optional argument added to numpy.argmin
, numpy.argmax
keepdims
argument is added to numpy.argmin
, numpy.argmax
. If set
to True
, the axes which are reduced are left in the result as
dimensions with size one. The resulting array has the same number of
dimensions and will broadcast with the input array.
(gh-19211)
bit_count
to compute the number of 1-bits in an integer
Computes the number of 1-bits in the absolute value of the input. This
works on all the numpy integer types. Analogous to the builtin
int.bit_count
or popcount
in C++.
>>> np.uint32(1023).bit_count()
10
>>> np.int32(-127).bit_count()
7
(gh-19355)
The ndim
and axis
attributes have been added to numpy.AxisError
The ndim
and axis
parameters are now also stored as attributes
within each numpy.AxisError
instance.
(gh-19459)
Preliminary support for windows/arm64
target
numpy
added support for windows/arm64 target. Please note OpenBLAS
support is not yet available for windows/arm64 target.
(gh-19513)
Added support for LoongArch
LoongArch is a new instruction set, numpy compilation failure on
LoongArch architecture, so add the commit.
(gh-19527)
A .clang-format
file has been added
Clang-format is a C/C++ code formatter, together with the added
.clang-format
file, it produces code close enough to the NumPy
C_STYLE_GUIDE for general use. Clang-format version 12+ is required
due to the use of several new features, it is available in Fedora 34 and
Ubuntu Focal among other distributions.
(gh-19754)
is_integer
is now available to numpy.floating
and numpy.integer
Based on its counterpart in Python float
and int
, the numpy floating
point and integer types now support float.is_integer
. Returns True
if the number is finite with integral value, and False
otherwise.
>>> np.float32(-2.0).is_integer()
True
>>> np.float64(3.2).is_integer()
False
>>> np.int32(-2).is_integer()
True
(gh-19803)
Symbolic parser for Fortran dimension specifications
A new symbolic parser has been added to f2py in order to correctly parse
dimension specifications. The parser is the basis for future
improvements and provides compatibility with Draft Fortran 202x.
(gh-19805)
ndarray
, dtype
and number
are now runtime-subscriptable
Mimicking PEP-585, the numpy.ndarray
,
numpy.dtype
and numpy.number
classes are now subscriptable for
python 3.9 and later. Consequently, expressions that were previously
only allowed in .pyi stub files or with the help of
from __future__ import annotations
are now also legal during runtime.
>>> import numpy as np
>>> from typing import Any
>>> np.ndarray[Any, np.dtype[np.float64]]
numpy.ndarray[typing.Any, numpy.dtype[numpy.float64]]
(gh-19879)
Improvements
ctypeslib.load_library
can now take any path-like object
All parameters in the can now take any
python:path-like object
{.interpreted-text role="term"}. This includes
the likes of strings, bytes and objects implementing the
__fspath__<os.PathLike.__fspath__>
{.interpreted-text role="meth"}
protocol.
(gh-17530)
Add smallest_normal
and smallest_subnormal
attributes to finfo
The attributes smallest_normal
and smallest_subnormal
are available
as an extension of finfo
class for any floating-point data type. To
use these new attributes, write np.finfo(np.float64).smallest_normal
or np.finfo(np.float64).smallest_subnormal
.
(gh-18536)
numpy.linalg.qr
accepts stacked matrices as inputs
numpy.linalg.qr
is able to produce results for stacked matrices as
inputs. Moreover, the implementation of QR decomposition has been
shifted to C from Python.
(gh-19151)
numpy.fromregex
now accepts os.PathLike
implementations
numpy.fromregex
now accepts objects implementing the
__fspath__<os.PathLike>
protocol, e.g. pathlib.Path
.
(gh-19680)
Add new methods for quantile
and percentile
quantile
and percentile
now have have a method=
keyword argument
supporting 13 different methods. This replaces the interpolation=
keyword argument.
The methods are now aligned with nine methods which can be found in
scientific literature and the R language. The remaining methods are the
previous discontinuous variations of the default "linear" one.
Please see the documentation of numpy.percentile
for more information.
(gh-19857)
Missing parameters have been added to the nan<x>
functions
A number of the nan<x>
functions previously lacked parameters that
were present in their <x>
-based counterpart, e.g. the where
parameter was present in numpy.mean
but absent from numpy.nanmean
.
The following parameters have now been added to the nan<x>
functions:
- nanmin:
initial
&where
- nanmax:
initial
&where
- nanargmin:
keepdims
&out
- nanargmax:
keepdims
&out
- nansum:
initial
&where
- nanprod:
initial
&where
- nanmean:
where
- nanvar:
where
- nanstd:
where
(gh-20027)
Annotating the main Numpy namespace
Starting from the 1.20 release, PEP 484 type annotations have been
included for parts of the NumPy library; annotating the remaining
functions being a work in progress. With the release of 1.22 this
process has been completed for the main NumPy namespace, which is now
fully annotated.
Besides the main namespace, a limited number of sub-packages contain
annotations as well. This includes, among others, numpy.testing
,
numpy.linalg
and numpy.random
(available since 1.21).
(gh-20217)
Vectorize umath module using AVX-512
By leveraging Intel Short Vector Math Library (SVML), 18 umath functions
(exp2
, log2
, log10
, expm1
, log1p
, cbrt
, sin
, cos
, tan
,
arcsin
, arccos
, arctan
, sinh
, cosh
, tanh
, arcsinh
,
arccosh
, arctanh
) are vectorized using AVX-512 instruction set for
both single and double precision implementations. This change is
currently enabled only for Linux users and on processors with AVX-512
instruction set. It provides an average speed up of 32x and 14x for
single and double precision functions respectively.
(gh-19478)
OpenBLAS v0.3.17
Update the OpenBLAS used in testing and in wheels to v0.3.17
(gh-19462)
Checksums
MD5
b23c1c11503d1e1c29ac58c3febfbe1a numpy-1.22.0rc3-cp310-cp310-macosx_10_9_universal2.whl
fdf997a0a53a1dcd33bb239132fa690f numpy-1.22.0rc3-cp310-cp310-macosx_10_9_x86_64.whl
c7e7d35bb1bdf67b83e1cb0da8a761b6 numpy-1.22.0rc3-cp310-cp310-macosx_11_0_arm64.whl
148a33cfb225369800f3a9b3e3c9bb7d numpy-1.22.0rc3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
021009e2e46a0d76d3dd876a23a48a2e numpy-1.22.0rc3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
ff4080c69d1784e77d8dd0a8f81d85b8 numpy-1.22.0rc3-cp310-cp310-win_amd64.whl
11e8f56c37ce7e5584a4e63f866acbf9 numpy-1.22.0rc3-cp38-cp38-macosx_10_9_universal2.whl
cb378d8f6de2517f3eaa82893e8c6ad6 numpy-1.22.0rc3-cp38-cp38-macosx_10_9_x86_64.whl
e2e8c26bea00f2519cc5060d5480c746 numpy-1.22.0rc3-cp38-cp38-macosx_11_0_arm64.whl
7da9371b5f6f1a615610dc6625f4d783 numpy-1.22.0rc3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
e4757f030cd9ac121c5fff3ceb783975 numpy-1.22.0rc3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
08cd8858c64a7e2e4e4c19edc55f283e numpy-1.22.0rc3-cp38-cp38-win32.whl
da71dfd7685f4056a892e5af7f01d516 numpy-1.22.0rc3-cp38-cp38-win_amd64.whl
029a566a13e7358465bd6b8b884b16f3 numpy-1.22.0rc3-cp39-cp39-macosx_10_9_universal2.whl
ce5c8ad1b490f2f834739b74502e9aed numpy-1.22.0rc3-cp39-cp39-macosx_10_9_x86_64.whl
a7c6dae3cce7d3885b8600cd102adf74 numpy-1.22.0rc3-cp39-cp39-macosx_11_0_arm64.whl
e97a1ecbb39cfd7b80f78c73f4ecba51 numpy-1.22.0rc3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
ff32a6642b8c033b51da5421b626645c numpy-1.22.0rc3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
4e8c44f9c72d9c72a5610cb142e9ee52 numpy-1.22.0rc3-cp39-cp39-win32.whl
5c264fca3e74568f0a54169fc55d506f numpy-1.22.0rc3-cp39-cp39-win_amd64.whl
1aef1271d98ac4f7b9005a2baacc837e numpy-1.22.0rc3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
19ed28cde2192447ac3ba2971a7d2660 numpy-1.22.0rc3.tar.gz
cfc937c6311761b0699e6d0405433deb numpy-1.22.0rc3.zip
SHA256
4315a66e64fe1adc7f7fa51116c87cdf5a78f2f8265c6d0ee27bfcbe845b3ddf numpy-1.22.0rc3-cp310-cp310-macosx_10_9_universal2.whl
af16e2163c1edfaa82ec43a220acc31ad0ff51619efcb41d79440dfc130e9562 numpy-1.22.0rc3-cp310-cp310-macosx_10_9_x86_64.whl
ced56665c49691ad8a31d553e42248566678f188e7c1813cadc947bfb91f3abd numpy-1.22.0rc3-cp310-cp310-macosx_11_0_arm64.whl
f13703ad4849ef62d3dadc1af1e00ce2762458b4466d4f3e339d84e6b450af33 numpy-1.22.0rc3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
6ebe0f0f40aa86c5cbe41e017e2028ba318e0743d93674a19f06a2401e602bd7 numpy-1.22.0rc3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
11fb5ee7b8a2a01bccdfb715889cb1a8490bfceeba1ab1ca9d01c92329ca5a4b numpy-1.22.0rc3-cp310-cp310-win_amd64.whl
301df2531616ff7dac8224c104b38d301adabb96c12650dae06d2036da53c385 numpy-1.22.0rc3-cp38-cp38-macosx_10_9_universal2.whl
3d0b6fb9796ba83500990dc18d8dbeaca49559c7f7f47da723fee902a99ee4bb numpy-1.22.0rc3-cp38-cp38-macosx_10_9_x86_64.whl
5b46584808f06d90df177520136cfeb5f2151b0e6a762e94c05a36f82140ff7b numpy-1.22.0rc3-cp38-cp38-macosx_11_0_arm64.whl
20016b0ed895bb80f37caadd224b01b6cc52520766ba67d8f5536ac16ef08002 numpy-1.22.0rc3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
2313aa9b9684b36b0bf07e44432d025e0803518286a1ecae5f0ea947b46008df numpy-1.22.0rc3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
af718720cb23c795a1470fde1a860c7fbbcd1387e1f3755cf734417f96124766 numpy-1.22.0rc3-cp38-cp38-win32.whl
26271b883db7ff9e375df36ad92fc9921fc336480d0aabe4483503640c9b5dd3 numpy-1.22.0rc3-cp38-cp38-win_amd64.whl
e55a7a201e1972e2686ffee1dba1ddf5e041989018a707540ba10be8367331b1 numpy-1.22.0rc3-cp39-cp39-macosx_10_9_universal2.whl
b445551ff10fe31adb76df0e6d0210e02c586686297faddcf453dd51ce2b2ea0 numpy-1.22.0rc3-cp39-cp39-macosx_10_9_x86_64.whl
a0964771a7660fd3d2420d6be0a08144f49f14d684bbe85f67467ad81bd73180 numpy-1.22.0rc3-cp39-cp39-macosx_11_0_arm64.whl
6eaa053519d1ed5922621ecb04d33d64769508060860eb0b8a07502d55554a2c numpy-1.22.0rc3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
222ce51bf9d4c77f2222049d75ea908f1862302cab7d5ccdb88773b9514e10af numpy-1.22.0rc3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
07805b77c2b4582bc6888795c0463bf3d4bd758dee922fcd685413eb3274295f numpy-1.22.0rc3-cp39-cp39-win32.whl
b63c2976f10a94af28c2860a74d7cf07ed9489ebfd36fbadb9816d3bf6ba8efb numpy-1.22.0rc3-cp39-cp39-win_amd64.whl
c3a8d12b5bf04ce3495ad2b4d706a3058415185c16d3e8d094264a9de62d52e2 numpy-1.22.0rc3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
2a61da0dc062655097cefa5ae47712317b677f22bf3f20cf397c52fae57dea8a numpy-1.22.0rc3.tar.gz
0b5642efe2a36f2191102b44bb95ee1479f14c1adb2d7155303e50b2517e43bc numpy-1.22.0rc3.zip