具有双重迭代的线构造

时间:2013-10-29 21:19:40

标签: python for-loop numpy matplotlib

我正在尝试构建一个线集合,以便在不同的时间步骤跟踪晶石的变形。我设法使用以下定义正确绘制一行时间线:

lstLines = [((xb, yb, zb), (xe, ye, ze)) for (xb, xe, yb, ye, zb, ze) in \
           zip(Spar_Res[i,:-1,0], Spar_Res[i,1:,0], Spar_Res[i,:-1,1], Spar_Res[i,1:,1],Spar_Res[i,:-1,2],Spar_Res[i,1:,2]) for i in range(Spar_Res.shape[0])]

这里(x,y,z)中的索引b和e代表段的开始和结束,Spar_Res是一个numpy数组,时间在0轴上,spar的顶点在1轴上以及2轴上的(x,y,z)坐标。我希望在这段时间内添加一个额外的循环,这里是索引i,可以解决这个问题,但我认为我错误地放置了循环,或者以某种方式弄错了。

关于如何通过沿着时间迭代正确构建线集合的任何想法?

1 个答案:

答案 0 :(得分:1)

我不明白你要做什么,但是我使用连接和重塑以更清晰的形式写了一些与你上面的内容相近的东西。我认为,如果您按照这些条款考虑您的数据,您的任务将变得更加容易。 Bellow T是时间点数,V是顶点数。

# This takes your data and creates a new array that is (T, V-1, 2, 3)
lstLines = np.concatenate((Spar_Res[:, :-1, None, :],
                           Spar_Res[:,  1:, None, :]), axis=2)
# This reshapes the array to be (T * (V - 1), 2, 3)
lstLines = lstLines.reshape(-1, 2, 3)

以上代码相当于:

lstLines = [((xb, yb, zb), (xe, ye, ze)) for i in range(Spar_Res.shape[0])
            for (xb, xe, yb, ye, zb, ze) in zip(Spar_Res[i,:-1,0], Spar_Res[i,1:,0],
                                                Spar_Res[i,:-1,1], Spar_Res[i,1:,1],
                                                Spar_Res[i,:-1,2], Spar_Res[i,1:,2]) 
           ]
lstLines = np.array(lstLines)