2016-06-29 5 views
-1

아래에 몇 가지 변수가 있습니다. 이 코드 블록을 실행하려고 할 때 맨 아래에 오류 메시지가 나타나는 이유는 무엇입니까? 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 

오류 메시지 :

두 번째 ind_var 트랜스 필요

ValueError: could not broadcast input array from shape (2,2) into shape (1)

+0

MATLAB의 행렬 곱셈과 '*'를 혼동 할 수 있습니다. 단, NumPy는 요소 식 곱셈과 관련이 있습니까? – Divakar

답변

0

[I, : 달리 새에 걸쳐있어, A (2,1)의 형상을 얻을 수 있습니다 (2,2-) 행렬 (shape) (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

그래서 나는 두 번째'ind_var [i, :]'를'np.transpose'에'Q [i] = ind_var [i, :] * R * np.transpose (ind_var [i, :]) + Ve' 하지만 여전히 동일한 오류 메시지가 나타납니다 ** 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 같이) 2 차원으로 제한 및 매트릭스 제품 * 사용되는 배열 서브 클래스 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은 한 단계에서 모든 계산을 수행 할 수있는 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]) 

Rind_var 값은이 예제에서 모두 0이므로 결과는 모양을 제외하고는 진단되지 않습니다.

matmul 연산자 인 @을 제안하려고했지만 [email protected]@ind_var.T은 우리가 원하는 것이 아닌 10x10 배열을 생성합니다. 반복적 인 ind_var[0,:]@[email protected]_var[0,:]은 괜찮습니다.

(정말 중요하지 않은 값으로 테스트해야합니다).