2013-04-29 2 views
1

배열이 될 numpy에서 두 벡터의 행렬 곱셈을 수행하려고합니다.두 벡터의 행렬 곱셈

바와 같이 형상으로부터 알 수

In [108]: b = array([[1],[2],[3],[4]]) 
In [109]: a =array([1,2,3]) 
In [111]: b.shape 
Out[111]: (4, 1) 
In [112]: a.shape 
Out[112]: (3,) 
In [113]: b.dot(a) 
ValueError: objects are not aligned 
는, 어레이 A는 실제로 매트릭스 아니다. 캐치는 이런 식으로 a을 정의하는 것입니다. 행렬의 필드 또는 열 등의 벡터를 획득 할 때
In [114]: a =array([[1,2,3]])  
In [115]: a.shape 
Out[115]: (1, 3)  
In [116]: b.dot(a) 
Out[116]: 
array([[ 1, 2, 3], 
     [ 2, 4, 6], 
     [ 3, 6, 9], 
     [ 4, 8, 12]]) 

방법은 동일한 결과를 달성 하는가?

In [137]: mat = array([[ 1, 2, 3], 
     [ 2, 4, 6], 
     [ 3, 6, 9], 
     [ 4, 8, 12]]) 

In [138]: x = mat[:,0]  #[1,2,3,4] 
In [139]: y = mat[0,:]  #[1,2,3] 
In [140]: x.dot(y) 
ValueError: objects are not aligned 

답변

5

두 벡터로 outer product을 계산 중입니다. 당신은이에 대한 기능 numpy.outer를 사용할 수 있습니다.

대신`X = 배열의
In [18]: a 
Out[18]: array([1, 2, 3]) 

In [19]: b 
Out[19]: array([10, 20, 30, 40]) 

In [20]: numpy.outer(b, a) 
Out[20]: 
array([[ 10, 20, 30], 
     [ 20, 40, 60], 
     [ 30, 60, 90], 
     [ 40, 80, 120]]) 
1

기본 예제와 비슷한 내용입니다.

xy은 모두 매트릭스가 아니라 1 차원 배열로 인식됩니다.

In [143]: x.shape 
Out[143]: (4,) 

In [144]: y.shape 
Out[144]: (3,) 

우리는 2 차원 배열 대신 1D 벡터와 *와 방송 1.

In [171]: x = array([x]).transpose() 
In [172]: x.shape 
Out[172]: (4, 1) 
In [173]: y = array([y]) 
In [174]: y.shape 
Out[174]: (1, 3) 
In [175]: x.dot(y) 
Out[175]: 
array([[ 1, 2, 3], 
     [ 2, 4, 6], 
     [ 3, 6, 9], 
     [ 4, 8, 12]]) 
+0

([X]) 트랜스()', 당신은 단지'x.reshape (-1,1)을 할 수있는'또는'X [..., np.newaxis]', 어느 쪽도 새로운 배열을 생성하지 않습니다. – askewchan

4

사용됩니다 그들에게 두 번째 차원을 ... 추가해야

In [8]: #your code from above 

In [9]: y = mat[0:1,:] 

In [10]: y 
Out[10]: array([[1, 2, 3]]) 

In [11]: x = mat[:,0:1] 

In [12]: x 
Out[12]: 
array([[1], 
     [2], 
     [3], 
     [4]]) 

In [13]: x*y 
Out[13]: 
array([[ 1, 2, 3], 
     [ 2, 4, 6], 
     [ 3, 6, 9], 
     [ 4, 8, 12]]) 
+0

'x.dot (y)'와'x * y' 둘 다이 경우에 작동합니다. 트릭은 슬라이스를 사용하여'x'와'y'가 모두 2 차원 배열이되도록하는 것입니다. –