Как создать координаты x, y, z из трех массивов, где x и y генерируются с помощью meshgrid, а z зависит от x?

Я пытаюсь создать координаты 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)

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
161
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Удалить

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]

Другие вопросы по теме