Построение трехмерной условной функции в Python - PullRequest
0 голосов
/ 06 ноября 2019

Мне нужно сделать трехмерный график с условием, что в области сетки, где (x- (M / 2)) ^ 2+ (y- (N / 2)) ^ 2

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

M=70
N=70
r=(N/2)**2

def f(x, y):
    if (x-(M/2))**2+(y-(N/2))**2<r:
        return (x-(M/2))**2/122.5+(y-(N/2))**2/122.5
    return 10.0

x = np.linspace(0, 70, M)
y = np.linspace(0, 70, N)
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()

Но с этим условием есть какая-то ошибка, поэтому я получаю:

ValueError: Истинное значениемассив с более чем одним элементом неоднозначен. Используйте a.any () или a.all ()

Пожалуйста, помогите мне сделать эту условную работу.

1 Ответ

0 голосов
/ 06 ноября 2019

Ваша ошибка происходит из-за того, что вы сравниваете массив (результат (x-(M/2))**2+(y-(N/2))**2 снова скалярного значения r = 1225.

Этот результат является массивом логического типа, который нельзя использовать как есть. условие (см. этот ответ ).

В соответствии с рекомендациями @ImportanceOfBeingErnest, вы должны использовать np.where в этом случае.

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

M=70
N=70
r=(N/2)**2

def f(x, y):
    computed = (x-(M/2))**2+(y-(N/2))**2
    return np.where(computed < r, r / 122.5, 10.0)

x = np.linspace(0, 70, M)
y = np.linspace(0, 70, N)
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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...