NumPy 2.3.0 Release Notes#

The NumPy 2.3.0 release continues the work to improve free threaded Pythonsupport and annotations together with the usual set of bug fixes. It is unusualin the number of expired deprecations, code modernizations, and style cleanups.The latter may not be visible to users, but is important for code maintenanceover the long term. Note that we have also upgraded from manylinux2014 tomanylinux_2_28.

Users running on a Mac having an M4 cpu might see various warnings aboutinvalid values and such. The warnings are a known problem with Accelerate.They are annoying, but otherwise harmless. Apple promises to fix them.

This release supports Python versions 3.11-3.13, Python 3.14 will be supportedwhen it is released.

Highlights#

  • Interactive examples in the NumPy documentation.

  • Building NumPy with OpenMP Parallelization.

  • Preliminary support for Windows on ARM.

  • Improved support for free threaded Python.

  • Improved annotations.

New functions#

New functionnumpy.strings.slice#

The new functionnumpy.strings.slice was added, which implements fastnative slicing of string arrays. It supports the full slicing API includingnegative slice offsets and steps.

(gh-27789)

Deprecations#

  • Thenumpy.typing.mypy_plugin has been deprecated in favor of platform-agnosticstatic type inference. Please removenumpy.typing.mypy_plugin from thepluginssection of your mypy configuration. If this change results in new errors beingreported, kindly open an issue.

    (gh-28129)

  • Thenumpy.typing.NBitBase type has been deprecated and will be removed ina future version.

    This type was previously intended to be used as a generic upper bound fortype-parameters, for example:

    importnumpyasnpimportnumpy.typingasnptdeff[NT:npt.NBitBase](x:np.complexfloating[NT])->np.floating[NT]:...

    But in NumPy 2.2.0,float64 andcomplex128 were changed to concretesubtypes, causing static type-checkers to rejectx:np.float64=f(np.complex128(42j)).

    So instead, the better approach is to usetyping.overload:

    importnumpyasnpfromtypingimportoverload@overloaddeff(x:np.complex64)->np.float32:...@overloaddeff(x:np.complex128)->np.float64:...@overloaddeff(x:np.clongdouble)->np.longdouble:...

    (gh-28884)

Expired deprecations#

  • Remove deprecated macros likeNPY_OWNDATA from Cython interfaces in favorofNPY_ARRAY_OWNDATA (deprecated since 1.7)

    (gh-28254)

  • Removenumpy/npy_1_7_deprecated_api.h and C macros likeNPY_OWNDATAin favor ofNPY_ARRAY_OWNDATA (deprecated since 1.7)

    (gh-28254)

  • Remove aliasgenerate_divbyzero_error tonpy_set_floatstatus_divbyzero andgenerate_overflow_error tonpy_set_floatstatus_overflow (deprecated since 1.10)

    (gh-28254)

  • Removenp.tostring (deprecated since 1.19)

    (gh-28254)

  • Raise onnp.conjugate of non-numeric types (deprecated since 1.13)

    (gh-28254)

  • Raise when usingnp.bincount(...minlength=None), use 0 instead(deprecated since 1.14)

    (gh-28254)

  • Passingshape=None to functions with a non-optional shape argumenterrors, use() instead (deprecated since 1.20)

    (gh-28254)

  • Inexact matches formode andsearchside raise (deprecated since 1.20)

    (gh-28254)

  • Setting__array_finalize__=None errors (deprecated since 1.23)

    (gh-28254)

  • np.fromfile andnp.fromstring error on bad data, previously theywould guess (deprecated since 1.18)

    (gh-28254)

  • datetime64 andtimedelta64 construction with a tuple no longeraccepts anevent value, either use a two-tuple of (unit, num) or a4-tuple of (unit, num, den, 1) (deprecated since 1.14)

    (gh-28254)

  • When constructing adtype from a class with adtype attribute, thatattribute must be a dtype-instance rather than a thing that can be parsed asa dtype instance (deprecated in 1.19). At some point the whole construct ofusing a dtype attribute will be deprecated (see #25306)

    (gh-28254)

  • Passing booleans as partition index errors (deprecated since 1.23)

    (gh-28254)

  • Out-of-bounds indexes error even on empty arrays (deprecated since 1.20)

    (gh-28254)

  • np.tostring has been removed, usetobytes instead (deprecated since 1.19)

    (gh-28254)

  • Disallow make a non-writeable array writeable for arrays with a base that donot own their data (deprecated since 1.17)

    (gh-28254)

  • concatenate() withaxis=None usessame-kind casting by default,notunsafe (deprecated since 1.20)

    (gh-28254)

  • Unpickling a scalar with object dtype errors (deprecated since 1.20)

    (gh-28254)

  • The binary mode offromstring now errors, usefrombuffer instead(deprecated since 1.14)

    (gh-28254)

  • Convertingnp.inexact ornp.floating to a dtype errors (deprecatedsince 1.19)

    (gh-28254)

  • Convertingnp.complex,np.integer,np.signedinteger,np.unsignedinteger,np.generic to a dtype errors (deprecated since1.19)

    (gh-28254)

  • The Python built-inround errors for complex scalars. Usenp.round orscalar.round instead (deprecated since 1.19)

    (gh-28254)

  • ‘np.bool’ scalars can no longer be interpreted as an index (deprecated since 1.19)

    (gh-28254)

  • Parsing an integer via a float string is no longer supported. (deprecatedsince 1.23) To avoid this error you can* make sure the original data is stored as integers.* use theconverters=float keyword argument.* Usenp.loadtxt(...).astype(np.int64)

    (gh-28254)

  • The use of a length 1 tuple for the ufuncsignature errors. Usedtypeor fill the tuple withNone (deprecated since 1.19)

    (gh-28254)

  • Special handling of matrix is in np.outer is removed. Convert to a ndarrayviamatrix.A (deprecated since 1.20)

    (gh-28254)

  • Removed thenp.compat package source code (removed in 2.0)

    (gh-28961)

C API changes#

  • NpyIter_GetTransferFlags is now available to check ifthe iterator needs the Python API or if casts may cause floating pointerrors (FPE). FPEs can for example be set when castingfloat64(1e300)tofloat32 (overflow to infinity) or a NaN to an integer (invalid value).

    (gh-27883)

  • NpyIter now has no limit on the number of operands it supports.

    (gh-28080)

NewNpyIter_GetTransferFlags andNpyIter_IterationNeedsAPI change#

NumPy now has the newNpyIter_GetTransferFlags function as a more preciseway checking of iterator/buffering needs. I.e. whether the Python API/GIL isrequired or floating point errors may occur.This function is also faster if you already know your needs without buffering.

TheNpyIter_IterationNeedsAPI function now performs all the checks that werepreviously performed at setup time. While it was never necessary to call itmultiple times, doing so will now have a larger cost.

(gh-27998)

New Features#

  • The type parameter ofnp.dtype now defaults totyping.Any.This way, static type-checkers will inferdtype:np.dtype asdtype:np.dtype[Any], without reporting an error.

    (gh-28669)

  • Static type-checkers now interpret:

    • _:np.ndarray as_:npt.NDArray[typing.Any].

    • _:np.flatiter as_:np.flatiter[np.ndarray].

    This is because their type parameters now have default values.

    (gh-28940)

NumPy now registers its pkg-config paths with thepkgconf PyPI package#

Thepkgconf PyPI package provides an interface for projects like NumPy toregister their own paths to be added to the pkg-config search path. This meansthat when usingpkgconf from PyPI, NumPy will be discoverable without needingfor any custom environment configuration.

Attention

Attention

This only applies when using thepkgconf package fromPyPI, or put anotherway, this only applies when installingpkgconf via a Python packagemanager.

If you are usingpkg-config orpkgconf provided by your system, orany other source that does not use thepkgconf-pypi project, the NumPypkg-config directory will not be automatically added to the search path. Inthese situations, you might want to usenumpy-config.

(gh-28214)

Allowout=... in ufuncs to ensure array result#

NumPy has the sometimes difficult behavior that it currently usuallyreturns scalars rather than 0-D arrays (even if the inputs were 0-D arrays).This is especially problematic for non-numerical dtypes (e.g.object).

For ufuncs (i.e. most simple math functions) it is now possible to useout=... (literally `…`, e.g.out=Ellipsis) which is identical inbehavior toout not being passed, but will ensure a non-scalar return.This spelling is borrowed fromarr1d[0,...] where the... also ensuresa non-scalar return.

Other functions with anout= kwarg should gain support eventually.Downstream libraries that interoperate via__array_ufunc__ or__array_function__ may need to adapt to support this.

(gh-28576)

Building NumPy with OpenMP Parallelization#

NumPy now supports OpenMP parallel processing capabilities when built with the-Denable_openmp=true Meson build flag. This feature is disabled by default.When enabled,np.sort andnp.argsort functions can utilize OpenMP forparallel thread execution, improving performance for these operations.

(gh-28619)

Interactive examples in the NumPy documentation#

The NumPy documentation includes a number of examples thatcan now be run interactively in your browser using WebAssemblyand Pyodide.

Please note that the examples are currently experimental innature and may not work as expected for all methods in thepublic API.

(gh-26745)

Improvements#

  • Scalar comparisons between non-comparable dtypes such asnp.array(1)==np.array('s') now return a NumPy bool instead ofa Python bool.

    (gh-27288)

  • np.nditer now has no limit on the number of supported operands(C-integer).

    (gh-28080)

  • No-copy pickling is now supported for anyarray that can be transposed to a C-contiguous array.

    (gh-28105)

  • The__repr__ for user-defined dtypes now prefers the__name__ of thecustom dtype over a more generic name constructed from itskind anditemsize.

    (gh-28250)

  • np.dot now reports floating point exceptions.

    (gh-28442)

  • np.dtypes.StringDType is now ageneric type whichaccepts a type argument forna_object that defaults totyping.Never.For example,StringDType(na_object=None) returns aStringDType[None],andStringDType() returns aStringDType[typing.Never].

    (gh-28856)

Added warnings tonp.isclose#

Added warning messages if at least one of atol or rtol are eithernp.nan ornp.inf withinnp.isclose.

  • Warnings follow the user’snp.seterr settings

(gh-28205)

Performance improvements and changes#

Performance improvements tonp.unique#

np.unique now tries to use a hash table to find unique values instead ofsorting values before finding unique values. This is limited to certain dtypesfor now, and the function is now faster for those dtypes. The function now alsoexposes asorted parameter to allow returning unique values as they werefound, instead of sorting them afterwards.

(gh-26018)

Performance improvements tonp.sort andnp.argsort#

np.sort andnp.argsort functions now can leverage OpenMP for parallelthread execution, resulting in up to 3.5x speedups on x86 architectures withAVX2 or AVX-512 instructions. This opt-in feature requires NumPy to be builtwith the -Denable_openmp Meson flag. Users can control the number of threadsused by setting the OMP_NUM_THREADS environment variable.

(gh-28619)

Performance improvements fornp.float16 casts#

Earlier, floating point casts to and fromnp.float16 typeswere emulated in software on all platforms.

Now, on ARM devices that support Neon float16 intrinsics (such asrecent Apple Silicon), the native float16 path is used to achievethe best performance.

(gh-28769)

Changes#

  • The vector normord=inf and the matrix normsord={1,2,inf,'nuc'}now always returns zero for empty arrays. Empty arrays have at least one axisof size zero. This affectsnp.linalg.norm,np.linalg.vector_norm, andnp.linalg.matrix_norm. Previously, NumPy would raises errors or returnzero depending on the shape of the array.

    (gh-28343)

  • A spelling error in the error message returned when converting a string to afloat with the methodnp.format_float_positional has been fixed.

    (gh-28569)

  • NumPy’s__array_api_version__ was upgraded from2023.12 to2024.12.

  • numpy.count_nonzero foraxis=None (default) now returns a NumPy scalarinstead of a Python integer.

  • The parameteraxis innumpy.take_along_axis function has now a defaultvalue of-1.

    (gh-28615)

  • Printing ofnp.float16 andnp.float32 scalars and arrays have been improved byadjusting the transition to scientific notation based on the floating point precision.A new legacynp.printoptions mode'2.2' has been added for backwards compatibility.

    (gh-28703)

  • Multiplication between a string and integer now raises OverflowError insteadof MemoryError if the result of the multiplication would create a string thatis too large to be represented. This follows Python’s behavior.

    (gh-29060)

unique_values may return unsorted data#

The relatively new function (added in NumPy 2.0)unique_values may nowreturn unsorted results. Just asunique_counts andunique_all thesenever guaranteed a sorted result, however, the result was sorted until now. Incases where these do return a sorted result, this may change in future releasesto improve performance.

(gh-26018)

Changes to the main iterator and potential numerical changes#

The main iterator, used in math functions and vianp.nditer from Python andNpyIter in C, now behaves differently for some buffered iterations. Thismeans that:

  • The buffer size used will often be smaller than the maximum buffer sizedallowed by thebuffersize parameter.

  • The “growinner” flag is now honored with buffered reductions when no operandrequires buffering.

Fornp.sum() such changes in buffersize may slightly change numericalresults of floating point operations. Users who use “growinner” for customreductions could notice changes in precision (for example, in NumPy we removedit fromeinsum to avoid most precision changes and improve precision forsome 64bit floating point inputs).

(gh-27883)

The minimum supported GCC version is now 9.3.0#

The minimum supported version was updated from 8.4.0 to 9.3.0, primarily inorder to reduce the chance of platform-specific bugs in old GCC versions fromcausing issues.

(gh-28102)

Changes to automatic bin selection in numpy.histogram#

The automatic bin selection algorithm innumpy.histogram has been modifiedto avoid out-of-memory errors for samples with low variation. For full controlover the selected bins the user can use set thebin orrange parametersofnumpy.histogram.

(gh-28426)

Build manylinux_2_28 wheels#

Wheels for linux systems will use themanylinux_2_28 tag (instead of themanylinux2014 tag), which means dropping support for redhat7/centos7,amazonlinux2, debian9, ubuntu18.04, and other pre-glibc2.28 operating systemversions, as per thePEP 600 support table.

(gh-28436)

Remove use of -Wl,-ld_classic on macOS#

Remove use of -Wl,-ld_classic on macOS. This hack is no longer needed by Spack,and results in libraries that cannot link to other libraries built with ld(new).

(gh-28713)

Re-enable overriding functions in thenumpy.strings#

Re-enable overriding functions in thenumpy.strings module.

(gh-28741)

On this page