2016-12-13 1 views
0

"W"행렬 배수 행렬 곱셈 (모든 곱셈은 열 벡터 결과)이 필요합니다.파이썬에서 반복적 인 곱하기에 "점"(또는 "matmul") 함수를 사용하는 방법

from numpy import matrix 
from numpy import transpose 
from numpy import matmul 
from numpy import dot 

# Iterative matrix multiplication 
def iterativeMultiplication(X, Y): 
    W = [] # Matrix of matricial products 
    X = matrix(X) # same number of rows 
    Y = matrix(Y) # same number of rows 
    h = 0 
    while (h < X.shape[1]): 
     W.append([]) 
     W[h] = dot(transpose(X), Y) # using "dot" function 
     h += 1 
    return W 

그러나 예기치 않게 각 데이터 유형의 개체 목록을 얻습니다.

X = [[0., 0., 1.], [1.,0.,0.], [2.,2.,2.], [2.,5.,4.]] 
Y = [[-0.2], [1.1], [5.9], [12.3]] # Edit Y column 
iterativeMultiplication(X, Y) 

결과 : 매트릭스 변환만을 수치 값을 얻기 위해

[array([[37.5],[73.3],[60.8]]), 
array([[37.5],[73.3],[60.8]]), 
array([[37.5],[73.3],[60.8]])] 

나는 임의의 방법이 필요하다.

W = matrix(W) # Results in error 

"matmul"기능을 사용하는 경우와 동일합니다. 너의 시간 동안 Thx. 여러 행렬 스택하려면

+0

이것은 유효한 Python 코드가 아닙니다. – hpaulj

답변

0

, 당신은 numpy.vstack를 사용할 수 있습니다

W = numpy.vstack(W) 

편집 : 귀하의 질문에 "결과"목록 대 함수, X와 Y 사이에 차이가있는 것으로 보인다. 그러나 아래의 의견을 바탕으로 실제로 찾고있는 것은 numpy.hstack (가로 스택)이며 "결과"목록을 기반으로 원하는 3x3 매트릭스를 제공합니다.

W = numpy.hstack(W) 
+0

"h"열을 가져와야합니다. 이 경우 h = 3입니다. "vstack"을 사용하면 9x1의 행렬을 얻습니다. 올바른 것은 3x3 행렬입니다. Thx 응답 =) – JonAnthrax

+0

W가 세 개의 3x2 행렬 목록 인 경우 어떻게 3x3 행렬을 기대합니까? – sirfz

+0

질문에 원하는 출력 예를 추가하는 것이 좋습니다. – sirfz

0

물론 목록을 얻을 것입니다. 처음으로 W을 목록으로 추가하고 동일한 계산을 세 번 추가하십시오.

그러나 3 개 요소 배열은이 데이터 (array([[ 3.36877336],[ 3.97112615],[ 3.8092797 ]]))에 맞지 않습니다.

내가 Xm=np.matrix(X)를 한 경우 등 : 당신은 질문을 편집 유효한 파이썬 코드 (def: 누락), 및 입력에 맞는 결과를 모두 가질 필요가

In [162]: Xm 
Out[162]: 
matrix([[ 0., 0., 1.], 
     [ 1., 0., 0.], 
     [ 2., 2., 2.], 
     [ 2., 5., 4.]]) 
In [163]: Ym 
Out[163]: 
matrix([[ 0.1, -0.2], 
     [ 0.9, 1.1], 
     [ 6.2, 5.9], 
     [ 11.9, 12.3]]) 
In [164]: Xm.T.dot(Ym) 
Out[164]: 
matrix([[ 37.1, 37.5], 
     [ 71.9, 73.3], 
     [ 60.1, 60.8]]) 

In [165]: Xm.T*Ym # matrix interprets * as .dot 
Out[165]: 
matrix([[ 37.1, 37.5], 
     [ 71.9, 73.3], 
     [ 60.1, 60.8]]) 

.

===============

In [173]: Y = [[-0.2], [1.1], [5.9], [12.3]] 
In [174]: Ym=np.matrix(Y) 
Out[176]: 
matrix([[ 37.5], 
     [ 73.3], 
     [ 60.8]]) 

=====================

이 반복 서투른 :

h = 0 
while (h < X.shape[1]): 
    W.append([]) 
    W[h] = dot(transpose(X), Y) # using "dot" function 
    h += 1 

보다 파이썬 방법

for h in range(X.shape[1]): 
    W.append(np.dot(...)) 

심지어

W = [np.dot(....) for h in range(X.shape[1])] 
+0

을 내 오류에 대한 올바른 Y 열은 다음과 같습니다... 는 Y = [-0.2], [1.1], [5.9], [12.3] – JonAnthrax

+0

이 네 내 전체 코드에서 내가 스케일링을 사용, 및 전처리. 그게 내가이 방법을 얻을 이유는 ... 혼란을 변명입니다. 아이디어는 그가! 당신의 협업을위한 행과 열. 들으의 수와 행렬이 필요하다고했다 =) – JonAnthrax

+0

오 ... 네! A는 우아한 양식 반복. Rly는 순전히 감사한다 !!!!^~ ^ – JonAnthrax

관련 문제