为了账号安全,请及时绑定邮箱和手机立即绑定

matplotlib 等高线图中的条件函数变化

matplotlib 等高线图中的条件函数变化

POPMUISE 2023-08-22 16:57:34
我想使用 2 变量函数 Z(X,Y) 生成等值线图。但是,我想施加一个条件,当 X 小于/大于某个值时更改函数。这样的更改将允许我仅使用单行plt.contour(即我不想创建两个单独定义的函数,这会导致使用两个单独的绘图命令行)。我继续遇到(我认为的)真理/逻辑错误。我的猜测是 numpy 网格网格的某些方面不符合函数的条件“切换”。下面附上显示该概念的简短代码以及完整的回溯错误。如果有任何不清楚的地方,或者我提供的内容不足以解释我的问题,请随时在下面发表评论。import numpy as npimport matplotlib.pyplot as pltX = np.linspace(0,50,100)Y = np.linspace(0,50,100)X, Y = np.meshgrid(X,Y)def z(x,y):    if x < 20:        return np.sin(x) + np.cos(y)        else:        return np.tan(x * y)Z = z(X,Y)plt.contourf(X, Y, Z)plt.xlabel('x')plt.ylabel('y')plt.colorbar()ValueError                                Traceback (most recent call last)<ipython-input-29-7e200be093e6> in <module>     16      17 ---> 18 Z = z(X,Y)     19      20 plt.figure(figsize=(8,6))<ipython-input-29-7e200be093e6> in z(x, y)      9      10 def z(x,y):---> 11     if x < 20:     12         return np.sin(x) + np.cos(y)     13 ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()```
查看完整描述

3 回答

?
慕的地10843

TA贡献1785条经验 获得超8个赞

您可以简单地使用numpy.where().
你必须通过:

  • 条件作为第一个参数

  • 如果条件为真,则从中选择值作为第二个参数

  • 如果条件为假,则从中选择值作为第三个参数

这样,你的z()函数就变成了:

def z(x, y):
    return np.where(x < 20,
                    np.sin(x) + np.cos(y),
                    np.tan(x*y))

生成的情节:

https://img2.sycdn.imooc.com/64e478ad00019e7c05700450.jpg

查看完整回答
反对 回复 2023-08-22
?
守着一只汪

TA贡献1872条经验 获得超3个赞

一切都很好,但你必须改变比较np.any(x<20)。这意味着如果 x 的任何元素大于 20。np.all如果您想在数组的每个元素都满足条件时执行此操作,也可以使用 ,


import numpy as np

import matplotlib.pyplot as plt



X = np.linspace(0,50,100)

Y = np.linspace(0,50,100)

X, Y = np.meshgrid(X,Y)



def z(x,y):


    if np.any(x < 20):

        return np.sin(x) + np.cos(y)

    

    else:

        return np.tan(x * y)



Z = z(X,Y)



plt.contourf(X, Y, Z)

plt.xlabel('x')

plt.ylabel('y')

plt.colorbar()


查看完整回答
反对 回复 2023-08-22
?
郎朗坤

TA贡献1921条经验 获得超9个赞

numpy 数组中的真实性测试是按元素进行的,


import numpy as np

X =  np.array([1,2,3,4])

print(X<3)

输出:[真真假假]


您可以使用.all()或.any(),具体取决于您是否希望所有或任何元素满足条件


print((X<3).all())

输出:假


查看完整回答
反对 回复 2023-08-22
  • 3 回答
  • 0 关注
  • 111 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信