Вот один с np.einsum
-
# Setup 3D rotation matrix
cs = np.empty((n,2,2))
cs[:,0,0] = c
cs[:,1,1] = c
cs[:,0,1] = s
cs[:,1,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]
Используйте флаг optimize
со значением True
в np.einsum
для использования BLAS
.
В качестве альтернативы, мы можем использовать np.matmul/@ operator in Python 3.x
для замены einsum
детали -
p_out[:,:2] += np.matmul(pose[:,None,:2],cs)[:,0]