【问题标题】:How do I create x,y,z coordinates from three arrays, where x and y are generated with meshgrid and z is dependent on x?如何从三个数组创建 x、y、z 坐标,其中 x 和 y 是使用 meshgrid 生成的,而 z 取决于 x?
【发布时间】:2019-06-11 14:05:01
【问题描述】:

我正在尝试创建 x、y、z 坐标以生成高程数据集。 我能够使用 meshgrid- 创建 x、y、z 数组,其中 z 是一个常数值。

(这是我上一个问题的后续,我是 python 新手)

我还想创建倾斜地形,其中 z 取决于 x。

我能够创建一个具有正确 z 值的数组。然而,当尝试使用 zip 工具将三个数组 (x,y,z) 组合成坐标时,我得到了这个错误:

    TypeError   Traceback (most recent call last)
<ipython-input-81-6454cf2caa60> in <module>
      3 for a, b, c in  zip(x_mesh, y_mesh, z_int):
     4     for a1, b1, c1 in zip(a, b, c):
----> 5         for a2, b2, c2 in zip(a1, b1, c1):
      6             coords.append((a2, b2, c2,))

TypeError: zip argument #1 must support iteration

下面的代码是针对一个小区域,作为在更大区域上创建坡度的测试。

我认为最初可能是因为我的 z 数组是 float 而不是 int,所以我对其进行了转换,但没有任何区别。

我将 z 作为常数的代码将 z 合并到 meshgrid 中,并且 coords[] 代码在该实例中运行良好。

sp=(10)
x=np.arange(313000, 333000, sp)
y=np.arange(6220000,6227000, sp)
z=15

x_mesh, y_mesh, z_mesh=np.meshgrid(x,y,z)


coords = []
for a, b, c in  zip(x_mesh, y_mesh, z_mesh):
    for a1, b1, c1 in zip(a, b, c):
        for a2, b2, c2 in zip(a1, b1, c1):
            coords.append((a2, b2, c2,))

但是,当我尝试使 z 依赖于 x 并且不将其包含在 meshgrid 进程中时,'coords=[]' 部分返回了错误: TypeError: zip 参数 #1 必须支持迭代

import numpy as np
sp=10
svx=313000
evx=313040
x=np.arange(svx,evx,sp)
y=np.arange(6220000,6220040,sp)

x_mesh, y_mesh =np.meshgrid(x,y)

evz=-30
totalnosteps=((evx-svx)/sp)-1

nosteps=((x_mesh-svx)/sp)

dedep=(evz/totalnosteps)

z=nosteps*dedep

z_int=z.astype(int)

coords = []
for a, b, c in  zip(x_mesh, y_mesh, z_int):
    for a1, b1, c1 in zip(a, b, c):
        for a2, b2, c2 in zip(a1, b1, c1):
            coords.append((a2, b2, c2,))

我追求 (x,y,z) 的最终结果

【问题讨论】:

    标签: python


    【解决方案1】:

    删除

    for a2, b2, c2 in zip(a1, b1, c1):
    

    part,并重写 coords.append 到

    coords.append(a1, b1, c1)
    

    关于“需要可迭代”的错误是因为当你迭代 zip(a, b, c) 时,你得到的是一个整数元组,而不是一个 np.array 元组。

    【讨论】:

      【解决方案2】:

      这两个代码版本的形状不同。您可以使用以下代码获取信息:

      print(x_mesh.shape)
      print(y_mesh.shape)
      print(z_mesh.shape)
      
      # code version one's output
      (700, 2000, 1)
      (700, 2000, 1)
      (700, 2000, 1)
      
      # code version two's output
      (4, 4)
      (4, 4)
      (4, 4)
      

      为了解决这个问题,可以使用下面的代码添加一维

      x_mesh = x_mesh[..., None]
      y_mesh = y_mesh[..., None]
      z = z[..., None]
      

      【讨论】:

        猜你喜欢
        • 2013-02-26
        • 2019-10-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-29
        • 1970-01-01
        • 1970-01-01
        • 2017-08-12
        相关资源
        最近更新 更多