|
NumPy 1.9.0 Release Notes |
|
************************* |
|
|
|
This release supports Python 2.6 - 2.7 and 3.2 - 3.4. |
|
|
|
|
|
Highlights |
|
========== |
|
* Numerous performance improvements in various areas, most notably indexing and |
|
operations on small arrays are significantly faster. |
|
Indexing operations now also release the GIL. |
|
* Addition of `nanmedian` and `nanpercentile` rounds out the nanfunction set. |
|
|
|
|
|
Dropped Support |
|
=============== |
|
|
|
* The oldnumeric and numarray modules have been removed. |
|
* The doc/pyrex and doc/cython directories have been removed. |
|
* The doc/numpybook directory has been removed. |
|
* The numpy/testing/numpytest.py file has been removed together with |
|
the importall function it contained. |
|
|
|
|
|
Future Changes |
|
============== |
|
|
|
* The numpy/polynomial/polytemplate.py file will be removed in NumPy 1.10.0. |
|
* Default casting for inplace operations will change to 'same_kind' in |
|
Numpy 1.10.0. This will certainly break some code that is currently |
|
ignoring the warning. |
|
* Relaxed stride checking will be the default in 1.10.0 |
|
* String version checks will break because, e.g., '1.9' > '1.10' is True. A |
|
NumpyVersion class has been added that can be used for such comparisons. |
|
* The diagonal and diag functions will return writeable views in 1.10.0 |
|
* The `S` and/or `a` dtypes may be changed to represent Python strings |
|
instead of bytes, in Python 3 these two types are very different. |
|
|
|
|
|
Compatibility notes |
|
=================== |
|
|
|
The diagonal and diag functions return readonly views. |
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
|
In NumPy 1.8, the diagonal and diag functions returned readonly copies, in |
|
NumPy 1.9 they return readonly views, and in 1.10 they will return writeable |
|
views. |
|
|
|
Special scalar float values don't cause upcast to double anymore |
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
|
In previous numpy versions operations involving floating point scalars |
|
containing special values ``NaN``, ``Inf`` and ``-Inf`` caused the result |
|
type to be at least ``float64``. As the special values can be represented |
|
in the smallest available floating point type, the upcast is not performed |
|
anymore. |
|
|
|
For example the dtype of: |
|
|
|
``np.array([1.], dtype=np.float32) * float('nan')`` |
|
|
|
now remains ``float32`` instead of being cast to ``float64``. |
|
Operations involving non-special values have not been changed. |
|
|
|
Percentile output changes |
|
~~~~~~~~~~~~~~~~~~~~~~~~~ |
|
If given more than one percentile to compute numpy.percentile returns an |
|
array instead of a list. A single percentile still returns a scalar. The |
|
array is equivalent to converting the list returned in older versions |
|
to an array via ``np.array``. |
|
|
|
If the ``overwrite_input`` option is used the input is only partially |
|
instead of fully sorted. |
|
|
|
ndarray.tofile exception type |
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
|
All ``tofile`` exceptions are now ``IOError``, some were previously |
|
``ValueError``. |
|
|
|
Invalid fill value exceptions |
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
|
Two changes to numpy.ma.core._check_fill_value: |
|
|
|
* When the fill value is a string and the array type is not one of |
|
'OSUV', TypeError is raised instead of the default fill value being used. |
|
|
|
* When the fill value overflows the array type, TypeError is raised instead |
|
of OverflowError. |
|
|
|
Polynomial Classes no longer derived from PolyBase |
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
|
This may cause problems with folks who depended on the polynomial classes |
|
being derived from PolyBase. They are now all derived from the abstract |
|
base class ABCPolyBase. Strictly speaking, there should be a deprecation |
|
involved, but no external code making use of the old baseclass could be |
|
found. |
|
|
|
Using numpy.random.binomial may change the RNG state vs. numpy < 1.9 |
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
|
A bug in one of the algorithms to generate a binomial random variate has |
|
been fixed. This change will likely alter the number of random draws |
|
performed, and hence the sequence location will be different after a |
|
call to distribution.c::rk_binomial_btpe. Any tests which rely on the RNG |
|
being in a known state should be checked and/or updated as a result. |
|
|
|
Random seed enforced to be a 32 bit unsigned integer |
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
|
``np.random.seed`` and ``np.random.RandomState`` now throw a ``ValueError`` |
|
if the seed cannot safely be converted to 32 bit unsigned integers. |
|
Applications that now fail can be fixed by masking the higher 32 bit values to |
|
zero: ``seed = seed & 0xFFFFFFFF``. This is what is done silently in older |
|
versions so the random stream remains the same. |
|
|
|
Argmin and argmax out argument |
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
|
The ``out`` argument to ``np.argmin`` and ``np.argmax`` and their |
|
equivalent C-API functions is now checked to match the desired output shape |
|
exactly. If the check fails a ``ValueError`` instead of ``TypeError`` is |
|
raised. |
|
|
|
Einsum |
|
~~~~~~ |
|
Remove unnecessary broadcasting notation restrictions. |
|
``np.einsum('ijk,j->ijk', A, B)`` can also be written as |
|
``np.einsum('ij...,j->ij...', A, B)`` (ellipsis is no longer required on 'j') |
|
|
|
Indexing |
|
~~~~~~~~ |
|
|
|
The NumPy indexing has seen a complete rewrite in this version. This makes |
|
most advanced integer indexing operations much faster and should have no |
|
other implications. However some subtle changes and deprecations were |
|
introduced in advanced indexing operations: |
|
|
|
* Boolean indexing into scalar arrays will always return a new 1-d array. |
|
This means that ``array(1)[array(True)]`` gives ``array([1])`` and |
|
not the original array. |
|
|
|
* Advanced indexing into one dimensional arrays used to have |
|
(undocumented) special handling regarding repeating the value array in |
|
assignments when the shape of the value array was too small or did not |
|
match. Code using this will raise an error. For compatibility you can |
|
use ``arr.flat[index] = values``, which uses the old code branch. (for |
|
example ``a = np.ones(10); a[np.arange(10)] = [1, 2, 3]``) |
|
|
|
* The iteration order over advanced indexes used to be always C-order. |
|
In NumPy 1.9. the iteration order adapts to the inputs and is not |
|
guaranteed (with the exception of a *single* advanced index which is |
|
never reversed for compatibility reasons). This means that the result |
|
is undefined if multiple values are assigned to the same element. An |
|
example for this is ``arr[[0, 0], [1, 1]] = [1, 2]``, which may set |
|
``arr[0, 1]`` to either 1 or 2. |
|
|
|
* Equivalent to the iteration order, the memory layout of the advanced |
|
indexing result is adapted for faster indexing and cannot be predicted. |
|
|
|
* All indexing operations return a view or a copy. No indexing operation |
|
will return the original array object. (For example ``arr[...]``) |
|
|
|
* In the future Boolean array-likes (such as lists of python bools) will |
|
always be treated as Boolean indexes and Boolean scalars (including |
|
python ``True``) will be a legal *boolean* index. At this time, this is |
|
already the case for scalar arrays to allow the general |
|
``positive = a[a > 0]`` to work when ``a`` is zero dimensional. |
|
|
|
* In NumPy 1.8 it was possible to use ``array(True)`` and |
|
``array(False)`` equivalent to 1 and 0 if the result of the operation |
|
was a scalar. This will raise an error in NumPy 1.9 and, as noted |
|
above, treated as a boolean index in the future. |
|
|
|
* All non-integer array-likes are deprecated, object arrays of custom |
|
integer like objects may have to be cast explicitly. |
|
|
|
* The error reporting for advanced indexing is more informative, however |
|
the error type has changed in some cases. (Broadcasting errors of |
|
indexing arrays are reported as ``IndexError``) |
|
|
|
* Indexing with more then one ellipsis (``...``) is deprecated. |
|
|
|
Non-integer reduction axis indexes are deprecated |
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
|
Non-integer axis indexes to reduction ufuncs like `add.reduce` or `sum` are |
|
deprecated. |
|
|
|
``promote_types`` and string dtype |
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
|
``promote_types`` function now returns a valid string length when given an |
|
integer or float dtype as one argument and a string dtype as another |
|
argument. Previously it always returned the input string dtype, even if it |
|
wasn't long enough to store the max integer/float value converted to a |
|
string. |
|
|
|
``can_cast`` and string dtype |
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
|
``can_cast`` function now returns False in "safe" casting mode for |
|
integer/float dtype and string dtype if the string dtype length is not long |
|
enough to store the max integer/float value converted to a string. |
|
Previously ``can_cast`` in "safe" mode returned True for integer/float |
|
dtype and a string dtype of any length. |
|
|
|
astype and string dtype |
|
~~~~~~~~~~~~~~~~~~~~~~~ |
|
The ``astype`` method now returns an error if the string dtype to cast to |
|
is not long enough in "safe" casting mode to hold the max value of |
|
integer/float array that is being casted. Previously the casting was |
|
allowed even if the result was truncated. |
|
|
|
`npyio.recfromcsv` keyword arguments change |
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
|
`npyio.recfromcsv` no longer accepts the undocumented `update` keyword, |
|
which used to override the `dtype` keyword. |
|
|
|
The ``doc/swig`` directory moved |
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
|
The ``doc/swig`` directory has been moved to ``tools/swig``. |
|
|
|
The ``npy_3kcompat.h`` header changed |
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
|
The unused ``simple_capsule_dtor`` function has been removed from |
|
``npy_3kcompat.h``. Note that this header is not meant to be used outside |
|
of numpy; other projects should be using their own copy of this file when |
|
needed. |
|
|
|
Negative indices in C-Api ``sq_item`` and ``sq_ass_item`` sequence methods |
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
|
When directly accessing the ``sq_item`` or ``sq_ass_item`` PyObject slots |
|
for item getting, negative indices will not be supported anymore. |
|
``PySequence_GetItem`` and ``PySequence_SetItem`` however fix negative |
|
indices so that they can be used there. |
|
|
|
NDIter |
|
~~~~~~ |
|
When ``NpyIter_RemoveAxis`` is now called, the iterator range will be reset. |
|
|
|
When a multi index is being tracked and an iterator is not buffered, it is |
|
possible to use ``NpyIter_RemoveAxis``. In this case an iterator can shrink |
|
in size. Because the total size of an iterator is limited, the iterator |
|
may be too large before these calls. In this case its size will be set to ``-1`` |
|
and an error issued not at construction time but when removing the multi |
|
index, setting the iterator range, or getting the next function. |
|
|
|
This has no effect on currently working code, but highlights the necessity |
|
of checking for an error return if these conditions can occur. In most |
|
cases the arrays being iterated are as large as the iterator so that such |
|
a problem cannot occur. |
|
|
|
This change was already applied to the 1.8.1 release. |
|
|
|
``zeros_like`` for string dtypes now returns empty strings |
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
|
To match the `zeros` function `zeros_like` now returns an array initialized |
|
with empty strings instead of an array filled with `'0'`. |
|
|
|
|
|
New Features |
|
============ |
|
|
|
Percentile supports more interpolation options |
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
|
``np.percentile`` now has the interpolation keyword argument to specify in |
|
which way points should be interpolated if the percentiles fall between two |
|
values. See the documentation for the available options. |
|
|
|
Generalized axis support for median and percentile |
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
|
``np.median`` and ``np.percentile`` now support generalized axis arguments like |
|
ufunc reductions do since 1.7. One can now say axis=(index, index) to pick a |
|
list of axes for the reduction. The ``keepdims`` keyword argument was also |
|
added to allow convenient broadcasting to arrays of the original shape. |
|
|
|
Dtype parameter added to ``np.linspace`` and ``np.logspace`` |
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
|
The returned data type from the ``linspace`` and ``logspace`` functions can |
|
now be specified using the dtype parameter. |
|
|
|
More general ``np.triu`` and ``np.tril`` broadcasting |
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
|
For arrays with ``ndim`` exceeding 2, these functions will now apply to the |
|
final two axes instead of raising an exception. |
|
|
|
``tobytes`` alias for ``tostring`` method |
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
|
``ndarray.tobytes`` and ``MaskedArray.tobytes`` have been added as aliases |
|
for ``tostring`` which exports arrays as ``bytes``. This is more consistent |
|
in Python 3 where ``str`` and ``bytes`` are not the same. |
|
|
|
Build system |
|
~~~~~~~~~~~~ |
|
Added experimental support for the ppc64le and OpenRISC architecture. |
|
|
|
Compatibility to python ``numbers`` module |
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
|
All numerical numpy types are now registered with the type hierarchy in |
|
the python ``numbers`` module. |
|
|
|
``increasing`` parameter added to ``np.vander`` |
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
|
The ordering of the columns of the Vandermonde matrix can be specified with |
|
this new boolean argument. |
|
|
|
``unique_counts`` parameter added to ``np.unique`` |
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
|
The number of times each unique item comes up in the input can now be |
|
obtained as an optional return value. |
|
|
|
Support for median and percentile in nanfunctions |
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
|
The ``np.nanmedian`` and ``np.nanpercentile`` functions behave like |
|
the median and percentile functions except that NaNs are ignored. |
|
|
|
NumpyVersion class added |
|
~~~~~~~~~~~~~~~~~~~~~~~~ |
|
The class may be imported from numpy.lib and can be used for version |
|
comparison when the numpy version goes to 1.10.devel. For example:: |
|
|
|
>>> from numpy.lib import NumpyVersion |
|
>>> if NumpyVersion(np.__version__) < '1.10.0'): |
|
... print('Wow, that is an old NumPy version!') |
|
|
|
Allow saving arrays with large number of named columns |
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
|
The numpy storage format 1.0 only allowed the array header to have a total size |
|
of 65535 bytes. This can be exceeded by structured arrays with a large number |
|
of columns. A new format 2.0 has been added which extends the header size to 4 |
|
GiB. `np.save` will automatically save in 2.0 format if the data requires it, |
|
else it will always use the more compatible 1.0 format. |
|
|
|
Full broadcasting support for ``np.cross`` |
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
|
``np.cross`` now properly broadcasts its two input arrays, even if they |
|
have different number of dimensions. In earlier versions this would result |
|
in either an error being raised, or wrong results computed. |
|
|
|
|
|
Improvements |
|
============ |
|
|
|
Better numerical stability for sum in some cases |
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
|
Pairwise summation is now used in the sum method, but only along the fast |
|
axis and for groups of the values <= 8192 in length. This should also |
|
improve the accuracy of var and std in some common cases. |
|
|
|
Percentile implemented in terms of ``np.partition`` |
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
|
``np.percentile`` has been implemented in terms of ``np.partition`` which |
|
only partially sorts the data via a selection algorithm. This improves the |
|
time complexity from ``O(nlog(n))`` to ``O(n)``. |
|
|
|
Performance improvement for ``np.array`` |
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
|
The performance of converting lists containing arrays to arrays using |
|
``np.array`` has been improved. It is now equivalent in speed to |
|
``np.vstack(list)``. |
|
|
|
Performance improvement for ``np.searchsorted`` |
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
|
For the built-in numeric types, ``np.searchsorted`` no longer relies on the |
|
data type's ``compare`` function to perform the search, but is now |
|
implemented by type specific functions. Depending on the size of the |
|
inputs, this can result in performance improvements over 2x. |
|
|
|
Optional reduced verbosity for np.distutils |
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
|
Set ``numpy.distutils.system_info.system_info.verbosity = 0`` and then |
|
calls to ``numpy.distutils.system_info.get_info('blas_opt')`` will not |
|
print anything on the output. This is mostly for other packages using |
|
numpy.distutils. |
|
|
|
Covariance check in ``np.random.multivariate_normal`` |
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
|
A ``RuntimeWarning`` warning is raised when the covariance matrix is not |
|
positive-semidefinite. |
|
|
|
Polynomial Classes no longer template based |
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
|
The polynomial classes have been refactored to use an abstract base class |
|
rather than a template in order to implement a common interface. This makes |
|
importing the polynomial package faster as the classes do not need to be |
|
compiled on import. |
|
|
|
More GIL releases |
|
~~~~~~~~~~~~~~~~~ |
|
Several more functions now release the Global Interpreter Lock allowing more |
|
efficient parallization using the ``threading`` module. Most notably the GIL is |
|
now released for fancy indexing, ``np.where`` and the ``random`` module now |
|
uses a per-state lock instead of the GIL. |
|
|
|
MaskedArray support for more complicated base classes |
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
|
Built-in assumptions that the baseclass behaved like a plain array are being |
|
removed. In particalur, ``repr`` and ``str`` should now work more reliably. |
|
|
|
|
|
C-API |
|
~~~~~ |
|
|
|
|
|
Deprecations |
|
============ |
|
|
|
Non-integer scalars for sequence repetition |
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
|
Using non-integer numpy scalars to repeat python sequences is deprecated. |
|
For example ``np.float_(2) * [1]`` will be an error in the future. |
|
|
|
``select`` input deprecations |
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
|
The integer and empty input to ``select`` is deprecated. In the future only |
|
boolean arrays will be valid conditions and an empty ``condlist`` will be |
|
considered an input error instead of returning the default. |
|
|
|
``rank`` function |
|
~~~~~~~~~~~~~~~~~ |
|
The ``rank`` function has been deprecated to avoid confusion with |
|
``numpy.linalg.matrix_rank``. |
|
|
|
Object array equality comparisons |
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
|
In the future object array comparisons both `==` and `np.equal` will not |
|
make use of identity checks anymore. For example: |
|
|
|
>>> a = np.array([np.array([1, 2, 3]), 1]) |
|
>>> b = np.array([np.array([1, 2, 3]), 1]) |
|
>>> a == b |
|
|
|
will consistently return False (and in the future an error) even if the array |
|
in `a` and `b` was the same object. |
|
|
|
The equality operator `==` will in the future raise errors like `np.equal` |
|
if broadcasting or element comparisons, etc. fails. |
|
|
|
Comparison with `arr == None` will in the future do an elementwise comparison |
|
instead of just returning False. Code should be using `arr is None`. |
|
|
|
All of these changes will give Deprecation- or FutureWarnings at this time. |
|
|
|
C-API |
|
~~~~~ |
|
|
|
The utility function npy_PyFile_Dup and npy_PyFile_DupClose are broken by the |
|
internal buffering python 3 applies to its file objects. |
|
To fix this two new functions npy_PyFile_Dup2 and npy_PyFile_DupClose2 are |
|
declared in npy_3kcompat.h and the old functions are deprecated. |
|
Due to the fragile nature of these functions it is recommended to instead use |
|
the python API when possible. |
|
|
|
This change was already applied to the 1.8.1 release. |
|
|