如何将相同的矩阵与张量的每一行相乘?

问题描述 投票:0回答:1

我想在没有循环的情况下找到两次(X 和 Y)旋转后立方体的坐标。

立方体坐标存储为顶点:

cube_vertices = np.array([[0, 0, 0], 
                          [1, 0, 0], 
                          [1, 1, 0], 
                          [0, 1, 0], 
                          [0, 0, 1], 
                          [1, 0, 1], 
                          [0, 1, 1], 
                          [1, 1, 1]])

我主要处理边缘:

cube_edges = np.array([[cube_vertices[0], cube_vertices[1]],
                       [cube_vertices[0], cube_vertices[3]],
                       [cube_vertices[1], cube_vertices[2]],
                       [cube_vertices[3], cube_vertices[2]],
                       [cube_vertices[1], cube_vertices[5]],
                       [cube_vertices[2], cube_vertices[7]],
                       [cube_vertices[3], cube_vertices[6]],
                       [cube_vertices[0], cube_vertices[4]],
                       [cube_vertices[4], cube_vertices[5]],
                       [cube_vertices[4], cube_vertices[6]],
                       [cube_vertices[6], cube_vertices[7]],
                       [cube_vertices[5], cube_vertices[7]]])

我存储它是为了找到这些边与平面的交点。旋转器的给出是对

cube_edges
的每个坐标重复 12 次旋转,因此我可以沿着大小为 12 的第 0 轴(边数)和大小为 2 的第 1 轴(边的两端)相乘。坐标:

phi, theta = 0.1, 0.1
Rx = np.tile(np.array([[1, 0, 0], 
                       [0, np.cos(theta), -np.sin(theta)], 
                       [0, np.sin(theta), np.cos(theta)]]), (12, 2, 1, 1))

Ry = np.tile(np.array([[np.cos(phi), 0, np.sin(phi)], 
                       [0, 1, 0], 
                       [-np.sin(phi), 0, np.cos(phi)]]), (12, 2, 1, 1))
Rxy = Rx * Ry

cube_edges
的形状是
(12, 2, 3)
Rxy
的形状是
(12, 2, 3, 3)
。对于大小为 (3) 的每点坐标的所有 3x3 单旋转,乘法应沿前两个维度 (12, 2) 进行。我不知道如何利用 np.tensordot 或类似的东西来达到此目的:

rotated_edges = np.tensordot(Rxy, cube_edges)

rotated_edges
的最终形状应与
cube_edges
(12, 2, 3)
相同。

谢谢!

python numpy dot tensordot
1个回答
0
投票

以下似乎做了您正在尝试的事情(使用相同的数组

cube_edges
):

phi, theta = 0.1, 0.1
Rx = np.array([[1, 0, 0], 
               [0, np.cos(theta), -np.sin(theta)], 
               [0, np.sin(theta), np.cos(theta)]])

Ry = np.array([[np.cos(phi), 0, np.sin(phi)], 
               [0, 1, 0], 
               [-np.sin(phi), 0, np.cos(phi)]])
Rxy = Rx @ Ry
rotated_edges = np.dot(cube_edges,Rxy.T)
© www.soinside.com 2019 - 2024. All rights reserved.