github numpy/numpy v1.23.0rc1

latest releases: v1.23.0, v1.23.0rc3, v1.23.0rc2...
pre-releaseone month ago

NumPy 1.23.0 Release Notes

The NumPy 1.23.0 release continues the ongoing work to improve the
handling and promotion of dtypes, increase the execution speed, clarify
the documentation, and expire old deprecations. The highlights are:

  • Implementation of loadtxt in C, greatly improving its performance.
  • Exposing DLPack at the Python level for easy data exchange.
  • Changes to the promotion and comparisons of structured dtypes.
  • Improvements to f2py.

See below for the details,

New functions

  • A masked array specialization of ndenumerate is now available as It provides an alternative to
    numpy.ndenumerate and skips masked values by default.


  • numpy.from_dlpack has been added to allow easy exchange of data
    using the DLPack protocol. It accepts Python objects that implement
    the __dlpack__ and __dlpack_device__ methods and returns a
    ndarray object which is generally the view of the data of the input



  • Setting __array_finalize__ to None is deprecated. It must now be
    a method and may wish to call super().__array_finalize__(obj)
    after checking for None or if the NumPy version is sufficiently


  • Using axis=32 (axis=np.MAXDIMS) in many cases had the same
    meaning as axis=None. This is deprecated and axis=None must be
    used instead.


  • The hook function PyDataMem_SetEventHook has been deprecated and
    the demonstration of its use in tool/allocation_tracking has been
    removed. The ability to track allocations is now built-in to python
    via tracemalloc.


  • numpy.distutils has been deprecated, as a result of distutils
    itself being deprecated. It will not be present in NumPy for
    Python >= 3.12, and will be removed completely 2 years after the
    release of Python 3.12 For more details, see
    distutils-status-migration{.interpreted-text role="ref"}.


Expired deprecations

  • The NpzFile.iteritems() and NpzFile.iterkeys() methods have been
    removed as part of the continued removal of Python 2 compatibility.
    This concludes the deprecation from 1.15.


  • The alen and asscalar functions have been removed.


  • The UPDATEIFCOPY array flag has been removed together with the
    enum NPY_ARRAY_UPDATEIFCOPY. The associated (and deprecated)
    PyArray_XDECREF_ERR was also removed. These were all deprecated in
    1.14. They are replaced by WRITEBACKIFCOPY, that requires calling
    PyArray_ResoveWritebackIfCopy before the array is deallocated.


  • Exceptions will be raised during array-like creation. When an object
    raised an exception during access of the special attributes
    __array__ or __array_interface__, this exception was usually
    ignored. This behaviour was deprecated in 1.21, and the exception
    will now be raised.


  • Multidimensional indexing with non-tuple values is not allowed.
    Previously, code such as arr[ind] where ind = [[0, 1], [0, 1]]
    produced a FutureWarning and was interpreted as a multidimensional
    index (i.e., arr[tuple(ind)]). Now this example is treated like an
    array index over a single dimension (arr[array(ind)]).
    Multidimensional indexing with anything but a tuple was deprecated
    in NumPy 1.15.


  • Changing to a dtype of different size in F-contiguous arrays is no
    longer permitted. Deprecated since Numpy 1.11.0. See below for an
    extended explanation of the effects of this change.


New Features

crackfortran has support for operator and assignment overloading

crackfortran parser now understands operator and assignment
definitions in a module. They are added in the body list of the module
which contains a new key implementedby listing the names of the
subroutines or functions implementing the operator or assignment.


f2py supports reading access type attributes from derived type statements

As a result, one does not need to use public or private statements
to specify derived type access properties.


New parameter ndmin added to genfromtxt

This parameter behaves the same as ndmin from numpy.loadtxt.


np.loadtxt now supports quote character and single converter function

numpy.loadtxt now supports an additional quotechar keyword argument
which is not set by default. Using quotechar='"' will read quoted
fields as used by the Excel CSV dialect.

Further, it is now possible to pass a single callable rather than a
dictionary for the converters argument.


Changing to dtype of a different size now requires contiguity of only the last axis

Previously, viewing an array with a dtype of a different item size
required that the entire array be C-contiguous. This limitation would
unnecessarily force the user to make contiguous copies of non-contiguous
arrays before being able to change the dtype.

This change affects not only ndarray.view, but other construction
mechanisms, including the discouraged direct assignment to

This change expires the deprecation regarding the viewing of
F-contiguous arrays, described elsewhere in the release notes.


Deterministic output files for F2PY

For F77 inputs, f2py will generate modname-f2pywrappers.f
unconditionally, though these may be empty. For free-form inputs,
modname-f2pywrappers.f, modname-f2pywrappers2.f90 will both be
generated unconditionally, and may be empty. This allows writing generic
output rules in cmake or meson and other build systems. Older
behavior can be restored by passing --skip-empty-wrappers to f2py.
f2py-meson{.interpreted-text role="ref"} details usage.


keepdims parameter for average

The parameter keepdims was added to the functions numpy.average and The parameter has the same meaning as it does in
reduction functions such as numpy.sum or numpy.mean.


Compatibility notes

1D np.linalg.norm preserves float input types, even for scalar results

Previously, this would promote to float64 when the ord argument was
not one of the explicitly listed values, e.g. ord=3:

>>> f32 = np.float32([1, 2])
>>> np.linalg.norm(f32, 2).dtype
>>> np.linalg.norm(f32, 3)
dtype('float64')  # numpy 1.22
dtype('float32')  # numpy 1.23

This change affects only float32 and float16 vectors with ord
other than -Inf, 0, 1, 2, and Inf.


Changes to structured (void) dtype promotion and comparisons

In general, NumPy now defines correct, but slightly limited, promotion
for structured dtypes by promoting the subtypes of each field instead of
raising an exception:

>>> np.result_type(np.dtype("i,i"), np.dtype("i,d"))
dtype([('f0', '<i4'), ('f1', '<f8')])

For promotion matching field names, order, and titles are enforced,
however padding is ignored. Promotion involving structured dtypes now
always ensures native byte-order for all fields (which may change the
result of np.concatenate) and ensures that the result will be
"packed", i.e. all fields are ordered contiguously and padding is
removed. See
role="ref"} for further details.

The repr of aligned structures will now never print the long form
including offsets and itemsize unless the structure includes padding
not guaranteed by align=True.

In alignment with the above changes to the promotion logic, the casting
safety has been updated:

  • "equiv" enforces matching names and titles. The itemsize is
    allowed to differ due to padding.
  • "safe" allows mismatching field names and titles
  • The cast safety is limited by the cast safety of each included
  • The order of fields is used to decide cast safety of each individual
    field. Previously, the field names were used and only unsafe casts
    were possible when names mismatched.

The main important change here is that name mismatches are now
considered "safe" casts.



NumPy cannot be compiled with NPY_RELAXED_STRIDES_CHECKING=0 anymore.
Relaxed strides have been the default for many years and the option was
initially introduced to allow a smoother transition.


np.loadtxt has recieved several changes

The row counting of numpy.loadtxt was fixed. loadtxt ignores fully
empty lines in the file, but counted them towards max_rows. When
max_rows is used and the file contains empty lines, these will now not
be counted. Previously, it was possible that the result contained fewer
than max_rows rows even though more data was available to be read. If
the old behaviour is required, itertools.islice may be used:

import itertools
lines = itertools.islice(open("file"), 0, max_rows)
result = np.loadtxt(lines, ...)

While generally much faster and improved, numpy.loadtxt may now fail
to converter certain strings to numbers that were previously
successfully read. The most important cases for this are:

  • Parsing floating point values such as 1.0 into integers will now
  • Parsing hexadecimal floats such as 0x3p3 will fail
  • An _ was previously accepted as a thousands delimiter 100_000.
    This will now result in an error.

If you experience these limitations, they can all be worked around by
passing appropriate converters=. NumPy now supports passing a single
converter to be used for all columns to make this more convenient. For
example, converters=float.fromhex can read hexadecimal float numbers
and converters=int will be able to read 100_000.

Further, the error messages have been generally improved. However, this
means that error types may differ. In particularly, a ValueError is
now always raised when parsing of a single entry fails.



ndarray.__array_finalize__ is now callable

This means subclasses can now use super().__array_finalize__(obj)
without worrying whether ndarray is their superclass or not. The
actual call remains a no-op.


Add support for VSX4/Power10

With VSX4/Power10 enablement, the new instructions available in Power
ISA 3.1 can be used to accelerate some NumPy operations, e.g.,
floor_divide, modulo, etc.


np.fromiter now accepts objects and subarrays

The numpy.fromiter function now supports object and subarray dtypes.
Please see he function documentation for examples.


Math C library feature detection now uses correct signatures

Compiling is preceded by a detection phase to determine whether the
underlying libc supports certain math operations. Previously this code
did not respect the proper signatures. Fixing this enables compilation
for the wasm-ld backend (compilation for web assembly) and reduces the
number of warnings.


np.kron now maintains subclass information

np.kron maintains subclass information now such as masked arrays while
computing the Kronecker product of the inputs

>>> x = ma.array([[1, 2], [3, 4]], mask=[[0, 1], [1, 0]])
>>> np.kron(x,x)
  data=[[1, --, --, --],
        [--, 4, --, --],
        [--, --, 4, --],
        [--, --, --, 16]],
  mask=[[False,  True,  True,  True],
        [ True, False,  True,  True],
        [ True,  True, False,  True],
        [ True,  True,  True, False]],

⚠️ Warning, np.kron output now follows ufunc ordering (multiply) to determine
the output class type

>>> class myarr(np.ndarray):
>>>    __array_priority__ = -1
>>> a = np.ones([2, 2])
>>> ma = myarray(a.shape, a.dtype,
>>> type(np.kron(a, ma)) == np.ndarray
False # Before it was True
>>> type(np.kron(a, ma)) == myarr


Performance improvements and changes

Faster np.loadtxt

numpy.loadtxt is now generally much faster than previously as most of
it is now implemented in C.


Faster reduction operators

Reduction operations like numpy.sum,, numpy.add.reduce,
numpy.logical_and.reduce on contiguous integer-based arrays are now
much faster.


Faster np.where

numpy.where is now much faster than previously on unpredictable/random
input data.


Faster operations on NumPy scalars

Many operations on NumPy scalars are now significantly faster, although
rare operations (e.g. with 0-D arrays rather than scalars) may be slower
in some cases. However, even with these improvements users who want the
best performance for their scalars, may want to convert a known NumPy
scalar into a Python one using scalar.item().


Faster np.kron

numpy.kron is about 80% faster as the product is now computed using




c67b4cc1de8a0753bc65765a508aa0e3  numpy-1.23.0rc1-cp310-cp310-macosx_10_9_x86_64.whl
9daceb162c46298986b5fceb13f10e54  numpy-1.23.0rc1-cp310-cp310-macosx_11_0_arm64.whl
ac07046b70001710d8d3243d9b5d0389  numpy-1.23.0rc1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
14269d197cd6aac02655d43aa10ba108  numpy-1.23.0rc1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
ba5fc5cd776549afc353e0043f6c6f5a  numpy-1.23.0rc1-cp310-cp310-win32.whl
0e1b00f156f32aabde1e29607c709a24  numpy-1.23.0rc1-cp310-cp310-win_amd64.whl
34b5a9f3abeb9f6e9c6fbd494305d53d  numpy-1.23.0rc1-cp38-cp38-macosx_10_9_x86_64.whl
bb825cf372822daad1e440577e324042  numpy-1.23.0rc1-cp38-cp38-macosx_11_0_arm64.whl
45296e6b41691c4265c90562c94254aa  numpy-1.23.0rc1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
b10b131e5c0576629ab99829301d6fba  numpy-1.23.0rc1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
bc6210254087b73715d8c6a79dafa3b8  numpy-1.23.0rc1-cp38-cp38-win32.whl
d9b7fb5a539a738309a717051f13e41a  numpy-1.23.0rc1-cp38-cp38-win_amd64.whl
d2cec33489c96dfc489bb00353d351fe  numpy-1.23.0rc1-cp39-cp39-macosx_10_9_x86_64.whl
e4982f3bf3d4acab67cb61d3d0e2f85b  numpy-1.23.0rc1-cp39-cp39-macosx_11_0_arm64.whl
781a79ea9f1683a579a1ef27d809a8e0  numpy-1.23.0rc1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
8c03ea50c2baa172e8252d10dea73498  numpy-1.23.0rc1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
61829dec0785cf72b8f5bc92dc44d828  numpy-1.23.0rc1-cp39-cp39-win32.whl
94c7c971ed5eedb1b61a09bcfc123617  numpy-1.23.0rc1-cp39-cp39-win_amd64.whl
b5c6f674b468e7fc513882563391efec  numpy-1.23.0rc1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl
41ab4b757478c8e244018c37bcb52bb3  numpy-1.23.0rc1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
f2082734772a6a7afbe3568e7b2ad458  numpy-1.23.0rc1-pp38-pypy38_pp73-win_amd64.whl
faf6a08cda5696b96acb670c433495e5  numpy-1.23.0rc1.tar.gz


a72607e12891615a314a892f8d21301b930f211841f0084d269baa1eb31710b4  numpy-1.23.0rc1-cp310-cp310-macosx_10_9_x86_64.whl
4784a81089c75a941dcc013b09290dfb22768780a1f3525667328d09a3338116  numpy-1.23.0rc1-cp310-cp310-macosx_11_0_arm64.whl
d4ebdeb0e2a57bbd28c3258a562ee011775127427eea833613744af1a66c3e11  numpy-1.23.0rc1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
a2dfb54cb1c6470918a3c02da77706f28977cb7eac4b76cc40b14942c8634615  numpy-1.23.0rc1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
1567c488f9ef97341c5937b4140a45ac37e0592c43ba2c59d3e49ff7d5da90b0  numpy-1.23.0rc1-cp310-cp310-win32.whl
78df1fc2ddf543508b5358dd24ac68ee693599e5df0d136062b9ec21ba7643cf  numpy-1.23.0rc1-cp310-cp310-win_amd64.whl
020c6d8476fced48f42629f46996af8a07bc725cb821081205c4422eacaa2283  numpy-1.23.0rc1-cp38-cp38-macosx_10_9_x86_64.whl
efd26eecd1ada0c8dadc5b221c52086ccc72e4cb0707e451889ef3b62c14163c  numpy-1.23.0rc1-cp38-cp38-macosx_11_0_arm64.whl
8cf3f61984777a830eef452d8b04338795691949214e6cafc46c5236900cd1f5  numpy-1.23.0rc1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
96738ae39db010502564325ce2f4aff4f42b75adf64f3ccb2b19214e9be1c01c  numpy-1.23.0rc1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
33b233f59d9430a27c2a58a056f32259eadf9584f41c6ec02c493c3aeb90f844  numpy-1.23.0rc1-cp38-cp38-win32.whl
edf0a82d285e18418e3915fece2cf0f4f31e84fe62271331fbaafbbc7d57e9ee  numpy-1.23.0rc1-cp38-cp38-win_amd64.whl
a71f1602bf84d0a2fb5d586a2d8c31f29fbca9253ae1eecf46b7059fa265eb79  numpy-1.23.0rc1-cp39-cp39-macosx_10_9_x86_64.whl
05000d27fd135dd0aab90acaf96652991c070dda688739097ac2dea92189f9f0  numpy-1.23.0rc1-cp39-cp39-macosx_11_0_arm64.whl
ebe07758ac3e7402290f43d379f6d79d81a247488561743490cf2e5b64351ba6  numpy-1.23.0rc1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
3cd05784cdcd09114c2f6186bb99af7f5ee65ffd720dae9990722a94309b17ea  numpy-1.23.0rc1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
6ccb79435d4501b35ed3d807e1bf7345e42f68b25fbf720ade9c74c7196360f9  numpy-1.23.0rc1-cp39-cp39-win32.whl
a8fbe61e09565fa2f7bca076627ea0efbf50ab689c35af5082c5d94fb24b30ee  numpy-1.23.0rc1-cp39-cp39-win_amd64.whl
7a45352476e92c1958ce513fa84b508d59dd8e6ffe0e6f6cceebfc0f3c06d086  numpy-1.23.0rc1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl
4f15768493ecf23c5d82e5542642a36764e551c7744781268c7c221f26c7ffd6  numpy-1.23.0rc1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
edf0b720c8ba3d35b23c71c0cd13df34290be87b42f0e10d0ec2f1639cda2692  numpy-1.23.0rc1-pp38-pypy38_pp73-win_amd64.whl
3a09d0f564f59b6da54f592909d3fdbd50b492ef9fbe6d699043c992538ba0e0  numpy-1.23.0rc1.tar.gz

Don't miss a new numpy release

NewReleases is sending notifications on new releases.