numpy传播机制之矩阵乘向量的批量处理

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

你可能感兴趣的:(Ubuntu,python学习,numpy,矩阵,python)