如何处理长度不同的列表和数组?

时间:2016-01-31 10:44:52

标签: python arrays list vectorization variable-length

我有以下代码:

ray_points = [np.array([r1_1, r2_1, r3_1, r4_1]),np.array([r1_2, r2_2, r3_2, r4_2]),np.array([r1_3, r2_3, r3_3, r4_3])]

列表ray_points包含光线的坐标。在这个例子中,我有四条光线(r1,r2,r3,r4)。每次我找到光线的下一个坐标后(一旦它们行进并撞到另一个表面,它们就会有新的坐标),我会在列表ray_points附加一个新的尺寸阵列(4L,3L),(4L代表四个光线,3L代表三个空间坐标)。例如,r1_2是长度为3的数组,表示光线r1的第2个坐标,r3_3表示光线r3的第3个坐标,依此类推。

我之前的方法是使用N个不同的列表,每个列表包含使用具有形状(3L,1L)的阵列的坐标,用于N个不同的光线。现在我使用一个(4L,3L)数组来存储每个新交叉点的光线的所有坐标,因为我想要矢量化'我的代码是为了加快速度。 (想象一下,如果我喜欢100k光线)。每当我想要计算下一个坐标,下一个折射方向等时,我都会超过光线的最先前坐标,这对我的函数来说是简单的ray_points[-1],并且函数可以直接计算到这个数组的所有内容,通过创建N个不同的列表并循环每个光线进行计算,这实际上比我之前的速度快得多。

现在的问题是,如果不同的光线具有不同数量的曲面交叉,因此不同数量的新坐标,我遇到了麻烦。例如,射线r1折射10次已经终止,所以我只有r1_1,r1_2 ... r1_10。但我仍然需要跟踪其他射线r2,r3,r4。由于我使用的是包含4条光线坐标的单个4X3阵列,因此我必须不断向r1添加坐标。我可以使用保持r1的新点/方向相同,但后来我只是浪费记忆,并想象如果所有光线都被终止并且我有一条光线继续行进并且有新的坐标,那么大部分元素ray_points实际上是多余的。

我想知道如何设置我的初始代码,以便我可以使用这种矢量化方法来加快速度,但我仍然可以保持原始方法的优势 - 分别处理每条光线以便我可以处理光线具有不同数量的新坐标。

0 个答案:

没有答案