1

我正在尝试创建 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 argument #1 must support iteration

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) 得到最终结果

4

2 回答 2

0

去除

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

部分,并重写 coords.append 到

coords.append(a1, b1, c1)

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

于 2019-06-11T05:57:07.427 回答
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]
于 2019-06-11T06:05:01.223 回答