#python #matplotlib
#python #matplotlib
Вопрос:
У меня есть функция, g(psi, k)
где psi
это массив из двух компонентов и k
это реальный параметр. Я хотел бы отобразить g
функцию на 3D контурном графике относительно координат, psi
заданных выбранным параметром k
. Как я могу сделать это на Python?
Я попытался использовать функцию contour3D
с функцией-оболочкой следующим образом:
import numpy as np
import matplotlib.pyplot as plt
k = 32 # Change this value to display different plots
# Wrapper of the g function
def f(x, y):
psi = np.array([x, y])
return g(psi, k)
x = np.linspace(-6, 6, 30)
y = np.linspace(-6, 6, 30)
X, Y = np.meshgrid(x, y)
Z = f(X, Y)
fig = plt.figure()
ax = plt.axes(projection='3d')
ax.contour3D(X, Y, Z, 50, cmap='binary')
plt.show()
Но я получаю следующую ошибку относительно строки Z = f(X, Y)
:
Ошибка значения: установка элемента массива с последовательностью.
Запуск просто:
print(f(-0.33, -0.5))
Я получаю реальное значение, как и ожидалось:
28.08105396614395
Как я могу это исправить? Есть ли какой-либо другой способ более простого отображения графика g(psi, 32)
?
Ответ №1:
Ваша функция, g(psi, k)
вероятно, работает только с psi
одномерным массивом, что означает, что только x и y являются скалярами. Либо вызывайте f
в цикле, либо векторизируйте g
функцию. Вот как вызвать функцию f
в цикле:
Z = np.empty(shape=(X.shape))
for row, (xx, yy) in enumerate(zip(X,Y)): # into rows
for col, (xxx, yyy) in enumerate(zip(xx,yy)): # rows to single values
Z[row, col] = f(xxx, yyy)
Комментарии:
1. Да, я подтверждаю то, что вы написали о
g
функции 🙂 ваш обходной путь работает, спасибо! Я дал ему 1, но я подожду еще немного, чтобы подтвердить его как правильный ответ. Я надеюсь, что есть более компактный способ сделать это. Еще раз спасибо!