2016-06-29 8 views
-1

以下にいくつかの変数があります。このコードブロックを実行しようとすると、どうやって最下部にエラーメッセージが表示されますか? Ind_var[i,:]は形状(1,2)なので、行列乗算(1,2)*(2,2)は(1,2)ですか?すみません、私はPythonを初めて使っています。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)

+0

MATLABの行列乗算と要素乗法のNumPyが混同されるのではないでしょうか? – Divakar

答えて

0

あなたがそうでなければ、新しい(2,2にまたがるしている、[私は,:](2,1)形状を得るために第2 ind_varを転置する必要があります)行列であり、形状(1)であるQ [i]に適合しない。そうでないかもしれない美しいソリューション

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を使用することができます。

はまた、Rとind_varは、行列数学のために、行列ではなく、配列にする必要があります。

あなたの例では
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 
+0

私は 'Q [i] = ind_var [i、:] * R * np.transpose(ind_var [i、:])+ Ve'として2番目の' ind_var [i、:] 'を' np.transpose'しようとしました。 ** ValueError:入力配列を形状(2,2)から形状(1)にブロードキャストできませんでした** – A1122

+0

'ml'モジュールをインポートせずに直接' np.matrix'を使用することができます。 – hpaulj

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あり

:(旧MATLABなど)2Dに制限し、行列積のため*使用されるアレイサブクラス、np.matrixがあり

In [973]: np.dot(ind_var[0,:], np.dot(R, ind_var[0,:]))+Ve 
Out[973]: 0.001 

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は、すべての計算を1ステップで実行できる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,:]はokです。

(私は本当に重要な値で物事をテストすべきです)。

関連する問題