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
`numpy.ma.ndenumerate`. It provides an alternative to
`numpy.ndenumerate` and skips masked values by default.
([gh-20020](https://github.com/numpy/numpy/pull/20020))
- `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
object.
([gh-21145](https://github.com/numpy/numpy/pull/21145))
Deprecations
- 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
new.
([gh-20766](https://github.com/numpy/numpy/pull/20766))
- 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.
([gh-20920](https://github.com/numpy/numpy/pull/20920))
- 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`.
([gh-20394](https://github.com/numpy/numpy/pull/20394))
- `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"}.
([gh-20875](https://github.com/numpy/numpy/pull/20875))
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.
([gh-16830](https://github.com/numpy/numpy/pull/16830))
- The `alen` and `asscalar` functions have been removed.
([gh-20414](https://github.com/numpy/numpy/pull/20414))
- 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.
([gh-20589](https://github.com/numpy/numpy/pull/20589))
- 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.
([gh-20835](https://github.com/numpy/numpy/pull/20835))
- 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.
([gh-21029](https://github.com/numpy/numpy/pull/21029))
- 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.
([gh-20722](https://github.com/numpy/numpy/pull/20722))
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.
([gh-15006](https://github.com/numpy/numpy/pull/15006))
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.
([gh-15844](https://github.com/numpy/numpy/pull/15844))
New parameter `ndmin` added to `genfromtxt`
This parameter behaves the same as `ndmin` from `numpy.loadtxt`.
([gh-20500](https://github.com/numpy/numpy/pull/20500))
`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.
([gh-20580](https://github.com/numpy/numpy/pull/20580))
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
`ndarray.dtype`.
This change expires the deprecation regarding the viewing of
F-contiguous arrays, described elsewhere in the release notes.
([gh-20722](https://github.com/numpy/numpy/pull/20722))
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.
([gh-21187](https://github.com/numpy/numpy/pull/21187))
`keepdims` parameter for `average`
The parameter `keepdims` was added to the functions `numpy.average` and
`numpy.ma.average`. The parameter has the same meaning as it does in
reduction functions such as `numpy.sum` or `numpy.mean`.
([gh-21485](https://github.com/numpy/numpy/pull/21485))
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
dtype('float32')
>>> 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`.
([gh-17709](https://github.com/numpy/numpy/pull/17709))
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
`structured_dtype_comparison_and_promotion`{.interpreted-text
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
field.
- 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.
([gh-19226](https://github.com/numpy/numpy/pull/19226))
`NPY_RELAXED_STRIDES_CHECKING` has been removed
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.
([gh-20220](https://github.com/numpy/numpy/pull/20220))
`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
fail
- 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.
([gh-20580](https://github.com/numpy/numpy/pull/20580))
Improvements
`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.
([gh-20766](https://github.com/numpy/numpy/pull/20766))
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.
([gh-20821](https://github.com/numpy/numpy/pull/20821))
`np.fromiter` now accepts objects and subarrays
The `numpy.fromiter` function now supports object and subarray dtypes.
Please see he function documentation for examples.
([gh-20993](https://github.com/numpy/numpy/pull/20993))
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.
([gh-21154](https://github.com/numpy/numpy/pull/21154))
`np.kron` now maintains subclass information
`np.kron` maintains subclass information now such as masked arrays while
computing the Kronecker product of the inputs
python
>>> x = ma.array([[1, 2], [3, 4]], mask=[[0, 1], [1, 0]])
>>> np.kron(x,x)
masked_array(
data=[[1, --, --, --],
[--, 4, --, --],
[--, --, 4, --],
[--, --, --, 16]],
mask=[[False, True, True, True],
[ True, False, True, True],
[ True, True, False, True],
[ True, True, True, False]],
fill_value=999999)
:warning: Warning, `np.kron` output now follows `ufunc` ordering (`multiply`) to determine
the output class type
python
>>> class myarr(np.ndarray):
>>> __array_priority__ = -1
>>> a = np.ones([2, 2])
>>> ma = myarray(a.shape, a.dtype, a.data)
>>> type(np.kron(a, ma)) == np.ndarray
False Before it was True
>>> type(np.kron(a, ma)) == myarr
True
([gh-21262](https://github.com/numpy/numpy/pull/21262))
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.
([gh-20580](https://github.com/numpy/numpy/pull/20580))
Faster reduction operators
Reduction operations like `numpy.sum`, `numpy.prod`, `numpy.add.reduce`,
`numpy.logical_and.reduce` on contiguous integer-based arrays are now
much faster.
([gh-21001](https://github.com/numpy/numpy/pull/21001))
Faster `np.where`
`numpy.where` is now much faster than previously on unpredictable/random
input data.
([gh-21130](https://github.com/numpy/numpy/pull/21130))
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()`.
([gh-21188](https://github.com/numpy/numpy/pull/21188))
Faster `np.kron`
`numpy.kron` is about 80% faster as the product is now computed using
broadcasting.
([gh-21354](https://github.com/numpy/numpy/pull/21354))
Checksums
MD5
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
SHA256
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