Numpy имеет функцию unravel_index
, которая делает довольно много, что: данный набор «плоских» индексов, он возвращает кортеж массивов индексов в каждом измерении:
>>> indices = np.arange(25, dtype=int)
>>> np.unravel_index(indices, (5, 5))
(array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4,
4, 4], dtype=int64),
array([0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2,
3, 4], dtype=int64))
Вы можете затем zip
их получите исходные индексы.
Следует помнить, что матрицы могут быть представлены как «последовательности строк» (соглашение C, 'C'
) или «последовательность столбцов» (соглашение Fortran, 'F'
) или соответствующее соглашение в более высоких измерениях. Типичное сглаживание матриц в numpy сохранит этот порядок, так что [[1, 2], [3, 4]]
можно сплющить до [1, 2, 3, 4]
(если у него есть «C») или [1, 3, 2, 4]
(если у него есть «F»). unravel_index
принимает необязательный order
параметр, если вы хотите изменить значение по умолчанию (который является «C»), так что вы можете сделать:
>>> # Typically, transposition will change the order for
>>> # efficiency reasons: no need to change the data !
>>> n = np.random.random((2, 2, 2)).transpose()
>>> n.flags.f_contiguous
True
>>> n.flags.c_contiguous
False
>>> x, y, z = np.unravel_index([1,2,3,7], (2, 2, 2), order='F')
Я думаю, что это будет зависеть от способа вывода '(1, п^3) 'сохраняется для восстановления обратно в желаемый формат вывода. – Divakar
да, это моя проблема. Я просто использую nd.reshape для векторизации матрицы, но на самом деле я не уверен, в каком порядке они хранятся. – JB1