有没有一种方法可以使用numpy将函数应用于2D数组而无需循环

时间:2019-08-27 14:22:30

标签: numpy vectorization numpy-ufunc

我正在尝试使用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)

1 个答案:

答案 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()!感谢您重新关注!