Releases: numpy/numpy
v2.5.0rc1 (June 2, 2026)
NumPy 2.5.0 Release Notes
Numpy 2.5.0 is a transitional release. It drops support for Python 3.11,
marking the end of distutils, and expires a large number of deprecations made
in the 2.0.x release. It also improves free threading and brings sorting into
compliance with the array-api standard with the addition of descending sorts.
Python 3.15 will be supported when it is released.
This release supports Python versions 3.12-3.14.
Highlights
- Distutils has been removed,
- Many expired deprecations, see below,
- Many new deprecations, see below,
- Many static typing improvements.
- Improved support for free threading,
- Support for descending sorts,
See New Features below for other additions.
Deprecations
-
numpy.char.chararrayis deprecated. Use anndarraywith a string or bytes dtype instead.(gh-30605)
-
numpy.takenow correctly checks if the result can be cast to the provided
out=outunder the same-kind rule. ADeprecationWarningis given now
when this check fails. Previously,takeincorrectly checked ifout
could be cast to the result (the wrong direction). This deprecation also
affectscompressand possibly other functions. (Future versions of NumPy
may tighten the casting check further.)(gh-30615)
-
The
numpy.char.[as]arrayfunctions are deprecated. Use an
numpy.[as]arraywith a string or bytes dtype instead.(gh-30802)
-
Setting the dtype attribute is deprecated because mutating an array is unsafe
if an array is shared, especially by multiple threads. As an alternative,
you can create a view with a new dtype viaarray.view(dtype=new_dtype).(gh-29244)
-
Setting the
shapeattribute is deprecated because mutating an array is
unsafe if an array is shared, especially by multiple threads. As an
alternative, you can create a new view vianp.reshapeor
np.ndarray.reshape. For example:x = np.arange(15); x = np.reshape(x, (3, 5)).
To ensure no copy is made from the data, one can usenp.reshape(..., copy=False).While setting the shape on an array is discouraged, for cases where it is
difficult to work around, e.g., in__array_finalize__, it is possible
with the private methodnp.ndarray._set_shape.(gh-29536)
-
Using the
genericunit innumpy.timedelta64is deprecated since this
can lead to unexpected behavior such as non-transitive comparison, see
gh-28287 for details. As
an alternative, specify an explicit unit such as's'(seconds) or'D'
(days) when constructingnumpy.timedelta64. Due to this change, operations
that implicitly rely on thegenericunit are also deprecated. For
example:arr = np.array([1, 2, 3], dtype="m8[s]") # `1` is implicitly converted to generic timedelta64 arr + 1(gh-29619)
-
Resizing a Numpy array in place is deprecated since mutating an array is
unsafe if an array is shared, especially by multiple threads. As an
alternative, you can create a resized array vianp.resize.(gh-30181)
-
numpy.fixis deprecated, usenumpy.truncinstead. It is faster and
follows the Array API standard. Both functions provide identical
functionality: rounding array elements towards zero.(gh-30644)
-
numpy.ma.round_is deprecated.numpy.ma.roundcan be used as a
replacement.(gh-30738)
-
numpy.typenameis deprecated because the names returned by it were
outdated and inconsistent.numpy.dtype.namecan be used as a
replacement.(gh-30774)
-
Inputs other than integers are deprecated for
numpy.triu_indicesand
numpy.tril_indices. Non-integer values for theM,kandN
parameters ofnumpy.triare deprecated. Non-integer values for thek
parameter of bothnumpy.tril_indices_fromandnumpy.triu_indices_from
are deprecated.(gh-30869)
-
Deprecations in custom
dtypeproperty and__array_finalize__.Previously
arr.view(dtype=new_dtype)calledarr.dtype = new_dtype
also for subclasses, i.e., the attribute setting. That path is now
deprecated and refined, meaning that even subclasses that do not see this
DeprecationWarningmay wish to update their code.A subclass that does any
dtypespecific logic (i.e. verifying the dtype
in__array_finalize__or has adtypeproperty) should now:- Set
_set_dtype = Nonein which casearr.view(dtype=new_dtype)
will call__array_finalize__with the new dtype, ensuring that
any validation__array_finalize__will run is done. - Or, for a quick fix, define
_set_dtypeas a function (calling
ndarray._set_dtype()to avoidDeprecationWarnings.
(Future versions might migrate towards the_set_dtype = Nonepath.)
Ideally, follow NumPy's deprecation to prevent
dtypemutation by users.
The use ofndarray._set_dtype()may be necessary for some subclass
finalization patterns, but should otherwise be avoided.(gh-31293)
- Set
Expired deprecations
-
numpy.distutilshas been removed(gh-30340)
-
Passing
Noneas dtype tonp.finfowill now raise aTypeError
(deprecated since 1.25)(gh-30460)
-
numpy.crossno longer supports 2-dimensional vectors.
(Deprecated since 2.0)(gh-30461)
-
numpy._core.numerictypes.maximum_sctypehas been removed.
(deprecated since 2.0)(gh-30462)
-
numpy.row_stackhas been removed in favor ofnumpy.vstack.
(deprecated since 2.0)(gh-30463)
-
get_array_wraphas been removed.
(deprecated since 2.0)(gh-30463)
-
recfromtxtandrecfromcsvhave been removed fromnumpy.lib._npyio
in favor ofnumpy.genfromtxt.
(deprecated since 2.0)(gh-30467)
-
The
numpy.chararrayre-export ofnumpy.char.chararrayhas been removed.
(deprecated since 2.0)(gh-30604)
-
bincountnow raises aTypeErrorfor non-integer inputs.
(deprecated since 2.1)(gh-30610)
-
The
numpy.lib.mathalias for the standard librarymathmodule has
been removed.
(deprecated since 1.25)(gh-30612)
-
Data type alias
'a'was removed in favor of'S'.
(deprecated since 2.0)(gh-30613)
-
_add_newdoc_ufunc(ufunc, newdoc)has been removed in favor of
ufunc.__doc__ = newdoc.
(deprecated since 2.2)(gh-30614)
Compatibility notes
linalg.eig and linalg.eigvals now always return complex arrays
Previously, the return values depended on whether the eigenvalues happen to lie
on the real line (which, for a general, non-symmetric matrix, is not
guaranteed).
This change makes consistent what was a value-dependent result. To retain the
previous behavior, do:
w = eigvals(a)
if np.any(w.imag == 0): # this is what NumPy used to do
w = w.real
If your matrix is symmetrix/hermitian, use eigh and eigvalsh instead of
eig and eigvals. These are guaranteed to return real values. A common
case is covariance matrices, which are symmetric and positive definite by
construction.
(gh-30411)
MSVC support
NumPy now requires minimum MSVC 19.35 toolchain version on Windows platforms.
This corresponds to Visual Studio 2022 version 17.5 Preview 2 or newer.
(gh-30489)
Cython support
NumPy's Cython headers (accessed via cimport numpy) now require Cython 3.0
or newer to build. If you try to compile a project that depends on NumPy's
Cython headers using Cython 0.29 or older, you will see a message like this:
Error compiling Cython file:
------------------------------------------------------------
...
# versions.
#
# See __init__.cython-30.pxd for the real Cython header
#
DEF err = int('Build aborted: the NumPy Cython headers require Cython 3.0.0 or newer.')
------------------------------------------------------------
/path/to/site-packages/numpy/__init__.pxd:11:13: Error in compile-time expression:
ValueError: invalid literal for int() with base 10:
'Build aborted: the NumPy Cython headers require Cython 3.0.0 or newer.'
Note that the invalid integer is not a bug in NumPy - we are intentionally
generating this error to avoid triggering a more obscure error later in the
build when an older Cython version tries to use a Cython feature that was not
available in the old Cython version.
(gh-30770)
numpy.where no longer truncates Python integers
Previously, if the x or y argument of numpy.where was a Python
integer that was out of range of the output type, it would be silently
truncated. Now, an OverflowError will be raised instead.
T...
v2.4.6 (May 18, 2026)
NumPy 2.4.6 Release Notes
NumPy 2.4.6 is a quick release that fixes a regression discovered in the 2.4.5
release.
This release supports Python versions 3.11-3.14
Contributors
A total of 4 people contributed to this release. People with a "+" by their
names contributed a patch for the first time.
- !EarlMilktea
- Charles Harris
- Sebastian Berg
- Warren Weckesser
Pull requests merged
A total of 4 pull requests were merged for this release.
v2.4.5 (May 15, 2026)
NumPy 2.4.5 Release Notes
NumPy 2.4.5 is a patch release that fixes bugs discovered after the 2.4.4
release, has some typing improvements, and maintains infrastructure.
This release supports Python versions 3.11-3.14
Contributors
A total of 17 people contributed to this release. People with a "+" by their
names contributed a patch for the first time.
- Aleksei Nikiforov
- Anarion Zuo +
- Ankit Ahlawat
- Breno Favaretto +
- Charles Harris
- Igor Krivenko +
- Ijtihed Kilani +
- Joren Hammudoglu
- Maarten Baert +
- Matti Picus
- Nathan Goldbaum
- Praneeth Kodumagulla +
- Ralf Gommers
- RoomWithOutRoof +
- Sebastian Berg
- Warren Weckesser
- div +
Pull requests merged
A total of 28 pull requests were merged for this release.
- #31093: MAINT: Prepare 2.4.x for further development
- #31182: TYP: fix
np.shapeassignability issue for python lists (#31171) - #31197: ENH: Return rank 0 for empty matrices in matrix_rank (#30422)
- #31198: CI/BUG: add native jobs for s390x, fix bug in
pack_inner... - #31199: BUG: f2py map complex_long_double to NPY_CLONGDOUBLE
- #31205: MAINT: f2py: Stop setting re._MAXCACHE to 50.
- #31206: BUG: fix heap buffer overflow in timedelta to string casts
- #31207: MAINT: Rename ppc64le and s390x workflow (#31121)
- #31208: BUG: Fix matvec/vecmat in-place aliasing (out=input produces...
- #31209: TYP:
tile: accept numpy scalars and arrays as second argument... - #31211: DEP: Undo deprecation for np.dtype() signature used by old pickles...
- #31212: REV: Manual revert of float16 svml use (#31178)
- #31222: TYP:
ix_fix for boolean and non-1d input (#31218) - #31329: BUG: incorrect temp elision for new-style (NEP 43) user-defined...
- #31330: TYP: fix sliding_window_view axis parameter typing
- #31335: BUG: Prevent deadlock due to downstream importing NumPy in dlopen...
- #31336: BUG: Fix segfault in nditer.multi_index when __getitem__ raises...
- #31338: TYP: Fix ruff lint error
- #31357: BUG: fix memory leak in np.zeros when fill-zero loop raises (#31320)
- #31358: BUG: np.einsum() fails with a 0-dimensional out argument and...
- #31379: BUG: Fix signed overflow issue in npy_gcd for INT_MIN on s390x...
- #31383: CI: remove Cirrus CI FreeBSD job (#31380)
- #31390: BUILD: newer MKL uses so.3
- #31391: BLD/MAINT: improve support for Intel LLVM compilers
- #31401: BUG: Avoid UB in safe[add,sub,mul] helpers (#31396)
- #31402: BUG: exclude __pycache__ directories from wheels (#31397)
- #31404: TYP:
_NestedSequencetype parameter default to work around... - #31426: TYP: Fix
DTypeLikeruntime type-checker support (#31425)
2.4.4 (Mar 29, 2026)
NumPy 2.4.4 Release Notes
The NumPy 2.4.4 is a patch release that fixes bugs discovered after the 2.4.3
release. It should finally close issue #30816, the OpenBLAS threading problem
on ARM.
This release supports Python versions 3.11-3.14
Contributors
A total of 8 people contributed to this release. People with a "+" by their
names contributed a patch for the first time.
- Charles Harris
- Daniel Haag +
- Denis Prokopenko +
- Harshith J +
- Koki Watanabe
- Marten van Kerkwijk
- Matti Picus
- Nathan Goldbaum
Pull requests merged
A total of 7 pull requests were merged for this release.
- #30978: MAINT: Prepare 2.4.x for further development
- #31049: BUG: Add test to reproduce problem described in #30816 (#30818)
- #31052: BUG: fix FNV-1a 64-bit selection by using NPY_SIZEOF_UINTP (#31035)
- #31053: BUG: avoid warning on ufunc with where=True and no output
- #31058: DOC: document caveats of ndarray.resize on 3.14 and newer
- #31079: TST: fix POWER VSX feature mapping (#30801)
- #31084: MAINT: numpy.i: Replace deprecated
sprintfwithsnprintf...
2.4.3 (Mar 9, 2026)
NumPy 2.4.3 Release Notes
The NumPy 2.4.3 is a patch release that fixes bugs discovered after the
2.4.2 release. The most user visible fix may be a threading fix for
OpenBLAS on ARM, closing issue #30816.
This release supports Python versions 3.11-3.14
Contributors
A total of 11 people contributed to this release. People with a "+" by their
names contributed a patch for the first time.
- Antareep Sarkar +
- Charles Harris
- Joren Hammudoglu
- Matthieu Darbois
- Matti Picus
- Nathan Goldbaum
- Peter Hawkins
- Pieter Eendebak
- Sebastian Berg
- Warren Weckesser
- stratakis +
Pull requests merged
A total of 14 pull requests were merged for this release.
- #30759: MAINT: Prepare 2.4.x for further development
- #30827: BUG: Fix some leaks found via LeakSanitizer (#30756)
- #30841: MAINT: Synchronize 2.4.x submodules with main
- #30849: TYP:
matlib: missing extended precision imports - #30850: BUG: Fix weak hash function in np.isin(). (#30840)
- #30921: BUG: fix infinite recursion in np.ma.flatten_structured_array...
- #30922: BUG: Fix buffer overrun in CPU baseline validation (#30877)
- #30923: BUG: Fix busdaycalendar's handling of a bool array weekmask....
- #30924: BUG: Fix reference leaks and NULL pointer dereferences (#30908)
- #30925: MAINT: fix two minor issues noticed when touching the C API setup
- #30955: ENH: Test .kind not .char in np.testing.assert_equal (#30879)
- #30957: BUG: fix type issues in uses if PyDataType macros
- #30958: MAINT: Don't use vulture 2.15, it has false positives
- #30973: MAINT: update openblas (#30961)
2.4.2 (Feb 1, 2026)
NumPy 2.4.2 Release Notes
The NumPy 2.4.2 is a patch release that fixes bugs discovered after the
2.4.1 release. Highlights are:
- Fixes memory leaks
- Updates OpenBLAS to fix hangs
This release supports Python versions 3.11-3.14
Contributors
A total of 9 people contributed to this release. People with a "+" by their
names contributed a patch for the first time.
- Charles Harris
- Daniel Tang +
- Joren Hammudoglu
- Kumar Aditya
- Matti Picus
- Nathan Goldbaum
- Ralf Gommers
- Sebastian Berg
- Vikram Kumar +
Pull requests merged
A total of 12 pull requests were merged for this release.
- #30629: MAINT: Prepare 2.4.x for further development
- #30636: TYP:
arange: accept datetime strings - #30657: MAINT: avoid possible race condition by not touching
os.environ... - #30700: BUG: validate contraction axes in tensordot (#30521)
- #30701: DOC: __array_namespace__info__: set_module not __module__ (#30679)
- #30702: BUG: fix free-threaded PyObject layout in replace_scalar_type_names...
- #30703: TST: fix limited API example in tests for latest Cython
- #30709: BUG: Fix some bugs found via valgrind (#30680)
- #30712: MAINT: replace ob_type access with Py_TYPE in PyArray_CheckExact
- #30713: BUG: Fixup the quantile promotion fixup
- #30736: BUG: fix thread safety of
array_getbuffer(#30667) - #30737: backport scipy-openblas version change
2.4.1 (Jan 10, 2026)
NumPy 2.4.1 Release Notes
The NumPy 2.4.1 is a patch release that fixes bugs discoved after the
2.4.0 release. In particular, the typo SeedlessSequence is preserved to
enable wheels using the random Cython API and built against NumPy < 2.4.0
to run without errors.
This release supports Python versions 3.11-3.14
Contributors
A total of 9 people contributed to this release. People with a "+" by their
names contributed a patch for the first time.
- Alexander Shadchin
- Bill Tompkins +
- Charles Harris
- Joren Hammudoglu
- Marten van Kerkwijk
- Nathan Goldbaum
- Raghuveer Devulapalli
- Ralf Gommers
- Sebastian Berg
Pull requests merged
A total of 15 pull requests were merged for this release.
- #30490: MAINT: Prepare 2.4.x for further development
- #30503: DOC:
numpy.select: fixdefaultparameter docstring... - #30504: REV: Revert part of #30164 (#30500)
- #30506: TYP:
numpy.select: allow passing array-likedefault... - #30507: MNT: use if constexpr for compile-time branch selection
- #30513: BUG: Fix leak in flat assignment iterator
- #30516: BUG: fix heap overflow in fixed-width string multiply (#30511)
- #30523: BUG: Ensure summed weights returned by np.average always are...
- #30527: TYP: Fix return type of histogram2d
- #30594: MAINT: avoid passing ints to random functions that take double...
- #30595: BLD: Avoiding conflict with pygit2 for static build
- #30596: MAINT: Fix msvccompiler missing error on FreeBSD
- #30608: BLD: update vendored Meson to 1.9.2
- #30620: ENH: use more fine-grained critical sections in array coercion...
- #30623: BUG: Undo result type change of quantile/percentile but keep...
2.4.0 (Dec 20, 2025)
NumPy 2.4.0 Release Notes
The NumPy 2.4.0 release continues the work to improve free threaded Python
support, user dtypes implementation, and annotations. There are many expired
deprecations and bug fixes as well.
This release supports Python versions 3.11-3.14
Highlights
Apart from annotations and same_value kwarg, the 2.4 highlights are mostly
of interest to downstream developers. They should help in implementing new user
dtypes.
- Many annotation improvements. In particular, runtime signature introspection.
- New
castingkwarg'same_value'for casting by value. - New
PyUFunc_AddLoopsFromSpecfunction that can be used to add user sort
loops using theArrayMethodAPI. - New
__numpy_dtype__protocol.
Deprecations
Setting the strides attribute is deprecated
Setting the strides attribute is now deprecated since mutating
an array is unsafe if an array is shared, especially by multiple
threads. As an alternative, you can create a new view (no copy) via:
np.lib.stride_tricks.strided_window_viewif applicable,np.lib.stride_tricks.as_stridedfor the general case,- or the
np.ndarrayconstructor (bufferis the original array) for a
light-weight version.
(gh-28925)
Positional out argument to np.maximum, np.minimum is deprecated
Passing the output array out positionally to numpy.maximum and
numpy.minimum is deprecated. For example, np.maximum(a, b, c) will emit
a deprecation warning, since c is treated as the output buffer rather than
a third input.
Always pass the output with the keyword form, e.g. np.maximum(a, b, out=c).
This makes intent clear and simplifies type annotations.
(gh-29052)
align= must be passed as boolean to np.dtype()
When creating a new dtype a VisibleDeprecationWarning will be given if
align= is not a boolean. This is mainly to prevent accidentally passing a
subarray align flag where it has no effect, such as np.dtype("f8", 3)
instead of np.dtype(("f8", 3)). We strongly suggest to always pass
align= as a keyword argument.
(gh-29301)
Assertion and warning control utilities are deprecated
np.testing.assert_warns and np.testing.suppress_warnings are
deprecated. Use warnings.catch_warnings, warnings.filterwarnings,
pytest.warns, or pytest.filterwarnings instead.
(gh-29550)
np.fix is pending deprecation
The numpy.fix function will be deprecated in a future release. It is
recommended to use numpy.trunc instead, as it provides the same
functionality of truncating decimal values to their integer parts. Static type
checkers might already report a warning for the use of numpy.fix.
(gh-30168)
in-place modification of ndarray.shape is pending deprecation
Setting the ndarray.shape attribute directly will be deprecated in a future
release. Instead of modifying the shape in place, it is recommended to use the
numpy.reshape function. Static type checkers might already report a
warning for assignments to ndarray.shape.
(gh-30282)
Deprecation of numpy.lib.user_array.container
The numpy.lib.user_array.container class is deprecated and will be removed
in a future version.
(gh-30284)
Expired deprecations
Removed deprecated MachAr runtime discovery mechanism.
(gh-29836)
Raise TypeError on attempt to convert array with ndim > 0 to scalar
Conversion of an array with ndim > 0 to a scalar was deprecated in NumPy
1.25. Now, attempting to do so raises TypeError. Ensure you extract a
single element from your array before performing this operation.
(gh-29841)
Removed numpy.linalg.linalg and numpy.fft.helper
The following were deprecated in NumPy 2.0 and have been moved to private
modules:
numpy.linalg.linalg
Usenumpy.linalginstead.numpy.fft.helper
Usenumpy.fftinstead.
(gh-29909)
Removed interpolation parameter from quantile and percentile functions
The interpolation parameter was deprecated in NumPy 1.22.0 and has been
removed from the following functions:
numpy.percentilenumpy.nanpercentilenumpy.quantilenumpy.nanquantile
Use the method parameter instead.
(gh-29973)
Removed numpy.in1d
numpy.in1d has been deprecated since NumPy 2.0 and is now removed in favor of numpy.isin.
(gh-29978)
Removed numpy.ndindex.ndincr()
The ndindex.ndincr() method has been deprecated since NumPy 1.20 and is now
removed; use next(ndindex) instead.
(gh-29980)
Removed fix_imports parameter from numpy.save
The fix_imports parameter was deprecated in NumPy 2.1.0 and is now removed.
This flag has been ignored since NumPy 1.17 and was only needed to support
loading files in Python 2 that were written in Python 3.
(gh-29984)
Removal of four undocumented ndarray.ctypes methods
Four undocumented methods of the ndarray.ctypes object have been removed:
_ctypes.get_data()(use_ctypes.datainstead)_ctypes.get_shape()(use_ctypes.shapeinstead)_ctypes.get_strides()(use_ctypes.stridesinstead)_ctypes.get_as_parameter()(use_ctypes._as_parameter_instead)
These methods have been deprecated since NumPy 1.21.
(gh-29986)
Removed newshape parameter from numpy.reshape
The newshape parameter was deprecated in NumPy 2.1.0 and has been
removed from numpy.reshape. Pass it positionally or use shape=
on newer NumPy versions.
(gh-29994)
Removal of deprecated functions and arguments
The following long-deprecated APIs have been removed:
numpy.trapz--- deprecated since NumPy 2.0 (2023-08-18). Usenumpy.trapezoidor
scipy.integratefunctions instead.dispfunction --- deprecated from 2.0 release and no longer functional. Use
your own printing function instead.biasandddofarguments innumpy.corrcoef--- these had no effect
since NumPy 1.10.
(gh-29997)
Removed delimitor parameter from numpy.ma.mrecords.fromtextfile()
The delimitor parameter was deprecated in NumPy 1.22.0 and has been
removed from numpy.ma.mrecords.fromtextfile(). Use delimiter instead.
(gh-30021)
numpy.array2string and numpy.sum deprecations finalized
The following long-deprecated APIs have been removed or converted to errors:
- The
styleparameter has been removed fromnumpy.array2string.
This argument had no effect since Numpy 1.14.0. Any arguments following
it, such asformatterhave now been made keyword-only. - Calling
np.sum(generator)directly on a generator object now raises a
TypeError. This behavior was deprecated in NumPy 1.15.0. Use
np.sum(np.fromiter(generator))or the pythonsumbuiltin instead.
(gh-30068)
Compatibility notes
-
NumPy's C extension modules have begun to use multi-phase initialisation, as
defined by PEP 489. As part of this, a new explicit check has been added that
each such module is only imported once per Python process. This comes with
the side-effect that deletingnumpyfromsys.modulesand re-importing
it will now fail with anImportError. This has always been unsafe, with
unexpected side-effects, though did not previously raise an error.(gh-29030)
-
numpy.roundnow always returns a copy. Previously, it returned a view
for integer inputs fordecimals >= 0and a copy in all other cases.
This change bringsroundin line withceil,floorandtrunc.(gh-29137)
-
Type-checkers will no longer accept calls to
numpy.arangewith
startas a keyword argument. This was done for compatibility with
the Array API standard. At runtime it is still possible to use
numpy.arangewithstartas a keyword argument.(gh-30147)
-
The Macro NPY_ALIGNMENT_REQUIRED has been removed The macro was defined in
thenpy_cpu.hfile, so might be regarded as semi public. As it turns out,
with modern compilers and hardware it is almost always the case that
alignment is required, so numpy no longer uses the macro. It is unlikely
anyone uses it, but you might want to compile with the-Wundefflag or
equivalent to be sure.(gh-29094)
C API changes
The NPY_SORTKIND enum has been enhanced with new variables
This is of interest if you are using PyArray_Sort or PyArray_ArgSort.
We have changed the semantics of the old names in the NPY_SORTKIND enum and
added new ones. The changes are backward compatible, and no recompilation is
needed. The new names of interest are:
NPY_SORT_DEFAULT-- default sort (same value asNPY_QUICKSORT)NPY_SORT_STABLE-- the sort must be stable (same value asNPY_MERGESORT)NPY_SORT_DESCENDING-- the sort must be descending
The semantic change is that NPY_HEAPSORT is mapped to `NPY_QUICK...
2.4.0rc1 (Dec 3, 2025)
NumPy 2.4.0 Release Notes
The NumPy 2.4.0 release continues the work to improve free threaded Python
support, user dtypes implementation, and annotations. There are many expired
deprecations and bug fixes as well.
This release supports Python versions 3.11-3.14
Highlights
Apart from annotations and same_value kwarg, the 2.4 highlights are mostly
of interest to downstream developers. They should help in implementing new user
dtypes.
- Many annotation improvements. In particular, runtime signature introspection.
- New
castingkwarg'same_value'for casting by value. - New
PyUFunc_AddLoopsFromSpecfunction that can be used to add user sort
loops using theArrayMethodAPI. - New
__numpy_dtype__protocol.
Deprecations
Setting the strides attribute is deprecated
Setting the strides attribute is now deprecated since mutating
an array is unsafe if an array is shared, especially by multiple
threads. As an alternative, you can create a new view (no copy) via:
np.lib.stride_tricks.strided_window_viewif applicable,np.lib.stride_tricks.as_stridedfor the general case,- or the
np.ndarrayconstructor (bufferis the original array) for a
light-weight version.
(gh-28925)
Positional out argument to np.maximum, np.minimum is deprecated
Passing the output array out positionally to numpy.maximum and
numpy.minimum is deprecated. For example, np.maximum(a, b, c) will emit
a deprecation warning, since c is treated as the output buffer rather than
a third input.
Always pass the output with the keyword form, e.g. np.maximum(a, b, out=c).
This makes intent clear and simplifies type annotations.
(gh-29052)
align= must be passed as boolean to np.dtype()
When creating a new dtype a VisibleDeprecationWarning will be given if
align= is not a boolean. This is mainly to prevent accidentally passing a
subarray align flag where it has no effect, such as np.dtype("f8", 3)
instead of np.dtype(("f8", 3)). We strongly suggest to always pass
align= as a keyword argument.
(gh-29301)
Assertion and warning control utilities are deprecated
np.testing.assert_warns and np.testing.suppress_warnings are
deprecated. Use warnings.catch_warnings, warnings.filterwarnings,
pytest.warns, or pytest.filterwarnings instead.
(gh-29550)
np.fix is pending deprecation
The numpy.fix function will be deprecated in a future release. It is
recommended to use numpy.trunc instead, as it provides the same
functionality of truncating decimal values to their integer parts. Static type
checkers might already report a warning for the use of numpy.fix.
(gh-30168)
in-place modification of ndarray.shape is pending deprecation
Setting the ndarray.shape attribute directly will be deprecated in a future
release. Instead of modifying the shape in place, it is recommended to use the
numpy.reshape function. Static type checkers might already report a
warning for assignments to ndarray.shape.
(gh-30282)
Deprecation of numpy.lib.user_array.container
The numpy.lib.user_array.container class is deprecated and will be removed
in a future version.
(gh-30284)
Expired deprecations
Removed deprecated MachAr runtime discovery mechanism.
(gh-29836)
Raise TypeError on attempt to convert array with ndim > 0 to scalar
Conversion of an array with ndim > 0 to a scalar was deprecated in NumPy
1.25. Now, attempting to do so raises TypeError. Ensure you extract a
single element from your array before performing this operation.
(gh-29841)
Removed numpy.linalg.linalg and numpy.fft.helper
The following were deprecated in NumPy 2.0 and have been moved to private
modules:
numpy.linalg.linalg
Usenumpy.linalginstead.numpy.fft.helper
Usenumpy.fftinstead.
(gh-29909)
Removed interpolation parameter from quantile and percentile functions
The interpolation parameter was deprecated in NumPy 1.22.0 and has been
removed from the following functions:
numpy.percentilenumpy.nanpercentilenumpy.quantilenumpy.nanquantile
Use the method parameter instead.
(gh-29973)
Removed numpy.in1d
numpy.in1d has been deprecated since NumPy 2.0 and is now removed in favor of numpy.isin.
(gh-29978)
Removed numpy.ndindex.ndincr()
The ndindex.ndincr() method has been deprecated since NumPy 1.20 and is now
removed; use next(ndindex) instead.
(gh-29980)
Removed fix_imports parameter from numpy.save
The fix_imports parameter was deprecated in NumPy 2.1.0 and is now removed.
This flag has been ignored since NumPy 1.17 and was only needed to support
loading files in Python 2 that were written in Python 3.
(gh-29984)
Removal of four undocumented ndarray.ctypes methods
Four undocumented methods of the ndarray.ctypes object have been removed:
_ctypes.get_data()(use_ctypes.datainstead)_ctypes.get_shape()(use_ctypes.shapeinstead)_ctypes.get_strides()(use_ctypes.stridesinstead)_ctypes.get_as_parameter()(use_ctypes._as_parameter_instead)
These methods have been deprecated since NumPy 1.21.
(gh-29986)
Removed newshape parameter from numpy.reshape
The newshape parameter was deprecated in NumPy 2.1.0 and has been
removed from numpy.reshape. Pass it positionally or use shape=
on newer NumPy versions.
(gh-29994)
Removal of deprecated functions and arguments
The following long-deprecated APIs have been removed:
numpy.trapz--- deprecated since NumPy 2.0 (2023-08-18). Usenumpy.trapezoidor
scipy.integratefunctions instead.dispfunction --- deprecated from 2.0 release and no longer functional. Use
your own printing function instead.biasandddofarguments innumpy.corrcoef--- these had no effect
since NumPy 1.10.
(gh-29997)
Removed delimitor parameter from numpy.ma.mrecords.fromtextfile()
The delimitor parameter was deprecated in NumPy 1.22.0 and has been
removed from numpy.ma.mrecords.fromtextfile(). Use delimiter instead.
(gh-30021)
numpy.array2string and numpy.sum deprecations finalized
The following long-deprecated APIs have been removed or converted to errors:
- The
styleparameter has been removed fromnumpy.array2string.
This argument had no effect since Numpy 1.14.0. Any arguments following
it, such asformatterhave now been made keyword-only. - Calling
np.sum(generator)directly on a generator object now raises a
TypeError. This behavior was deprecated in NumPy 1.15.0. Use
np.sum(np.fromiter(generator))or the pythonsumbuiltin instead.
(gh-30068)
Compatibility notes
-
NumPy's C extension modules have begun to use multi-phase initialisation, as
defined by PEP 489. As part of this, a new explicit check has been added that
each such module is only imported once per Python process. This comes with
the side-effect that deletingnumpyfromsys.modulesand re-importing
it will now fail with anImportError. This has always been unsafe, with
unexpected side-effects, though did not previously raise an error.(gh-29030)
-
numpy.roundnow always returns a copy. Previously, it returned a view
for integer inputs fordecimals >= 0and a copy in all other cases.
This change bringsroundin line withceil,floorandtrunc.(gh-29137)
-
Type-checkers will no longer accept calls to
numpy.arangewith
startas a keyword argument. This was done for compatibility with
the Array API standard. At runtime it is still possible to use
numpy.arangewithstartas a keyword argument.(gh-30147)
-
The Macro NPY_ALIGNMENT_REQUIRED has been removed The macro was defined in
thenpy_cpu.hfile, so might be regarded as semi public. As it turns out,
with modern compilers and hardware it is almost always the case that
alignment is required, so numpy no longer uses the macro. It is unlikely
anyone uses it, but you might want to compile with the-Wundefflag or
equivalent to be sure.(gh-29094)
C API changes
The NPY_SORTKIND enum has been enhanced with new variables
This is of interest if you are using PyArray_Sort or PyArray_ArgSort.
We have changed the semantics of the old names in the NPY_SORTKIND enum and
added new ones. The changes are backward compatible, and no recompilation is
needed. The new names of interest are:
NPY_SORT_DEFAULT-- default sort (same value asNPY_QUICKSORT)NPY_SORT_STABLE-- the sort must be stable (same value asNPY_MERGESORT)NPY_SORT_DESCENDING-- the sort must be descending
The semantic change is that NPY_HEAPSORT is mapped to `NPY_QUICK...
2.3.5 (Nov 16, 2025)
NumPy 2.3.5 Release Notes
The NumPy 2.3.5 release is a patch release split between a number of maintenance
updates and bug fixes. This release supports Python versions 3.11-3.14.
Contributors
A total of 10 people contributed to this release. People with a "+" by their
names contributed a patch for the first time.
- Aaron Kollasch +
- Charles Harris
- Joren Hammudoglu
- Matti Picus
- Nathan Goldbaum
- Rafael Laboissière +
- Sayed Awad
- Sebastian Berg
- Warren Weckesser
- Yasir Ashfaq +
Pull requests merged
A total of 16 pull requests were merged for this release.
- #29979: MAINT: Prepare 2.3.x for further development
- #30026: SIMD, BLD: Backport FPMATH mode on x86-32 and filter successor...
- #30029: MAINT: Backport write_release.py
- #30041: TYP: Various typing updates
- #30059: BUG: Fix np.strings.slice if stop=None or start and stop >= len...
- #30063: BUG: Fix np.strings.slice if start > stop
- #30076: BUG: avoid negating INT_MIN in PyArray_Round implementation (#30071)
- #30090: BUG: Fix resize when it contains references (#29970)
- #30129: BLD: update scipy-openblas, use -Dpkg_config_path (#30049)
- #30130: BUG: Avoid compilation error of wrapper file generated with SWIG...
- #30157: BLD: use scipy-openblas 0.3.30.7 (#30132)
- #30158: DOC: Remove nonexistent
orderparameter docs ofma.asanyarray... - #30185: BUG: Fix check of PyMem_Calloc return value. (#30176)
- #30217: DOC: fix links for newly rebuilt numpy-tutorials site
- #30218: BUG: Fix build on s390x with clang (#30214)
- #30237: ENH: Make FPE blas check a runtime check for all apple arm systems