如何从三个数组创建x,y,z坐标,其中x和y是使用meshgrid生成的,而z取决于x?

时间:2019-06-11 05:28:10

标签: python

我正在尝试创建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)

2 个答案:

答案 0 :(得分:0)

删除

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

部分,然后重写coords.append

coords.append(a1, b1, c1)

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

答案 1 :(得分:0)

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

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]