numpy.unravel_index

numpy.unravel_index(indices, shape, order='C')

Функция unravel_index() преобразует плоский массив индексов в кортеж массивов индексов.

Данная функция позволяет получить индексы элементов многомерного массива по индексам тех же самых элементов в его плоском представлении. По сути, это обратная функция к ravel_multi_index().

Параметры:
indices - массив NumPy или массивоподобный объект.
Индексы элементов в плоском представлении массива. До версии 1.6.0. данный параметр принимал только одно число - индекс одного элемента.
shape - кортеж целых чисел.
Определяет форму многомерного массива, в котором нужно найти индексы элементов указанных в indices его плоского представления.
order - {'C', 'F'} (необязательный параметр).
Определяет то каким образом рассматривать исходный массив, если 'C' - то это стандартный (уже привычный) массив данные в котором хранятся в строковом порядке (C-стиле), если 'F' - то это массив в столбчатом стиле Fortran.
Возвращает:
tuple - кортеж массивов NumPy
кортеж массивов с индексами элементов многомерного массива, которые соответствуют тем же самым элементам в его одномерном представлении.
Смотрите так же:
ravel_multi_index flat, flatten, ravel


Примеры

Допустим у нас есть одномерный массив и мы индексируем его следующим образом:

>>> import numpy as np
>>> 
>>> a = np.arange(0, 24, 2)
>>> a
array([ 0,  2,  4, ..., 18, 20, 22])
>>> 
>>> a[[1, 4, 7]]
array([ 2,  8, 14])

Теперь, представим, что по какой то причине этот массив стал двумерным:

>>> b = a.reshape(3, 4)
>>> b
array([[ 0,  2,  4,  6],
       [ 8, 10, 12, 14],
       [16, 18, 20, 22]])

Какими должны быть индексы элементов нового, двумерного массива, что бы вытащить из него те же самые элементы? Именно на этот вопрос и отвечает функция unravel_index:

>>> ind = np.unravel_index([1, 4, 7], (3, 4))
>>> ind
(array([0, 1, 1], dtype=int32), array([1, 0, 3], dtype=int32))
>>> 
>>> b[ind]
array([ 2,  8, 14])

Мы так же можем узнать индекс всего одного элемента:

>>> a[11]
22
>>> 
>>> ind = np.unravel_index(11, (3, 4))
>>> ind
(2, 3)
>>> 
>>> b[ind]
22

Очень редко, но все же приходится иметь дело с Fortran кодом, в котором массивы хранятся в столбчатом стиле. А в этом стиле строки являются столбцами а столбцы строками. Что бы индексировать такие массивы достаточно установить соответствующий флаг в параметре order:

>>> np.unravel_index([0, 3, 8], (3, 4))
(array([0, 0, 2], dtype=int32), array([0, 3, 0], dtype=int32))
>>> 
>>> np.unravel_index([0, 3, 8], (3, 4), order = 'F')
(array([0, 0, 2], dtype=int32), array([0, 1, 2], dtype=int32))