2016-02-05 2 views
3

У меня есть два массива numpy, первый, A, будучи одномерным, второй, B, является двумерным в приложении, которое я имею в виду, но на самом деле может иметь какое-либо измерение. Каждый индекс B охватывает тот же диапазон, что и единственный индекс A.Сортировка массива NumPy и перестановка другого вместе с ним

Теперь я хотел бы сортировать A (в порядке убывания), но хотел бы переставить все измерения B вместе с ним. Математически говоря, если P является матрицей перестановок, которая сортирует A, я хотел бы преобразовать B в соответствии с np.dot(P, np.dot(B, P.T)). Например. Рассмотрим следующий пример, где сортировка по совпадению соответствует обратном порядке:

In [1]: import numpy as np 

In [2]: A = np.array([1,2,3]) 

In [3]: B = np.random.rand(3,3); B 
Out[3]: 
array([[ 0.67402953, 0.45017072, 0.24324747], 
     [ 0.40559793, 0.79007712, 0.94247771], 
     [ 0.47477422, 0.27599007, 0.13941255]]) 

In [4]: # desired output: 

In [5]: A[::-1] 
Out[5]: array([3, 2, 1]) 

In [6]: B[::-1,::-1] 
Out[6]: 
array([[ 0.13941255, 0.27599007, 0.47477422], 
     [ 0.94247771, 0.79007712, 0.40559793], 
     [ 0.24324747, 0.45017072, 0.67402953]]) 

Приложение Я имею в виду, чтобы получить собственные значения и собственные векторы несимметричной матрицы с использованием np.linalg.eig (в отличие от eigh, eig не гарантирует упорядоченность собственные значения), сортировать их по абсолютной величине и обрезать пространство. Было бы полезно переставить компоненты матрицы, удерживающие собственные векторы, вместе с собственными значениями и выполнить усечение, разрезая его.

ответ

3

Вы можете использовать np.argsort, чтобы получить отсортированные индексы A. Затем вы можете использовать эти индексы для перегруппировки B.

Это не совсем ИКПБ, как вы хотите изменить B ...

p = np.argsort(A) 

B[:, p][p, :] # rearrange rows and column of B 
B.transpose(p) # rearrange dimensions of B 

Если вы хотите заказать собственные векторы в соответствии с собственными значениями, вы должны только переставить столбцы собственных векторов: (Кроме того, это может иметь смысл использовать абсолютное значение, в этом случае вы получите комплексные собственные значения)

e, v = eig(x) 
p = np.argsort(np.abs(e))[::-1] # descending order 
v = v[:, p] 
+0

вы правы, конечно, что мне нужно только переставить столбцы матрицы собственных векторов. Спасибо, что указали это тоже. – Jonas

1

Вы можете использовать numpy.argsort, чтобы получить отображение индекса. Например:

test=np.array([2,1,3]) 
test_array=np.array([[2,3,4],[1,2,3]]) 
rearranged_array=test_array[:,test.argsort()] 

Здесь test.argsort() дает [1,0,2].

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