用于乘法的Python维度不匹配

时间:2016-06-29 08:01:44

标签: python arrays numpy dimension

我在下面列出了一些变量。当我尝试运行这段代码时,为什么我会在底部收到错误消息? 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)

2 个答案:

答案 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.einsumnp.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])
在此示例中,

Rind_var值均为0,因此结果不是诊断性的 - 除了形状。

我打算建议使用新的matmul运算符@,但ind_var@R@ind_var.T生成一个10x10数组,这不是我们想要的。迭代ind_var[0,:]@R@ind_var[0,:]没问题。

(我真的应该用非平凡的价值来测试事物。)