对特征值和特征向量进行排序
Sorting eigenvalues and eigenvectors
函数numpy.linalg.eig
支持一次计算一堆矩阵的特征值和特征向量。在我的例子中,我有 500000 个 2x2 矩阵,组织在一个 1000x500x2x2 numpy 数组中,并在这个 returns 1000x500x2 特征值和 1000x500x2(2 分量)特征向量上调用 numpy.linalg.eig
。正是我需要的。但是,我需要对特征值和特征向量进行排序。我试图用
对特征值进行排序
vals, vecs = np.linalg.eig(array)
vals = vals[np.argsort(vals, axis = -1)]
然而这个 returns 形状为 1000x500x2x500x2 的数组,而不是我期望的 1000x500x2。有没有一种简单的方法可以解决此问题,而无需诉诸遍历数组?是否有类似简单的方法根据特征值对特征向量进行排序?
这个问题在这里得到了某种程度的回答: 但答案是针对(另一个)特例量身定制的,并没有很好地解释,而且我没有成功地将它适应我的案子。我考虑过对该答案发表评论,询问详情,但我目前的声誉点数为 49,您需要 50 点才能发表评论。
与 Tor 一起开发的解决方案。它将根据 "eigenvalue" 顺序交换 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)
我知道这个线程很旧,但它只是帮助我实现了一些东西。
因此,我只是想在 Tor 和 Robert Davy 的解决方案之上添加一些东西(可能是微不足道的)——如何将其推广到 NxN 矩阵,在他们的示例中 N=2。
解决方法是复制N次d向量,例如对于 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)
函数numpy.linalg.eig
支持一次计算一堆矩阵的特征值和特征向量。在我的例子中,我有 500000 个 2x2 矩阵,组织在一个 1000x500x2x2 numpy 数组中,并在这个 returns 1000x500x2 特征值和 1000x500x2(2 分量)特征向量上调用 numpy.linalg.eig
。正是我需要的。但是,我需要对特征值和特征向量进行排序。我试图用
vals, vecs = np.linalg.eig(array)
vals = vals[np.argsort(vals, axis = -1)]
然而这个 returns 形状为 1000x500x2x500x2 的数组,而不是我期望的 1000x500x2。有没有一种简单的方法可以解决此问题,而无需诉诸遍历数组?是否有类似简单的方法根据特征值对特征向量进行排序?
这个问题在这里得到了某种程度的回答:
与 Tor 一起开发的解决方案。它将根据 "eigenvalue" 顺序交换 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)
我知道这个线程很旧,但它只是帮助我实现了一些东西。 因此,我只是想在 Tor 和 Robert Davy 的解决方案之上添加一些东西(可能是微不足道的)——如何将其推广到 NxN 矩阵,在他们的示例中 N=2。
解决方法是复制N次d向量,例如对于 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)