Я пытаюсь создать координаты x, y, z для создания набора данных высот. Я смог создать массивы x, y, z с помощью meshgrid, где z — постоянное значение.
(Это продолжение моего предыдущего вопроса, и я новичок в python)
Я также хочу создать наклонную местность, где z зависит от x.
Мне удалось создать массив с правильными значениями z. Однако при попытке объединить три массива (x, y, z) в координаты с помощью инструмента zip я получил эту ошибку:
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 был в формате с плавающей запятой, а не в 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)
Удалить
for a2, b2, c2 in zip(a1, b1, c1):
часть и переписать coords.append в
coords.append(a1, b1, c1)
Ошибка о том, что «должно быть итерируемым», заключается в том, что когда вы выполняете итерацию по zip (a, b, c), вы получаете кортеж целого числа, а не кортеж np.array.
У вас разные формы в этих двух версиях кода. Вы можете использовать код ниже, чтобы получить информацию:
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]