对特征值和特征向量进行排序

时间:2017-11-07 22:14:58

标签: python arrays sorting numpy eigenvalue

函数numpy.linalg.eig支持一次计算一堆矩阵的特征值和特征向量。在我的例子中,我有500000个2x2矩阵,组织在一个1000x500x2x2 numpy数组中,调用numpy.linalg.eig就可以返回1000x500x2特征值和1000x500x2(双分量)特征向量。正是我需要的。但是,我需要对特征值和特征向量进行排序。我试图用

对特征值进行排序
vals, vecs = np.linalg.eig(array)
vals = vals[np.argsort(vals, axis = -1)]

但这会返回一个形状为1000x500x2x500x2的数组,而不是1000x500x2,这是我所期望的。有没有一种简单的方法可以解决这个问题,而不需要在数组上循环?是否有一种类似的简单方法可以根据特征值对特征向量进行排序?

这个问题在这里得到了回答:Sorted eigenvalues and eigenvectors on a grid但答案是针对(另一个)特殊情况而定制的,并没有很好地解释,而且我没有成功地使其适应我的情况。我考虑过对该答案发表评论,询问详情,但我目前有49个声望点,你需要50个评论。

2 个答案:

答案 0 :(得分:1)

Tor一起制定的解决方案。它将根据“特征值”顺序交换2x2矩阵的列(由np.random生成的伪特征向量)。

import numpy as np
import itertools
Nx = 1000
Ny = 500
vals = np.random.rand(Nx, Ny, 2)
vecs = np.random.rand(Nx, Ny, 2, 2)
sort_order = np.argsort(vals, -1)
L = np.array(list(itertools.product(range(Nx), range(Ny), range(2))))
d0 = L[:,0]
d1 = L[:,1]
d2 = L[:,2]
vecsort = vecs[ np.c_[d0, d0], np.c_[d1, d1], np.c_[d2, d2], sort_order[d0, d1] ].reshape(Nx, Ny, 2, 2)
# vals can be sorted in place using:
vals.sort(axis=2)

答案 1 :(得分:0)

我知道这个线程很旧,但是它只是帮助我实现了一些东西。 因此,我只想在Tor和Robert Davy的解决方案之上添加一些内容(可能是微不足道的)-如何针对NxN矩阵(在他们的示例中N = 2)将其推广。

解决方案是将d向量复制N次,例如对于N = 3:

vecsort = vecs[ np.c_[d0, d0, d0], np.c_[d1, d1, d1], np.c_[d2, d2, d2], sort_order[d0, d1] ].reshape(Nx, Ny, 3, 3)