python np.dot矢量化

时间:2018-08-17 09:04:07

标签: python vectorization matrix-multiplication

在与矩阵相乘时,我试图摆脱一些for循环。 aa代表3x3变换矩阵,bb代表点坐标nx3,其中n是点数。

使用:

aa = np.matrix([[1,2,3],[1,2,3],[1,2,3]])
bb = np.matrix([[1,1,1],[2,2,2],[3,3,3]])

np.tile(aa,(3,1))*bb.ravel().T

我得到:

ValueError: shapes (9,3) and (9,1) not aligned: 3(dim 1) != 9 (dim 0)

在这种情况下,预期输出将为 long 列矩阵[[6],[6],[6],[12],[12],[12],[18],[18],[18]]。在这种情况下,3x3[[6,6,6],[12,12,12],[18,18,18]]应该是哪个最终形状。

编辑:脱离了一般性描述。 点数为n,只有一个3x3矩阵。它的向量化问题如下:

points = bb
T = aa
pointsNewPos = []

for point in points:
    pointNewPosition = T*point.T
    pointsNewPos.append(pointNewPosition.T)

2 个答案:

答案 0 :(得分:0)

在这种情况下,至少可以提供所需的输出。没有更多信息,很难确保它是通用的。

import numpy as np

aa = np.array([[1,2,3],[1,2,3],[1,2,3]])
bb = np.array([[1,1,1],[2,2,2],[3,3,3],[4,4,4]])

result = b.dot(aa.T)

答案 1 :(得分:0)

这听起来像是np.einsum的一项工作,它使您可以使用输入矩阵的任意维度进行矩阵乘法。

假设您想将bb的每一行用作列向量,然后将其(以行大写方式)乘以aa,然后旋转一下:

cc = np.einsum('ij,kj -> ki', bb, aa)