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
- кортеж массивов с индексами элементов многомерного массива, которые соответствуют тем же самым элементам в его одномерном представлении.
Примеры
Допустим у нас есть одномерный массив и мы индексируем его следующим образом:
>>> 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))