加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python-每行乘以不同的旋转矩阵

发布时间:2020-12-17 17:40:09 所属栏目:Python 来源:网络整理
导读:此函数将n行姿势中的每行乘以不同的旋转矩阵.是否有可能通过使用旋转矩阵的3d张量来避免循环? 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(

此函数将n行姿势中的每行乘以不同的旋转矩阵.是否有可能通过使用旋转矩阵的3d张量来避免循环?

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
最佳答案
这是一个有np.einsum的-

# Setup 3D rotation matrix
cs = np.empty((n,2,2))
cs[:,0] = c
cs[:,1,1] = c
cs[:,1] = s
cs[:,0] = -s

# Perform 3D matrix multiplications with einsum
p_out = ref[:,:d].copy()
p_out[:,:2] += np.einsum('ij,ijk->ik',pose[:,:2],cs)

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

np.einsum('ijj->ij',cs)[...] = c[:,None]

在np.einsum中使用带有True值的optimize标志来利用BLAS.

另外,我们可以在Python 3.x中使用np.matmul / @运算符替换einsum部分-

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读