python - 矩阵和向量的逐元素点积

标签 python numpy matrix array-broadcasting

<分区>

真有类似问题here , here , here ,但我真的不明白如何将它们精确地应用到我的案例中。

我有一个矩阵数组和一个向量数组,我需要逐元素点积。插图:

In [1]: matrix1 = np.eye(5)

In [2]: matrix2 = np.eye(5) * 5

In [3]: matrices = np.array((matrix1,matrix2))

In [4]: matrices
Out[4]: 
array([[[ 1.,  0.,  0.,  0.,  0.],
        [ 0.,  1.,  0.,  0.,  0.],
        [ 0.,  0.,  1.,  0.,  0.],
        [ 0.,  0.,  0.,  1.,  0.],
        [ 0.,  0.,  0.,  0.,  1.]],

       [[ 5.,  0.,  0.,  0.,  0.],
        [ 0.,  5.,  0.,  0.,  0.],
        [ 0.,  0.,  5.,  0.,  0.],
        [ 0.,  0.,  0.,  5.,  0.],
        [ 0.,  0.,  0.,  0.,  5.]]])

In [5]: vectors = np.ones((5,2))

In [6]: vectors
Out[6]: 
array([[ 1.,  1.],
       [ 1.,  1.],
       [ 1.,  1.],
       [ 1.,  1.],
       [ 1.,  1.]])

In [9]: np.array([m @ v for m,v in zip(matrices, vectors.T)]).T
Out[9]: 
array([[ 1.,  5.],
       [ 1.,  5.],
       [ 1.,  5.],
       [ 1.,  5.],
       [ 1.,  5.]])

最后一行是我想要的输出。不幸的是,它非常低效,例如执行 matrices @ vectors 计算由于广播而不需要的点积(如果我理解得很好,它返回第一个矩阵点 2 个向量和第二个矩阵点 2 个向量) 实际上更快。

我想 np.einsumnp.tensordot 在这里可能会有帮助,但我所有的尝试都失败了:

In [30]: np.einsum("i,j", matrices, vectors)
ValueError: operand has more dimensions than subscripts given in einstein sum, but no '...' ellipsis provided to broadcast the extra dimensions.

In [34]: np.tensordot(matrices, vectors, axes=(0,1))
Out[34]: 
array([[[ 6.,  6.,  6.,  6.,  6.],
        [ 0.,  0.,  0.,  0.,  0.],
        [ 0.,  0.,  0.,  0.,  0.],
        [ 0.,  0.,  0.,  0.,  0.],
        [ 0.,  0.,  0.,  0.,  0.]],

       [[ 0.,  0.,  0.,  0.,  0.],
        [ 6.,  6.,  6.,  6.,  6.],
        [ 0.,  0.,  0.,  0.,  0.],
        [ 0.,  0.,  0.,  0.,  0.],
        [ 0.,  0.,  0.,  0.,  0.]],

       [[ 0.,  0.,  0.,  0.,  0.],
        [ 0.,  0.,  0.,  0.,  0.],
        [ 6.,  6.,  6.,  6.,  6.],
        [ 0.,  0.,  0.,  0.,  0.],
        [ 0.,  0.,  0.,  0.,  0.]],

       [[ 0.,  0.,  0.,  0.,  0.],
        [ 0.,  0.,  0.,  0.,  0.],
        [ 0.,  0.,  0.,  0.,  0.],
        [ 6.,  6.,  6.,  6.,  6.],
        [ 0.,  0.,  0.,  0.,  0.]],

       [[ 0.,  0.,  0.,  0.,  0.],
        [ 0.,  0.,  0.,  0.,  0.],
        [ 0.,  0.,  0.,  0.,  0.],
        [ 0.,  0.,  0.,  0.,  0.],
        [ 6.,  6.,  6.,  6.,  6.]]])

注意:我的实际情况使用的矩阵比matrix1matrix2

最佳答案

对于 np.einsum,您可以使用:

np.einsum("ijk,ki->ji", matrices, vectors)

#array([[ 1.,  5.],
#       [ 1.,  5.],
#       [ 1.,  5.],
#       [ 1.,  5.],
#       [ 1.,  5.]])

关于python - 矩阵和向量的逐元素点积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43415207/

相关文章:

python - Youtube-api::通过命令行设置元数据字段

python - 在 Python 中检查绝对路径

python - 无法在 PyCharm 中定义有关名称的错误警告

python - 如何使用 MNE 包滚动浏览 EEG 数据?

python - 越来越大的雪花 : optimize geometric transformation

c++ - 如何随着时间的推移在OpenGL中平移和旋转三角形?

python - 有一个 numpy.dot 文档示例不清楚,具有高维点积

python - pip install matplotlib 在 Raspbian Jessie 4.4 上失败

math - 如何表示 4x4 矩阵旋转?

matlab - Gauss-Jordan 消除法对 GF(2) 的消除