我有一个包含一堆点的数组(特别是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])
我怎样才能有效地做到这一点?
答案 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 你可以对第一个矩阵的行进行类似的陈述 - 批量 - (左)乘以第二个矩阵的转置,结果向量是行的矩阵产品。