Python 将每行乘以不同的旋转矩阵

Python 将每行乘以不同的旋转矩阵,python,numpy,vectorization,array-broadcasting,Python,Numpy,Vectorization,Array Broadcasting,此函数将n行的pose乘以不同的旋转矩阵。是否可以通过使用旋转矩阵的三维张量来避免循环 def transform(ref, pose): n, d = pose.shape p = ref[:, :d].copy() c = np.cos(ref[:, 2]) s = np.sin(ref[:, 2]) for i in range(n): p[i,:2] += pose[i,:2].dot(np.array([[c[i], s[i]]

此函数将
n
行的
pose
乘以不同的旋转矩阵。是否可以通过使用旋转矩阵的三维张量来避免循环

def transform(ref, pose):
    n, d = pose.shape
    p = ref[:, :d].copy()
    c = np.cos(ref[:, 2])
    s = np.sin(ref[:, 2])

    for i in range(n):
        p[i,:2] += pose[i,:2].dot(np.array([[c[i], s[i]], [-s[i], c[i]]]))

    return p
这是一个有-

或者,将
c
的两个分配步骤替换为涉及一个以上
einsum
-

np.einsum('ijj->ij',cs)[...] = c[:,None]
np.einsum
中使用
optimize
标志和
True
值来利用
BLAS

或者,我们可以在Python3.x中使用
np.matmul/@操作符来替换
einsum
部分-

p_out[:,:2] += np.matmul(pose[:,None,:2],cs)[:,0]
p_out[:,:2] += np.matmul(pose[:,None,:2],cs)[:,0]