Why is numpy.dot() throwing a ValueError: shapes not aligned?
Why is numpy.dot() throwing a ValueError: shapes not aligned?
我想编写一个程序,通过迭代猜测(Rayleigh 商迭代)找到 Hermitian 矩阵的特征向量和特征值。我有一个测试矩阵,我知道它的特征向量和特征值,但是当我 运行 我的代码时,我收到
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),因此是二维数组。
此外,这意味着您可以使用数组的平面视图,而不是转置第一个矩阵。这样,它是形状 (3,) 和一维数组,您将得到内积:
nm = np.dot(np.conj(b1).ravel(), np.dot(A, b1).ravel())
dm = np.dot(np.conj(b1).ravel(), b1.ravel())
我想编写一个程序,通过迭代猜测(Rayleigh 商迭代)找到 Hermitian 矩阵的特征向量和特征值。我有一个测试矩阵,我知道它的特征向量和特征值,但是当我 运行 我的代码时,我收到
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),因此是二维数组。
此外,这意味着您可以使用数组的平面视图,而不是转置第一个矩阵。这样,它是形状 (3,) 和一维数组,您将得到内积:
nm = np.dot(np.conj(b1).ravel(), np.dot(A, b1).ravel())
dm = np.dot(np.conj(b1).ravel(), b1.ravel())