我有一个包含一堆点的数组(特别是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)
矩阵-矩阵乘法可以被认为是“批量模式”矩阵-向量乘法,其中第二个矩阵中的每一列都是与第一个矩阵相乘的向量之一,结果向量是结果矩阵的列。
另请注意,由于 (AB) T = B T A T,因此(通过转置两边) ((AB) T ) T = AB = (B T A T ) T您可以对第一个矩阵批量(左)乘以第二个矩阵的转置,结果向量是矩阵乘积的行。
归档时间: |
|
查看次数: |
900 次 |
最近记录: |