python - 内存不足 : np. meshgrid

标签 python python-3.x numpy matplotlib

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

我正在尝试创建 山体阴影 在我的表面图上。

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

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

最佳答案

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

关于python - 内存不足 : np. meshgrid,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58992019/

相关文章:

python-3.x - 如何使用存储在 csv 中的情绪分析数据的 Pandas 绘制多折线图

python / NumPy : Remove empty (zeroes) border of 3D array

python - 根据 bool 值列表过滤列表

python - 标准化具有多个零的像素输入数据

python - SQLalchemy 0.7 的任何示例,更新使用 from_statement()

python - 如何从 HTML 页面中检索字符集

python - 通过从 Pandas 数据框中的非缺失值中随机选择来填充缺失数据

python - 如何从 JSON 文件中删除反斜杠

python - 预期类型 'Iterable[SupportsLessThan | Any]' (匹配泛型类型 'Iterable[SupportsLessThanT]' ),却得到 'object'

python - py.test 2.3.5 在 fixture 失败后不运行终结器