我正在尝试使用Transforms3d python软件包将四元数列表转换为其相应的方向矩阵。
每个四元数是输入的4个元素列表/数组,并使用transforms3d.quaternions.quat2mat(q)函数返回3x3方向矩阵。
我列出了一些需要转换的10K-100K四元数(nx4数组),虽然很容易通过循环来完成,但是我认为如果有某种矢量化处理的方法可能会更快。
一些搜索建议我可以简单地执行np.vectorize()之类的操作,但是我一直在努力使之工作。列表理解可以很好地工作,但是我想numpy向量解决方案会更快。
orientations = np.array([[ 0.6594993 , -0.06402525, -0.74797227, -0.03871606],
[ 0.78091967, -0.15961452, -0.44240183, -0.41105753]])
rotMatrix = [quat2mat(orient) for orient in orientations]
vfunc=np.vectorize(quat2mat, signature='(m,n)->()')
vfunc(orientations)
不幸的是,无论有没有签名,我什至都无法运行numpy版本(这可能是错误的)。
> 追溯(最近一次通话):
文件“”,第1行,在 vfunc(aa)
文件“ c:\ wpy64-3740 \ python-3.7.4.amd64 \ lib \ site-packages \ numpy \ lib \ function_base.py”,第2091行,在调用中 返回self._vectorize_call(func = func,args = vargs)
文件“ c:\ wpy64-3740 \ python-3.7.4.amd64 \ lib \ site-packages \ numpy \ lib \ function_base.py”,行2157,在_vectorize_call中 res = self._vectorize_call_with_signature(func,args)
文件“ c:\ wpy64-3740 \ python-3.7.4.amd64 \ lib \ site-packages \ numpy \ lib \ function_base.py”,行2198,在_vectorize_call_with_signature中 结果= func(*(arg [index]表示args中的arg))
文件“ c:\ wpy64-3740 \ python-3.7.4.amd64 \ lib \ site-packages \ transforms3d \ quaternions.py”,第133行,位于quat2mat中 w,x,y,z = q
ValueError:没有足够的值可解包(预期4,得到2)
答案 0 :(得分:0)
如所建议的,提高性能的最好方法是对quat2mat进行矢量化处理,结果(%timeit
)支持:
quat2mat()循环2000个四元数:
17.3 ms ± 482 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
针对2000个四元数的矢量化quat2mat_array():
1.11 ms ± 16.8 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
应该首先做到这一点,而不要弄乱np.vectorise()
!感谢您重新关注!