【发布时间】:2015-02-20 18:14:34
【问题描述】:
例如,假设我正在模拟一堆粒子随着时间的推移做某事,并且我有一个名为 particles 的多维数组,其中包含以下索引:
- 粒子的 x/y/z 坐标(长度为
a,对于 3d 空间为3) - 单个粒子的索引(长度为
b) - 时间步的索引(长度为
c)
将数组构造成particles.shape == (a, b, c) 或particles.shape == (c, b, a) 更好吗?
我对约定比效率更感兴趣:Numpy 数组可以设置为 C 风格(最后一个索引变化最快)或 Fortran 风格(第一个索引),因此它可以有效地支持任何一种设置。我也意识到我可以使用transpose 将索引按我需要的任何顺序排列,但我想尽量减少它。
我自己开始对此进行研究,并找到了两种方式的支持:
Pro-(c,b,a):
- 默认情况下,Numpy 使用 C 样式数组,其中最后一个索引变化最快。
- 大多数向量代数函数(
inner、cross等)都作用于最后一个索引。 (dot作用于一个的最后一个和另一个的倒数第二个。) -
matplotlib集合对象(LineCollection、PolyCollection)需要空间坐标位于最后一个轴的数组。
Pro-(a,b,c):
- 如果我要使用
meshgrid和mgrid来生成一组点,它会将空间轴放在首位。例如,np.mgrid[0:5,0:5,0:5].shape == (3,5,5,5)。我意识到这些函数主要用于integer array indexing,但使用它们生成点网格并不少见。 -
matplotlibscatter和plot函数拆分了它们的参数,因此它与数组的形状无关,但ax.plot3d(particles[0], particles[1], particles[2])的类型比particles[..., 0]的版本短
一般来说,似乎存在两种不同的约定(可能是由于 C 和 Fortran 之间的历史差异),目前尚不清楚哪个在 Numpy 社区中更常见,或更适合我正在做的事情。
【问题讨论】:
标签: python arrays numpy multidimensional-array matplotlib