首页 > 解决方案 > 内存不足:np.meshgrid

问题描述

我正在努力解决与 Matplotlib 和 Numpy 相关的问题。

我正在尝试在我的地块上创建山体阴影。

我的输入数据是来自 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)

问题是我的下一步是创建一个网格网格(似乎需要生成一个二维数组)。这会消耗大约 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) 

真的很想在那里放一些山丘阴影。

标签: pythonpython-3.xnumpymatplotlib

解决方案


这个问题现在可能已经过时了,但对于其他用户来说,这里的问题是您正在尝试使用np.meshgrid. 的目的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. 该函数接受您必须创建所需的山体阴影图形的一维数组。如果您无法使其正常工作,请使用一些数据更新您的问题。


推荐阅读