python - scipy.spatial.transform.Rotation 旋转数组与同一对象内的堆栈

标签 python performance scipy scipy-spatial

在一个项目中,我必须在 python 中存储一个对象的连续旋转序列。我打算使用 scipy.spatial.transform.Rotation 对象来存储它们。

我注意到有两个选项可用。

  1. 我将大量 Rotation 对象存储在一个数组中,每个 Rotation 对象包含我的序列的单个旋转。

  2. 我将每个旋转都存储在同一个 Rotation 对象中,有效地将它们堆叠在一个对象中。

我想知道这些方法在计算速度和数据访问速度方面的权衡是什么。以及最终应该首选哪种方法。

在我的特殊情况下:

  • 我有相当多的轮换(大约 2'000'000)。
  • 我想尽可能加快我的数据访问时间。
  • 我不关心内存使用情况,所以我愿意用空间换取速度。
  • 我不打算将我的轮换应用于任何事情。这纯粹是为了存储使用。
  • 我将不得不以四元数 (.as_quat()) 和欧拉角 (.as_euler()) 的形式访问我的旋转
  • 我将不得不在某个时候将我的数据拆分成更小的 block (而且我知道如果我使用单个 Rotation 对象,我可能必须在每个 block 上重新创建才能正确拆分我的数据)

我在找什么:

  • 访问时间最快的方法
  • 更接近python中良好实践和编码约定的方法

提前致谢。

最佳答案

好吧,我将放入我拥有的第一个元素。

对于两者,您最终会访问一个可迭代对象和一个对象(只是顺序不同)。因此访问速度应该没有什么大的区别。

R 的列表 以后更容易访问和操作。因此,如果您易于更改轮换顺序中的任何内容,这是更简单的方法。使用单个对象需要一些额外的操作代码,并且可能会更慢。 然而,这实际上取决于您的操作,而且我没有数据证明它明显变慢。

单个对象应该占用更少的内存空间,因为只有一个实例,而对象列表的 nb_rotation 倍。 我已经提到过,这对我来说并不重要,它并不重要。同样,我没有任何数据支持这一点,但我预计差异会很大,因为我有大约 2'000'000 次旋转。

根据这些事实,我会做出如下决定:

  • 如果您只想使用对象进行存储,那么单个对象可能更有效。 (然而,这将适用于非常具体的情况,因为您还可以计算结果旋转并存储单个四元数或旋转对象)

  • 如果您希望以任何方式操纵您的数据,那么对象列表似乎更适合这种情况。唯一真正的缺点是内存使用,但是如果您操作数据,您还必须在某个时候解压缩单个对象,从而导致类似的问题,如果不是由于数据重复而变得更糟的话。

在我的例子中,我将使用对象列表。

关于python - scipy.spatial.transform.Rotation 旋转数组与同一对象内的堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63116277/

相关文章:

python - 暂停 GUI Python 程序

python - 在python中将MAC地址转换为字节数组

javascript - React 组件由于多种样式而重新渲染

python - 在 3D numpy 数组中绘制和/或获取 2D 平面的索引

python - Scipy fmin 参数传递

python - numpy.random 和蒙特卡洛

python - 如何在 Pandas 中附加两个或多个数据框并进行一些分析

javascript - 匿名函数存储效率

mysql - 提高连接性能

python - 如何在 Python/Matplotlib 中根据特征值和特征向量绘制椭圆?