[Numpy-discussion] Indexing changes in 1.9

Charles R Harris charlesr.harris at gmail.com
Sun Feb 2 12:06:57 EST 2014


Sebastian has done a lot of work to refactor/rationalize numpy indexing.
The changes are extensive enough that it would be good to have more public
review, so here is the release note.

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.
>   * 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.
>   * 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.
>

Thoughts?

Chuck
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/numpy-discussion/attachments/20140202/105d704b/attachment.html>


More information about the NumPy-Discussion mailing list