内存不足:np.meshgrid

时间:2019-11-22 10:14:03

标签: python python-3.x numpy matplotlib

我正在努力解决与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) 

真的也想在这里扔一些山顶阴影。

1 个答案:

答案 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。该函数接受您必须创建所需的山体阴影图形的一维数组。如果您无法解决此问题,请使用一些数据更新您的问题。