2016-04-14 2 views
1

У меня есть ndmatrix в numpy (n x n x n), которую я вектурирую, чтобы сделать некоторую выборку моих данных определенным образом, давая мне (1 x n^3).Как найти индексы векторизованной матрицы numpy

Я хотел бы взять отдельные векторизованные индексы и преобразовать их обратно в n-мерные индексы в форме (n x n x n). Я не уверен, как ухабистый фактически векторизовать матрицы.

Может ли кто-нибудь посоветовать?

+1

Я думаю, что это будет зависеть от способа вывода '(1, п^3) 'сохраняется для восстановления обратно в желаемый формат вывода. – Divakar

+0

да, это моя проблема. Я просто использую nd.reshape для векторизации матрицы, но на самом деле я не уверен, в каком порядке они хранятся. – JB1

ответ

4

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') 
+0

Спасибо! И я немного узнал о конвенции C и Fortran на этом пути! – JB1

Смежные вопросы