有没有一种方法可以使用 numpy 在没有循环的情况下将函数应用于二维数组
Is there a way to use numpy to apply a function to a 2D array without a loop
我正在尝试使用 Transforms3d python 包将四元数列表转换为其相应的方向矩阵。
每个四元数是输入的 4 个元素 list/array,使用 transforms3d.quaternions.quat2mat(q) 函数它 return 是 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 版本,无论是否有签名(这可能是错误的)。
>
Traceback (most recent call last):
文件“”,第 1 行,位于
vfunc(aa)
文件 "c:\wpy64-3740\python-3.7.4.amd64\lib\site-packages\numpy\lib\function_base.py",第 2091 行,在 调用
return 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] for arg in args))
文件 "c:\wpy64-3740\python-3.7.4.amd64\lib\site-packages\transforms3d\quaternions.py",第 133 行,在 quat2mat 中
w, x, y, z = q
ValueError:没有足够的值来解压(预期 4,得到 2)
正如所建议的那样,提高性能的最佳方法是向量化 quat2mat,结果 (%timeit
) 支持:
quat2mat() 循环 2000 个四元数:
17.3 ms ± 482 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
矢量化 quat2mat_array() 2000 个四元数:
1.11 ms ± 16.8 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
应该先做那个而不是搞乱 np.vectorise()
!感谢重新关注!
我正在尝试使用 Transforms3d python 包将四元数列表转换为其相应的方向矩阵。
每个四元数是输入的 4 个元素 list/array,使用 transforms3d.quaternions.quat2mat(q) 函数它 return 是 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 版本,无论是否有签名(这可能是错误的)。
> Traceback (most recent call last):
文件“”,第 1 行,位于 vfunc(aa)
文件 "c:\wpy64-3740\python-3.7.4.amd64\lib\site-packages\numpy\lib\function_base.py",第 2091 行,在 调用 return 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] for arg in args))
文件 "c:\wpy64-3740\python-3.7.4.amd64\lib\site-packages\transforms3d\quaternions.py",第 133 行,在 quat2mat 中 w, x, y, z = q
ValueError:没有足够的值来解压(预期 4,得到 2)
正如所建议的那样,提高性能的最佳方法是向量化 quat2mat,结果 (%timeit
) 支持:
quat2mat() 循环 2000 个四元数:
17.3 ms ± 482 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
矢量化 quat2mat_array() 2000 个四元数:
1.11 ms ± 16.8 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
应该先做那个而不是搞乱 np.vectorise()
!感谢重新关注!