使用“min”的函数的级别集

时间:2015-10-13 14:33:07

标签: python function matplotlib min

更新

总结一下我在下面的帖子,我很难绘制涉及'min'的级别函数集,例如以下函数:

WndProc

我用来绘制关卡集的代码是:

Form

适用于涉及常规算术运算(+, - ,**,*,/)的函数。使用函数def f(x,y): return min(x,x-y,x**2,y+1) ,我有这个错误:

import matplotlib.pyplot as plt
import numpy as np

plt.ion()
x_ = np.linspace(-180,180,num=40)
y_ = np.linspace(-180,180,num=40)
x,y = np.meshgrid(x_,y_)
levels = f(x,y)
c = plt.contour(x,y,levels,50)
plt.colorbar()
plt.show()

指向f的返回行。 如何绘制函数ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 的级别集?

初次发布

我正在尝试绘制两个函数f1和f2的级别集,其定义如下:

f

这是我绘制关卡集的代码:

f

我的情节似乎与函数A = -73.95, 48.73 L=180 ######## f1 def distance(a,b): """ a and b tuples """ return np.sqrt((a[0]-b[0])**2+(a[1]-b[1])**2) def f1(x,y): """ simple distance """ p = x,y #print p return distance(p,A) ######## f2 def images(p): """ p tuple """ #print "len(p) in images : "+str(len(p))+"\n" #print p pHC = (p[0],p[1]+L) pHR = (p[0]+L,p[1]+L) pHL = (p[0]-L,p[1]+L) pCR = (p[0]+L,p[1]) pCL = (p[0]-L,p[1]) pDC = (p[0],p[1]-L) pDR = (p[0]+L,p[1]-L) pDL = (p[0]-L,p[1]-L) return pHC,pHR,pHL,pCR,pCL,pDC,pDR,pDL def minD(p,focal): """ distance with images (p and focal are tuples) """ #print p pHC,pHR,pHL,pCR,pCL,pDC,pDR,pDL = images(p) dHC = distance(focal,pHC) dHR = distance(focal,pHR) dHL = distance(focal,pHL) dCR = distance(focal,pCR) dCL = distance(focal,pCL) dDC = distance(focal,pDC) dDR = distance(focal,pDR) #print "len(dHC) : "+str(len(dHC)) #print "len(dHC[0]) : "+str(len(dHC[0])) #print dHC d = min([dHC,dHR,dHL,dCR,dCL,dDC,dDR,dDL,distance(p,focal)]) return d def f2(phi,psi): p = phi,psi return minD(p,A) 一致(至少没有代码错误)。但是,对于函数import matplotlib.pyplot as plt import numpy as np plt.ion() x_ = np.linspace(-180,180,num=40) y_ = np.linspace(-180,180,num=40) x,y = np.meshgrid(x_,y_) levels1 = f1(x,y) #levels2 = f2(x,y) c = plt.contour(x,y,levels,50) #c = plt.contour(x,y,levels2,50) plt.colorbar() plt.show() ,我在f1的最后一行前面有一个错误:

f2

通过一些打印,我可以发现我执行min的列表元素(在minD函数中)是 d = min([dHC,dHR,dHL,dCR,dCL,dDC,dDR,dDL,distance(p,focal)]) ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 的情况下的数组而不是minD的单个元素。 1}}。 如何绘制函数f2的水平集?

2 个答案:

答案 0 :(得分:2)

你想调用min的numpy版本,而不是python的版本,它希望数字作为输入,并给你最少的 - 这是ValueError的来源。 numpy有两个版本; np.min np.minimum np.min 将为您提供数组的最小值(因此为数字), np.minimum 将为数组提供逐点最小值(因此另一个数组) 。你想要后者。

不幸的是,我认为你不能简单地做 np.minimum(array1,array2,array3)就好了,所以我认为你需要嵌套 np.minimum 电话。虽然如果经常这样做,我认为你可以创建一个函数来嵌套这些调用,使其更容易阅读。这就是我得到的,似乎有效:

def f(x,y):
    return np.minimum(np.minimum(np.minimum(x,x-y),x**2),y+1)

plt.figure()

x_ = np.linspace(-180, 180, num=200)
y_ = np.linspace(-180, 180, num=200)
x,y = np.meshgrid(x_, y_)

levels = f(x, y)

c = plt.contour(x, y, levels, 50)
plt.colorbar()

这会产生:

enter image description here

(注意,我将数字从40增加到200以帮助matplotlib使用非光滑部分)

答案 1 :(得分:0)

最后,我会直截了当而不使用meshgrid的{​​{1}}函数:

numpy

这与x=np.linspace(-180,180,num=40) y=np.linspace(-180,180,num=40) levels=np.zeros((len(x),len(y))) for i in range(len(x)): for j in range(len(y)): levels[i,j]=f2(x[i],y[j]) plt.contour(x,y,levels.T) 函数的情况并非最佳,但我宁愿使用它而不是了解meshgrid中我的数据的内容。不幸的是,我没有时间。

输出: enter image description here