绘制用布尔表达式定义的表面?

时间:2016-03-28 04:57:20

标签: python matplotlib boolean-expression mplot3d

我试图绘制一个定义如下的函数:

def f(x,y);
    if x==y:
        return x
    else:
        return x-y

现在语法上没有任何问题,除了我无法绘制它:

from numpy import mgrid
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
[X,Y] = mgrid[0:1:0,01,0:1:0.01]
fig = plt.figure()
ax = fig.gca(projection='3d')
surf = ax.plot_surface(X,Y,f(X,Y))

这会出现错误:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

这是由于Python试图将布尔函数应用于数组。我尝试用

重写函数
if np.equal(x,y)

作为测试,但这也不起作用。我知道我可以手动创建f(X,Y)值数组“所以可以说各种循环,但我想知道的是:有没有办法定义一个包含布尔条件的函数,哪个可以然后用matplotlib / pyplot轻松绘制?

1 个答案:

答案 0 :(得分:1)

在f的定义中,如果你期望x和y可以是数组(它们是数组),你必须做一些不同于"如果x == y:" - 例如"如果全部(x == y):"。

此外,您可能会遇到问题,然后使用[f(x,y)表示x,y表示拉链(X,Y)]。

或地图(f,* zip(* zip(X,Y))),如果你想更加惯用,但不太明显。

编辑:上面我假设你确实希望f接受数组,并且猜测all()可能就是你所需要的。