使用特征值对 3D 特征向量数组进行排序

Sort 3D eigenvector array using eigenvalues

我正在尝试按降序对 numpy 中的特征值和特征向量的张量进行重新排序。我已经部分使用 this answer 来这样做。

我现在正在尝试分别对形状为 (32448,3) 的特征值和形状为 (32448,3,3) 的特征向量进行排序。这是我目前使用的代码:

# compute eigenvalues and eigenvectors using numpy
eigenvalues, eigenvectors = eigh(struct)

# sort eigenvalues and eigenvectors in descending order of eigenvalues
idx = np.argsort(eigenvalues, axis=1)[:,::-1]

print(idx.shape)
# (32448, 3)

eigenvalues = eigenvalues[:,idx]
eigenvectors = eigenvectors[:,:,idx]

计算索引很顺利,但是一旦 eigenvalues = eigenvalues[:,idx] 行执行,我的程序几乎就中断了;它挂断了,我必须终止它。

看起来你的输入数组必须是形状 (N,M,M),所以你有 N 个特征向量矩阵,每个矩阵有 M 个特征向量。要根据特征值对它们进行排序,您需要利用在特征值数组上采用 argsort 结果的高级索引:

import numpy as np
import numpy.linalg as linalg

A = np.random.random((3,2,2))
eigenValues, eigenVectors = linalg.eig(A)

eigenValues
array([[ 0.93101687,  0.07290812],
       [ 0.00375849,  1.24016112],
       [ 1.61859044, -0.08976086]])

eigenVectors
array([[[ 0.93211183, -0.52806487],
        [ 0.36217059,  0.84920403]],

       [[-0.86214688, -0.7177663 ],
        [ 0.50665843, -0.69628409]],

       [[ 0.71581294, -0.62592751],
        [ 0.69829208,  0.77988124]]])

找到沿第二个轴对 eigenValues 进行排序的索引:

eig_s = eigenValues.argsort(1)[:,::-1]
eig_s
array([[0, 1],
       [1, 0],
       [0, 1]], dtype=int64)

并使用它们为 eigenVectors 中的行编制索引:

np.take_along_axis(eigenVectors, eig_s[...,None], 1)
array([[[ 0.93211183, -0.52806487],
        [ 0.36217059,  0.84920403]],

       [[ 0.50665843, -0.69628409],
        [-0.86214688, -0.7177663 ]],

       [[ 0.71581294, -0.62592751],
        [ 0.69829208,  0.77988124]]])

与特征值类似:

np.take_along_axis(eigenValues, eig_s, axis=1)
array([[ 0.93101687,  0.07290812],
       [ 1.24016112,  0.00375849],
       [ 1.61859044, -0.08976086]])