用Python绘制3D条件函数

2024-06-16 22:58:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要做一个三维绘图,条件是在网格区域中(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: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

请,帮我把这个有条件的工作


Tags: importltnumpy网格区域绘图returnas
1条回答
网友
1楼 · 发布于 2024-06-16 22:58:40

您的错误来自这样一个事实:您将数组(由(x-(M/2))**2+(y-(N/2))**2与标量值r = 1225进行比较的结果)

这个结果是一个布尔值数组,不能按原样用作条件(参见this answer

按照@ImportanceOfBeingErnest的建议,在这种情况下应该使用^{}

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()

相关问题 更多 >