0. 问题描述
你有没有遇到过在numpy中已知一个旋转矩阵(4x4),想要旋转一堆坐标点(4xN)的情况,数据形式如下图,问如何能够高效地使用numpy的广播机制运算得出旋转后的坐标点?
import numpy as np
tfmat = np.array(range(16)).reshape(4, 4)
vec_arr = np.array(range(24)).reshape(4, 6)
print('tfmat: ', tfmat)
print('vec_arr: ', vec_arr)
1. for循环方法
通常的做法是简单粗暴地抽取每个点与旋转矩阵相乘
import numpy as np
res_list = list()
for vec in vec_arr.transpose():
vec = vec.reshape(4, 1)
print('vec: ', vec.transpose())
res = np.dot(tfmat.reshape(4, 4), vec).reshape(-1)
print('res: ', res.transpose())
res_list.append(res)
res_iter = np.array(res_list).transpose()
print('res_iter shape: ', res_iter.shape)
print('res_iter: ', res_iter)
2. numpy广播机制
一般来说,numpy的广播机制是从末端的维度开始看起,相乘的数据需要对齐或者以1作为拓展,但是下面的例子则是可以(1x4x4)的维度与(4xN)的维度相乘,相乘的结果是(1x4xN),其中原因未知,有知道原因的大神欢迎留言指教。下面是实现代码:
tfmat = np.array(range(16)).reshape(1, 4, 4)
res_arr = np.dot(tfmat, vec_arr).reshape(4, 6)
print('res shape: ', res_arr.shape)
print('res: ', res_arr)
以上,
2022年10月 26日
dyhuang