2013-08-06 332 views
0

我想用矢量(3x1)進行矩陣乘法(3x3矩陣)。 「問題」在於,向量的每個組成部分都是從另一個矩陣中取出來的,我不知道如何繼續。有什麼辦法可以做到嗎?Python:將3x3矩陣乘以3nx1陣列而不使用循環

import numpy as np 
A = np.array([[1,1,1],[2,1,0],[1,0,1]]) 

v1 = np.array([[1,2,3,4]]) 
v2 = np.array([[5,6,7,8]]) 
v3 = np.array([[9,10,11,12]]) 

我想乘以:A x {1,5,9} .T並保存結果。然後A x {2,6,10} .T,A x {3,7,11} .T,最後A x {4,8,12} .T。陣列v1,v2和v3的長度是相同的。

預先感謝您! 問候,

哈維

+4

即使顯示你最糟糕的嘗試也給了我們理由認爲你試圖解決它;它也有助於我們理解你的心智工具箱中有什麼,這使我們能夠給你一個更有用的答案。 – msw

+0

不明白爲什麼你會想要做這個或沒有for循環。 numpy有矩陣乘法和換位的方法。你已經在導入numby,爲什麼不使用它呢。它具有C優化,測試代碼完全是爲了這個目的。 – Joop

回答

2

你可以做你是一個矩陣乘法之後的操作,如果第一個堆棧所有的矢量彙集成單個陣列:

vectors = np.vstack((vv1, v2, v3)) 
products = np.dot(A, v) 

現在products[:, i](或products.T[i],如果你喜歡)具有Ai個向量的產品。

+0

謝謝你的迴應!這是解決「問題」的好方法! – user2655987

0

numpy的陣列:

使用兩個numpy的陣列;一個3×3和一個3X1:

>>> import numpy as np 
>>> a = np.ones((3,3)) 
>>> b=np.random.rand(3,1) 
array([[ 0.08970952], 
     [ 0.56447089], 
     [ 0.57500698]]) 

如果你想矩陣乘法可以使用dot

>>> np.dot(a,b) 
array([[ 1.22918739], 
     [ 1.22918739], 
     [ 1.22918739]]) 

如果你想元素方式muliplication可以使用*

>>> a*b 
array([[ 0.08970952, 0.08970952, 0.08970952], 
     [ 0.56447089, 0.56447089, 0.56447089], 
     [ 0.57500698, 0.57500698, 0.57500698]]) 

NumPy的矩陣:

請注意,如果您正在使用numpy的矩陣則*操作可用於矩陣乘法:

>>> c = np.mat(a) # converts from array to matrix 
>>> d = np.mat(b) 
>>> c*d 
matrix([[ 1.22918739], 
     [ 1.22918739], 
     [ 1.22918739]])