我在下面列出了一些变量。当我尝试运行这段代码时,为什么我会在底部收到错误消息? 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:无法将形状(2,2)中的输入数组广播到 形状(1)
答案 0 :(得分:0)
你需要转换第二个ind_var [i,:]以获得(2,1)形状,否则你将跨越一个新的(2,2)矩阵,它不适合Q [i],这是形状(1)。
对于矩阵数学,R和ind_var也需要是矩阵,而不是数组:
URL url = Thread.currentThread().getContextClassLoader().getResource("filename.xsd");
File schemaLocation = new File(url.getFile());
也许不是一个漂亮的解决方案,但你可以从这里开始使用matlib来创建矩阵。
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
答案 1 :(得分:0)
在你的例子中:
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,:]
没问题。
(我真的应该用非平凡的价值来测试事物。)