是否有任何优雅的方法可以在一行矩阵和多行矩阵的每一行之间制作点积?

时间:2017-04-26 00:07:39

标签: python

在python中,是否有任何优雅的方法可以在单行矩阵和两行或更多行矩阵的每一行之间制作点积?我使用列表或列表列表来表示矩阵。

2 个答案:

答案 0 :(得分:3)

如果A是n×m矩阵(n行,每行包含m个条目),v是m个条目的行向量,则“行向量与每个行之间的点积两行或更多行矩阵的行“通常称为Av.T之间的矩阵向量积(v的转置,即列向量)。

使用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]

答案 1 :(得分:0)

您还可以使用cdist中的scipy自定义距离函数,在这种情况下为点积。在这种情况下,您必须先将列表列表转换为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.])