双迭代直线构造法

2024-07-07 08:21:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图建立一个线集合,以便在不同的时间步跟踪梁的变形。我用以下定义为一个时间步正确地画出了线:

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轴上,(x,y,z)坐标在2轴上。我希望随着时间的推移添加一个额外的循环,这里的索引I,会起到作用,但我认为我把循环放错了地方,或者以某种方式弄错了。你知道吗

关于如何通过同时迭代来正确构造行集合,有什么想法吗?你知道吗


Tags: infor时间reszip变形xezb
1条回答
网友
1楼 · 发布于 2024-07-07 08:21:44

我不明白你想做什么,但我已经写了一些接近你上面的东西,在一个更清晰的形式使用连接和重塑。我想如果你用这些术语来考虑你的数据,你的任务就会变得容易得多。下面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)

相关问题 更多 >