В вашем примере:
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
, @
, но [email protected]@ind_var.T
производит массив 10x10, который мы не хотим. Итеративный ind_var[0,:]@[email protected]_var[0,:]
в порядке.
(Я действительно должен проверять вещи с нетривиальными значениями).
Возможно, вы сбиваете с толку '*' с матричным умножением в MATLAB, в отличие от NumPy, который идет как элементное умножение? – Divakar