我正在努力解决与Matplotlib和Numpy有关的问题。
我正在尝试在地表上创建 hillshading 。
我的输入数据是从LiDAR导出的 XYZ点的不规则间距。
我可以生成trisurf3D图或3Dscatter 。保存它,更改相机角度,基于Z为其着色并设置动画,但是对于我一生来说,我根本无法得到任何阴影。
我被困在 Matplotlib,需要X,Y和Z的二维数组。我的输入数据实在是很小:376704点,每个点都有XYZ值。我已将这些点转换为从0开始的欧几里得坐标系:
from laspy.file import File as LAS
import numpy as np
def lasToNumpy(lasFile):
f = LAS(lasFile,mode='r')
## Establish min values
xmin = min(f.x)
ymin = min(f.y)
zmin = min(f.z)
## Arrays now in meters from 0 to max
x = np.array(f.x-xmin)
y = np.array(f.y-ymin)
z = np.array(f.z-zmin)
## Assign a max of each x and y
xmax = max(x)
ymax = max(y)
问题是我的下一步是创建网状网格(这似乎是生成2D数组所必需的)。 这会消耗大约50GB的RAM:
X, Y = np.meshgrid(x,y)
理所当然的。
我要做的就是在我的表面上添加阴影,但是整个2D数组似乎在逻辑上是不必要的!我在这里有什么选择?难道这不会发生吗?作为参考,我的trisurf3D工作正常:
fig = plt.figure(figsize=(60.0,60.0))
ax = fig.add_subplot(111, projection='3d')
ax.plot_trisurf(x,y,z, cmap='plasma', edgecolor='black', alpha=0.5)
真的也想在这里扔一些山顶阴影。
答案 0 :(得分:0)
这个问题现在可能已经过时了,但对于其他用户来说,这里的问题是您正在尝试使用 np.meshgrid
在每个方向上制作 376704 个点的网格。 np.meshgrid
的目的是获取 x 和 y 范围并创建网格。例如:
x=np.arange(0,100) #1D array
y=np.linspace(-50,50,1111) # 1D array
xgrid,ygrid=np.meshgrid(x,y) #Outputs 2D arrays
仅当您想对数据进行网格化时才使用 np.meshgrid
。您可以使用 3D 插值器(例如 RegularGridInterpolator
)将数据网格化以降低分辨率,这是解决问题和创建山丘的一种方法。
在我看来,一个更快更好的选择是使用 tricontourf
。该函数接受您必须创建所需的山体阴影图形的一维数组。如果您无法解决此问题,请使用一些数据更新您的问题。