交换np.array的两列时发生了什么?

2024-06-24 13:06:08 发布

您现在位置:Python中文网/ 问答频道 /正文

import numpy as np
from scipy import linalg as linalg
M = np.array([[1,2],[2,1],[3,4],[4,3]])
Evals, Evecs = linalg.eigh(M.T.dot(M))
EvecShape = Evecs.shape
print Evals
print Evecs
ncols = EvecShape[1]
for i in range(ncols/2):
    Evals[i], Evals[ncols-1-i] = Evals[ncols-1-i], Evals[i]
    Evecs[:,i], Evecs[:,ncols-1-i] = Evecs[:,ncols-1-i], Evecs[:,i]
print Evals
print Evecs

我想计算MT*M的特征值和特征向量,并通过交换相应的列对特征值进行降序排序。结果如下:

[  2.  58.]
[[-0.70710678  0.70710678]
 [ 0.70710678  0.70710678]]
[ 58.   2.]
[[ 0.70710678  0.70710678]
[ 0.70710678  0.70710678]]

看来我确实在Evals中交换了元素。但对于爱唯客来说,显然有些地方出了问题。有人能告诉我这里发生了什么事吗


Tags: fromimportnumpyasnpscipyarrayprint
2条回答

你正在尝试像二维数组一样对特征向量排序。不好的。使用特定的方法。在下面

import numpy as np
from scipy import linalg as linalg
M = np.array([[1,2],[2,1],[3,4],[4,3]])
Evals, Evecs = linalg.eigh(M.T.dot(M))
print Evals
print Evecs

index = Evals.argsort()[::-1]   

Evals= Evals[index]
Evecs = Evecs [:,index]

print Evals
print Evecs

代码的问题是,当您尝试交换列时,在读取第一列之前,会用另一列覆盖其中一列。这是因为数组切片(如果可能)不复制数据,而是引用被切片数组的缓冲区

你可以

  • 像这样使用.copy()强制复制

是的

Evecs[:,i], Evecs[:,ncols-1-i] = Evecs[:,ncols-1-i], Evecs[:,i].copy()

或者

  • 避免循环,只需

是的

Evecs = Evecs[:, ::-1]

相关问题 更多 >