使用特征值对 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]])
我正在尝试按降序对 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]])