首页 > 解决方案 > 在python中绘制一个用matplotlib分段定义的函数

问题描述

我正在尝试绘制一个我分段定义的函数。举个例子,取

def f(x,y):
    if x in I.open(0, 1):
        if y in I.open(0, 1):
            return (x+y)
        else:
            return(0)

然后我将 Z 定义如下:

X = np.arange(-5, 5, 0.25)
Y = np.arange(-5, 5, 0.25)
X, Y = np.meshgrid(X, Y)

Z = f(X,Y)

如果我运行它,我会得到:

ValueError:具有多个元素的数组的真值不明确。使用 a.any() 或 a.all()

我已经看到了类似问题的一些答案,但是我无法用我读过的任何东西来解决这个问题。我理解(我认为)问题出在语句中,if x in I.open(0,1)...因为运行f(X,Y)询问是否X在中,I.open(0,1)并且由于 X 是一个数组,因此对于某些元素可能是正确的,X而对于其他元素则不是。但是,当您绘制类似 的函数时,计算机在确定每一步使用和的Z=X+Y值时没有问题,那么为什么不能在这里执行呢?XY

标签: pythonmatplotlib

解决方案


首先,请注意您的函数在其第一个if-test 为False. 你需要一个else零件if x in I.open(0, 1):

现在,您想以矢量化(numpy)方式使用您的函数。Python if-tests 不能以这种方式使用。通常,np.where可以代替使用。

目前尚不清楚I.open()来自哪里。您的代码缺少必要的导入。假设它代表开区间]0,1[,函数可以写成向量化形式:

import numpy as np

def f(x, y):
    return np.where((x > 0) & (x < 1) & (y > 0) & (y < 1),  # condition
                    x + y,  # result of the if clause
                    0)  # result of the else clause

请注意,&用于logical AND(|将是logical OR) 的矢量化版本。由于 Python 运算符的重载,通常需要比编写标准表达式时更多的括号。使用数组作为输入,向量化负责分别为每个元素执行函数。

这是一些绘制结果的示例代码,使用了更多点:

import matplotlib.pyplot as plt
import numpy as np

def f(x, y):
    return np.where((x > 0) & (x < 1) & (y > 0) & (y < 1),  # condition
                    x + y,  # result of the if clause
                    0)  # result of the else clause

X1d = np.linspace(-5, 5, 100)
Y1d = np.linspace(-5, 5, 100)
X, Y = np.meshgrid(X1d, Y1d)

Z = f(X, Y)

plt.imshow(Z, extent=[X1d[0], X1d[-1], Y1d[0], Y1d[-1]], interpolation='nearest')
plt.xticks(range(-5, 6))
plt.yticks(range(-5, 6))
plt.grid(True, ls=':', color='white')
plt.colorbar()
plt.show()

绘制矢量化函数的结果


推荐阅读