2017-04-26 40 views
1

有沒有什麼優雅的方式來做一個單行矩陣和Python中的兩個或更多行矩陣的每一行之間的點積?我使用列表或列表列表來表示矩陣。在一行矩陣和多行矩陣的每一行之間是否有任何優雅的方法來製作點積?

+0

您可以舉一個輸入和您想要的輸出的例子嗎? – Allen

+0

檢查scipy –

+0

請閱讀此[如何問](http://stackoverflow.com/help/how-to-ask)以改善您的問題。 – thewaywewere

回答

3

如果A是n×m矩陣(n行,每行包含m個條目),並且v是m個條目的行向量,則「行向量與兩行或更多行的每行之間的點積矩陣「通常稱爲Av.Tv的轉置,即列向量)之間的矩陣向量乘積。

隨着Numpy,這只是np.dot(A, np.reshape(v, (-1, 1)))。在普通的Python,你可以寫這樣的:

def inner_product(u, v): 
    'Inner product between two numeric arrays.' 
    return sum(x*y for x, y in zip(u, v)) 

def mat_vec_product(a, v): 
    'Dot product between matrix `a` and column vector `v`.' 
    return [inner_product(u, v) for u in a] 

>>> mat = [ 
...  [0, 0, 0], 
...  [0, 0, 1], 
...  [0, 1, 0], 
...  [0, 1, 1], 
...  [1, 0, 0], 
...  [1, 0, 1], 
... ] 
>>> row = [100, 20, 3] 
>>> print(mat_vec_product(mat, row)) 
[0, 3, 20, 23, 100, 103] 
0

您也可以從scipy定製距離函數,它是在這種情況下點積使用cdist。在這種情況下,您必須先將列表的列表轉換爲numpy數組。

import numpy as np 
from scipy.spatial.distance import cdist 

x1 = np.atleast_2d(np.array([1, 2, 3])) 
x2 = np.array([[1,2,3], 
       [2,3,4], 
       [4,5,6]]) 
D = cdist(x1, x2, lambda u, v: np.dot(u.T, v)) 
D.ravel() 

輸出

array([ 14., 20., 32.]) 

或者,它可以是一個簡單矩陣特技例如D = x1.dot(x2.T)(輸出與array([ 14., 20., 32.])相同)

相關問題