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.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,:]即可。

(我真的应该测试具有非平凡值的东西)。