colour.utilities.index_along_last_axis#

colour.utilities.index_along_last_axis(a: ArrayLike, indexes: ArrayLike) NDArray[source]#

Reduce the dimension of array \(a\) by one, using an array of indexes to select elements from the last axis.

Parameters:
  • a (ArrayLike) – Array \(a\) to be indexed.

  • indexes (ArrayLike) – Integer array with the same shape as \(a\) but with one dimension fewer, containing indices to the last dimension of \(a\). All elements must be numbers between 0 and \(m - 1\).

Returns:

Indexed array \(a\).

Return type:

numpy.ndarray

Raises:
  • ValueError – If the array \(a\) and indexes have incompatible shapes.

  • IndexError – If indexes has elements outside of the allowed range of 0 to \(m - 1\) or if it is not an integer array.

Examples

>>> a = np.array(
...     [
...         [
...             [0.3, 0.5, 6.9],
...             [3.3, 4.4, 1.6],
...             [4.4, 7.5, 2.3],
...             [2.3, 1.6, 7.4],
...         ],
...         [
...             [2.0, 5.9, 2.8],
...             [6.2, 4.9, 8.6],
...             [3.7, 9.7, 7.3],
...             [6.3, 4.3, 3.2],
...         ],
...         [
...             [0.8, 1.9, 0.7],
...             [5.6, 4.0, 1.7],
...             [6.7, 8.2, 1.7],
...             [1.2, 7.1, 1.4],
...         ],
...         [
...             [4.0, 4.8, 8.9],
...             [4.0, 0.3, 6.9],
...             [3.5, 7.1, 4.5],
...             [1.4, 1.9, 1.6],
...         ],
...     ]
... )
>>> indexes = np.array([[2, 0, 1, 1], [2, 1, 1, 0], [0, 0, 1, 2], [0, 0, 1, 2]])
>>> index_along_last_axis(a, indexes)
array([[6.9, 3.3, 7.5, 1.6],
       [2.8, 4.9, 9.7, 6.3],
       [0.8, 5.6, 8.2, 1.4],
       [4. , 4. , 7.1, 1.6]])

This function can be used to compute the result of np.min() along the last axis given the corresponding np.argmin() indexes.

>>> indexes = np.argmin(a, axis=-1)
>>> np.array_equal(index_along_last_axis(a, indexes), np.min(a, axis=-1))
True

In particular, this can be used to manipulate the indexes specified by functions like np.min() before indexing the array. For example, to get elements directly following the smallest elements:

>>> index_along_last_axis(a, (indexes + 1) % 3)
array([[0.5, 3.3, 4.4, 7.4],
       [5.9, 8.6, 9.7, 6.3],
       [0.8, 5.6, 6.7, 7.1],
       [4.8, 6.9, 7.1, 1.9]])