2

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

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 轴上,晶石的顶点在 1 轴上,( x,y,z) 2 轴上的坐标。我希望随着时间的推移添加一个额外的循环,这里的索引 i,可以解决问题,但我认为我放错了循环或以某种方式弄错了。

关于如何通过同时迭代来正确构建行集合的任何想法?

4

1 回答 1

1

我不明白你想要做什么,但我已经使用连接和重塑以更清晰的形式写了接近你上面的内容。我认为,如果您从这些方面考虑您的数据,您的任务将变得容易得多。波纹管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)
于 2013-10-29T22:17:40.660 回答