使用mpl_toolkits.mplot3d在Python Numpy中使用vstack进行for循环的更快方法

时间:2017-12-01 16:25:59

标签: python numpy matplotlib mplot3d

我想绘制一个STL文件。我已经获得了STL-File的Vertex。目标是获得每个三角测量的面孔,这将由

完成
vtx=np.vstack((Vertex1[i],Vertex2[i],Vertex3[i]))

所以你可以看到Vertex1 [n]的每个第n个条目,Vertex2 [n],Vertex3 [n]属于同一个面。

通过

tri = a3d.art3d.Poly3DCollection([vtx])

我们正在获取3D多边形的集合,并将其与add_collection3d组合以绘制所有3D多边形。

所以现在我的问题是:在使代码更快的意义上,有没有办法在没有for循环的情况下进行下面的操作?

import numpy as np
import mpl_toolkits.mplot3d as a3d
import matplotlib.colors as colors
import matplotlib.pyplot as plt

Vertex1 = np.random.rand(9000,3)
Vertex2 = np.random.rand(9000,3)
Vertex3 = np.random.rand(9000,3)

ax = a3d.Axes3D(plt.figure())    

for i in range(Vertex1.shape[0]):
    vtx=np.vstack((Vertex1[i],Vertex2[i],Vertex3[i]))
    tri = a3d.art3d.Poly3DCollection([vtx])
    tri.set_color(colors.rgb2hex([0.9,0.6,0.]))
    tri.set_edgecolor('k')
    ax.add_collection3d(tri)
plt.show() 

谢谢!

1 个答案:

答案 0 :(得分:1)

除了创建每个都有一个三角形的9000个集合之外,创建一个包含9000个三角形的单个集合肯定更有效。

import numpy as np
import mpl_toolkits.mplot3d as a3d
import matplotlib.colors as colors
import matplotlib.pyplot as plt

Vertex1 = np.random.rand(9000,3)
Vertex2 = np.random.rand(9000,3)
Vertex3 = np.random.rand(9000,3)

ax = a3d.Axes3D(plt.figure())    

v = np.stack((Vertex1,Vertex2,Vertex3),axis=2)

tri = a3d.art3d.Poly3DCollection(v)
tri.set_color(colors.rgb2hex([0.9,0.6,0.]))
tri.set_edgecolor('k')
ax.add_collection3d(tri)
plt.show()