使用numpy在一个点数组中乘以矩阵?

时间:2014-10-10 00:14:05

标签: python numpy

我有一个包含一堆点的数组(特别是3D矢量):

pts = np.array([
    [1, 1, 1],
    [2, 2, 2],
    [3, 3, 3],
    [4, 4, 4],
    [5, 5, 5],
])

我想将这些点中的每一个乘以变换矩阵:

pts[0] = np.dot(transform_matrix, pts[0])
pts[1] = np.dot(transform_matrix, pts[1])
…
pts[n] = np.dot(transform_matrix, pts[n])

我怎样才能有效地做到这一点?

2 个答案:

答案 0 :(得分:11)

我发现首先编写einsum版本会有所帮助 - 在您看到索引之后,您通常可以认识到版本更简单。例如,从

开始
>>> pts = np.random.random((5,3))
>>> transform_matrix = np.random.random((3,3))
>>> 
>>> pts_brute = pts.copy()
>>> for i in range(len(pts_brute)):
...         pts_brute[i] = transform_matrix.dot(pts_brute[i])
...     
>>> pts_einsum = np.einsum("ij,kj->ik", pts, transform_matrix)
>>> np.allclose(pts_brute, pts_einsum)
True

你可以看到这只是

>>> pts_dot = pts.dot(transform_matrix.T)
>>> np.allclose(pts_brute, pts_dot)
True

答案 1 :(得分:3)

矩阵 - 矩阵乘法可以被认为是“批处理模式”矩阵 - 向量乘法,其中第二个矩阵中的每一列是乘以第一个的向量之一,结果向量是结果的列。基质

还要注意,因为(AB) T = B T A T ,因此(通过转置两侧)((AB) T T = AB =(B T A T T 你可以对第一个矩阵的行进行类似的陈述 - 批量 - (左)乘以第二个矩阵的转置,结果向量是的矩阵产品。