python - 为什么 numpy.dot() 抛出 ValueError : shapes not aligned?

标签 python numpy eigenvalue eigenvector

我想编写一个程序,通过迭代猜测(瑞利商迭代)来查找埃尔米特矩阵的特征向量和特征值。我有一个测试矩阵,我知道其特征向量和特征值,但是当我运行代码时,我收到了

ValueError: shapes (3,1) and (3,1) not aligned: 1 (dim 1) != 3 (dim 0)

通过将每个分子和分母拆分为单独的变量,我将问题追溯到以下行:

nm=np.dot(np.conj(b1),np.dot(A,b1))

我的代码:

import numpy as np
import numpy.linalg as npl

def eigen(A,mu,b,err):

    mu0=mu
    mu1=mu+10*err

    while mu1-mu > err:

        n=np.dot((npl.inv(A-mu*np.identity(np.shape(A)[0]))),b)
        d=npl.norm(np.dot((npl.inv(A-(mu*np.identity(np.shape(A)[0])))),b))

        b1=n/d
        b=b1

        nm=np.dot(np.conj(b1),np.dot(A,b1))
        dm=np.dot(np.conj(b1),b1)

        mu1=nm/dm
        mu=mu1

    return(mu,b)

A=np.array([[1,2,3],[1,2,1],[3,2,1]])
mu=4
b=np.array([[1],[2],[1]])
err=0.1

eigen(A,mu,b,err) 

我相信输入到np.dot()函数中的变量的尺寸是错误的,但我找不到哪里。作为调试的一部分,所有内容都被分割并重命名,我知道它看起来很难阅读。

最佳答案

数学问题在于形状 (3,1) 和 (3,1) 的矩阵乘法。这本质上是两个向量。也许您想使用转置矩阵来做到这一点?

nm = np.dot(np.conj(b1).T, np.dot(A, b1))
dm = np.dot(np.conj(b1).T, b1)

查看 np.dot 的文档查看哪些参数是可以接受的。

If both a and b are 1-D arrays, it is inner product of vectors (...)

If both a and b are 2-D arrays, it is matrix multiplication (...)

您使用的变量的形状为 (3, 1),因此是二维数组。

此外,这意味着您可以使用数组的扁平 View ,而不是转置第一个矩阵。这样,它的形状为 (3,) 和一个一维数组,您将得到内积:

nm = np.dot(np.conj(b1).ravel(), np.dot(A, b1).ravel())
dm = np.dot(np.conj(b1).ravel(), b1.ravel())

关于python - 为什么 numpy.dot() 抛出 ValueError : shapes not aligned?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59312216/

相关文章:

python - scipy.sparse.linalg.eigs 和 numpy/scipy.eig 之间的不同特征值

python - 使用路径数组显示图像对

python - 使用 python pandas 查找另一个数据框并返回相应的值

python - UnicodeDecodeError,无效的继续字节

python - Numpy/Scipy 八函数的结果不一致

matlab - MATLAB 中的特征值

php - 从 php 运行 python 文件不会生成输出文件

python - 旋转阵列的特定区域

python - 指数股票价格在开始日期返回至 100

python - 如何移动 numpy 矩阵的一维?