Python 乘法维度不匹配
Python dimension mismatch for multiplication
下面列出了一些变量。当我尝试 运行 这段代码时,为什么会在底部收到错误消息? Ind_var[i,:]
应该是形状 (1,2) 所以通过矩阵乘法 (1,2) * (2,2) 是 (1,2)?抱歉,我是 python 的新手。
import numpy as np
spread_len = 10
n_param = 2
Q = np.zeros((spread_len,1))
ind_var = np.zeros((spread_len,2))
R = np.zeros((n_param,n_param))
Ve = 0.001
for i in range(spread_len):
Q[i]=ind_var[i,:]*R*ind_var[i,:]+Ve
错误信息:
ValueError: could not broadcast input array from shape (2,2) into
shape (1)
您需要转置第二个 ind_var[i,:] 以获得 (2,1) 形状,否则您将跨越一个不适合的新 (2,2) 矩阵Q[i] 是形状 (1).
对于矩阵数学,R 和 ind_var 也需要是矩阵,而不是数组:
import numpy as np
spread_len = 10
n_param = 2
Q = np.zeros((spread_len,1))
ind_var = np.asmatrix(np.zeros((spread_len,2)))
R = np.asmatrix(np.zeros((n_param,n_param)))
Ve = 0.001
for i in range(spread_len):
Q[i]=ind_var[i,:]*R*ind_var[i,:].T+Ve
也许不是一个很好的解决方案,但您可以从这里开始使用 matlib 创建矩阵。
import numpy as np
import numpy.matlib as ml
spread_len = 10
n_param = 2
Q = np.zeros((spread_len,1))
ind_var = ml.zeros((spread_len,2))
R = ml.zeros((n_param,n_param))
Ve = 0.001
for i in range(spread_len):
Q[i]=ind_var[i,:]*R*ind_var[i,:].T+Ve
在你的例子中:
In [970]: ind_var.shape
Out[970]: (10, 2)
In [971]: R.shape
Out[971]: (2, 2)
In [972]: ind_var[0,:]*R*ind_var[0,:]+Ve
Out[972]:
array([[ 0.001, 0.001],
[ 0.001, 0.001]])
对于数组,*
乘法是逐个元素进行的,就像 MATLAB .*
一样。所以结果是 R
的形状,并且在 Q
.
的单元格中放入错误的大小
有数组矩阵乘法,np.dot
:
In [973]: np.dot(ind_var[0,:], np.dot(R, ind_var[0,:]))+Ve
Out[973]: 0.001
有一个数组子类,np.matrix
被限制为 2d(像旧的 MATLAB)并使用 *
作为矩阵乘积
In [981]: Rm=np.matrix(R)
In [982]: ind_m=np.matrix(ind_var)
In [983]: ind_m[0,:]*R*ind_m[0,:].T+Ve
Out[983]: matrix([[ 0.001]])
np.einsum
是np.dot
的泛化,可以一步完成所有计算
In [985]: np.einsum('ij,jk,ik->i', ind_var, R, ind_var)+Ve
Out[985]:
array([ 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001,
0.001, 0.001])
R
和 ind_var
值在此示例中均为 0,因此结果无法诊断 - 除了形状。
我打算建议使用新的 matmul
运算符,@
但 ind_var@R@ind_var.T
生成一个 10x10 数组,这不是我们想要的。迭代ind_var[0,:]@R@ind_var[0,:]
即可。
(我真的应该测试具有非平凡值的东西)。
下面列出了一些变量。当我尝试 运行 这段代码时,为什么会在底部收到错误消息? Ind_var[i,:]
应该是形状 (1,2) 所以通过矩阵乘法 (1,2) * (2,2) 是 (1,2)?抱歉,我是 python 的新手。
import numpy as np
spread_len = 10
n_param = 2
Q = np.zeros((spread_len,1))
ind_var = np.zeros((spread_len,2))
R = np.zeros((n_param,n_param))
Ve = 0.001
for i in range(spread_len):
Q[i]=ind_var[i,:]*R*ind_var[i,:]+Ve
错误信息:
ValueError: could not broadcast input array from shape (2,2) into shape (1)
您需要转置第二个 ind_var[i,:] 以获得 (2,1) 形状,否则您将跨越一个不适合的新 (2,2) 矩阵Q[i] 是形状 (1).
对于矩阵数学,R 和 ind_var 也需要是矩阵,而不是数组:
import numpy as np
spread_len = 10
n_param = 2
Q = np.zeros((spread_len,1))
ind_var = np.asmatrix(np.zeros((spread_len,2)))
R = np.asmatrix(np.zeros((n_param,n_param)))
Ve = 0.001
for i in range(spread_len):
Q[i]=ind_var[i,:]*R*ind_var[i,:].T+Ve
也许不是一个很好的解决方案,但您可以从这里开始使用 matlib 创建矩阵。
import numpy as np
import numpy.matlib as ml
spread_len = 10
n_param = 2
Q = np.zeros((spread_len,1))
ind_var = ml.zeros((spread_len,2))
R = ml.zeros((n_param,n_param))
Ve = 0.001
for i in range(spread_len):
Q[i]=ind_var[i,:]*R*ind_var[i,:].T+Ve
在你的例子中:
In [970]: ind_var.shape
Out[970]: (10, 2)
In [971]: R.shape
Out[971]: (2, 2)
In [972]: ind_var[0,:]*R*ind_var[0,:]+Ve
Out[972]:
array([[ 0.001, 0.001],
[ 0.001, 0.001]])
对于数组,*
乘法是逐个元素进行的,就像 MATLAB .*
一样。所以结果是 R
的形状,并且在 Q
.
有数组矩阵乘法,np.dot
:
In [973]: np.dot(ind_var[0,:], np.dot(R, ind_var[0,:]))+Ve
Out[973]: 0.001
有一个数组子类,np.matrix
被限制为 2d(像旧的 MATLAB)并使用 *
作为矩阵乘积
In [981]: Rm=np.matrix(R)
In [982]: ind_m=np.matrix(ind_var)
In [983]: ind_m[0,:]*R*ind_m[0,:].T+Ve
Out[983]: matrix([[ 0.001]])
np.einsum
是np.dot
的泛化,可以一步完成所有计算
In [985]: np.einsum('ij,jk,ik->i', ind_var, R, ind_var)+Ve
Out[985]:
array([ 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001, 0.001,
0.001, 0.001])
R
和 ind_var
值在此示例中均为 0,因此结果无法诊断 - 除了形状。
我打算建议使用新的 matmul
运算符,@
但 ind_var@R@ind_var.T
生成一个 10x10 数组,这不是我们想要的。迭代ind_var[0,:]@R@ind_var[0,:]
即可。
(我真的应该测试具有非平凡值的东西)。