猿问

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

我想使用 2 变量函数 Z(X,Y) 生成等值线图。但是,我想施加一个条件,当 X 小于/大于某个值时更改函数。这样的更改将允许我仅使用单行plt.contour(即我不想创建两个单独定义的函数,这会导致使用两个单独的绘图命令行)。

我继续遇到(我认为的)真理/逻辑错误。我的猜测是 numpy 网格网格的某些方面不符合函数的条件“切换”。下面附上显示该概念的简短代码以及完整的回溯错误。如果有任何不清楚的地方,或者我提供的内容不足以解释我的问题,请随时在下面发表评论。


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


POPMUISE
浏览 156回答 3
3回答

慕的地10843

您可以简单地使用numpy.where().你必须通过:条件作为第一个参数如果条件为真,则从中选择值作为第二个参数如果条件为假,则从中选择值作为第三个参数这样,你的z()函数就变成了:def z(x, y):     return np.where(x < 20,                     np.sin(x) + np.cos(y),                     np.tan(x*y))生成的情节:

守着一只汪

一切都很好,但你必须改变比较np.any(x<20)。这意味着如果 x 的任何元素大于 20。np.all如果您想在数组的每个元素都满足条件时执行此操作,也可以使用 ,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):&nbsp; &nbsp; if np.any(x < 20):&nbsp; &nbsp; &nbsp; &nbsp; return np.sin(x) + np.cos(y)&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; else:&nbsp; &nbsp; &nbsp; &nbsp; return np.tan(x * y)Z = z(X,Y)plt.contourf(X, Y, Z)plt.xlabel('x')plt.ylabel('y')plt.colorbar()

郎朗坤

numpy 数组中的真实性测试是按元素进行的,import numpy as npX =&nbsp; np.array([1,2,3,4])print(X<3)输出:[真真假假]您可以使用.all()或.any(),具体取决于您是否希望所有或任何元素满足条件print((X<3).all())输出:假
随时随地看视频慕课网APP

相关分类

Python
我要回答