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

Dav*_*ver 7 python numpy

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

pts = np.array([
    [1, 1, 1],
    [2, 2, 2],
    [3, 3, 3],
    [4, 4, 4],
    [5, 5, 5],
])
Run Code Online (Sandbox Code Playgroud)

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

pts[0] = np.dot(transform_matrix, pts[0])
pts[1] = np.dot(transform_matrix, pts[1])
…
pts[n] = np.dot(transform_matrix, pts[n])
Run Code Online (Sandbox Code Playgroud)

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

DSM*_*DSM 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
Run Code Online (Sandbox Code Playgroud)

你可以看到这很简单

>>> pts_dot = pts.dot(transform_matrix.T)
>>> np.allclose(pts_brute, pts_dot)
True
Run Code Online (Sandbox Code Playgroud)


dwf*_*dwf 5

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

另请注意,由于 (AB) T = B T A T,因此(通过转置两边) ((AB) T ) T = AB = (B T A T ) T您可以对第一个矩阵批量(左)乘以第二个矩阵的转置,结果向量是矩阵乘积的行。