python - 在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
值时没有问题,那么为什么不能在这里执行呢?X
Y
解决方案
首先,请注意您的函数在其第一个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()
推荐阅读
- javascript - setInterval() function not working as expected
- azure - How to reset sql admin password on Azure SQL Managed Instance?
- php - Symfony SELECT query returns all columns, except one with relation to other table?
- android - Android 错误:I/dalvikvm-heap: Grow heap (frag case) to 16.159MB for 1490086-byte
- vba - 从 vba 导入 csv 文件而不提供表名
- azure - MFA 服务器的 Azure MFA 状态报告(本地)
- c++ - 具有“自动”返回类型和 MSVC 2017 的模板函数的 invoke_result
- angular - 如何在 TypeScript 中中断方法执行
- unity3d - 我需要帮助在 Unity 中使用 AR CORE 在图像目标上创建 GameObject
- ios - RealmSwift - 将预先存在的类迁移到领域时如何覆盖哈希函数