Python 2.7 python帮助-数组上的条件数学操作

Python 2.7 python帮助-数组上的条件数学操作,python-2.7,Python 2.7,我正在尝试学习python——但对OOP来说是新手。我想让函数fA,fB,fC一次作用于整个rθ空间,而不是一次作用于一个点。我的问题是当r为零时,条件(r1)发散) 从数学导入pi、sin、cos、exp 将numpy作为np导入 将matplotlib.pyplot作为plt导入 def fA(后、后、a、b、c): 如果(rr随机选择一个关系,可以使用numpy.where代替if…语义: fx = where( rr<=1, exp(rr - 1.) * cos(th), exp(

我正在尝试学习python——但对OOP来说是新手。我想让函数fA,fB,fC一次作用于整个rθ空间,而不是一次作用于一个点。我的问题是当r为零时,条件(r1)发散)

从数学导入pi、sin、cos、exp
将numpy作为np导入
将matplotlib.pyplot作为plt导入
def fA(后、后、a、b、c):

如果(rr随机选择一个关系,可以使用numpy.where代替if…语义:

fx = where( rr<=1, exp(rr - 1.) * cos(th), exp(1. - rr) * cos(th))

fx=where(rr如@mdurant所说的
np.where
np.meshgrid
将非常有用。下面,让我重新组织您的代码,并提供另一种避免Python循环的方法:

导入系统 从数学输入pi,sin,cos,exp 将numpy作为np导入 将matplotlib.pyplot作为plt导入 定义生成坐标(nx,ny): """ 在函数中生成坐标数据点以防止命名空间 污染。 """ dx=4./(nx-1) dy=4./(ny-1) X=np.零((ny,nx)) Y=np.零((ny,nx)) 对于范围内的ix(nx): 对于范围内的iy(纽约): X[iy,ix]=dx*(ix-(nx-1)/2) Y[iy,ix]=dy*(iy-(ny-1)/2) 返回np.sqrt(X**2+Y**2),np.arctan2(Y,X) nx=ny=101 r、 θ=_生成_坐标(101101) def calculate_numpy(): #基于向量的计算器的辅助方法。 def fA(后、后、a、b、c): #计算每个值,因为乘法不会给出NaN。 arrx=a*np.sin(th) arry=b*rr*np.cos(th) arrz=c*rr #使用特定条件覆盖值。 slct=rr>1 rr=rr[slct] th=th[slct] arrx[slct]=a/rr*np.sin(th) arry[slct]=b/rr*np.cos(th) arrz[slct]=c/rr 返回arrx,arry,arrz def fB(后、后、a、b、c): #计算每个值,因为乘法不会给出NaN。 arrx=b*np.sin(2.*th) arry=a*rr*np.cos(第2.*个) arrz=c*rr #使用特定条件覆盖值。 slct=rr>1 rr=rr[slct] th=th[slct] arrx[slct]=b/rr*np.sin(2.*th) arry[slct]=a/rr*np.cos(第2.*个) arrz[slct]=c 返回arrx,arry,arrz def fC(后、后、a、b、c): #计算每个值,因为乘法不会给出NaN。 arrx=np.exp(rr-1)*np.cos(th) arry=np.exp(rr-1)*np.sin(th) arrz=np.空的类(rr) arrz.填充(c) #使用特定条件覆盖值。 slct=rr>1 rr=rr[slct] th=th[slct] arrx[slct]=np.exp(1.-rr)*np.cos(th) arry[slct]=np.exp(1.-rr)*np.sin(th) arrz[slct]=c/rr 返回arrx,arry,arrz #进行计算。 Ax,Ay,Az=fA(r,θ,1.0,1.5) Bx,By,Bz=fB(r,θ,1.5,0.8,1.0) Cx,Cy,Cz=fC(r,θ,0.9,1.1,1.2) 返回Ax、Ay、Az、Bx、By、Bz、Cx、Cy、Cz def calculate_loop(): #循环计算器的助手方法。 def fA(后、后、a、b、c):
如果(rri)不认为您可以使用像X[iy,ix]这样的值,那么似乎这两个值都是先计算的,而不考虑条件。我希望条件计算可以节省时间并避免错误。例如>>>将numpy作为np>>>导入np.where(2>1,1,0.)数组(1.0)>>>np.where(2>1,1,1./0.)回溯(最后一次调用):文件“”,第1行,在np.where(2>1,1./0.)ZeroDivisionError:float division by zero`>>>导入numpy作为np'>>>>np.where(2>1,1,0.)''数组(1.0)'>>>np.where(2>1,1./0.)''回溯(最后一次调用):''文件“”,第1行,在''np where(2>1,1,1./0.)''ZeroDivisionError:float division by zero'这一点您是正确的,但它最简洁地表达了您的意思,并且仍然比循环快。如果您愿意,我可以发布一个替代方案。我认为生成100000除以零(以及其他分歧)错误和50%冗余未使用的求值将不是一件好事。真正的数学非常长,并且有各种对SciPy的特殊函数调用。如果您能建议另一种方法,那将非常好,谢谢!好的,我现在就试试……我收到一个错误,但我将尝试找出原因……
Traceback(最后一次调用):File“/Users/./Solution_from_Stackoverflow.py”,第182行,在main()文件中“/Users/./Solution_from_Stackoverflow.py”,第127行,在main calculate=globals()[“calculate_u”+sys.argv[1]]索引器中:在命令行中列出索引超出范围
,使用类似“python draw.py loop”或“python draw.py numpy”的参数运行它“。脚本将找到相应的
calculate_{loop,numpy}()
以供执行。时间也应在命令行中运行。
fx = where( rr<=1, exp(rr - 1.) * cos(th), exp(1. - rr) * cos(th))
fx = empty_like(rr)
fx[rr<=1] = exp(rr[rr<=1] - 1.) * cos(th[rr<=1])
fx[rr>1] = exp(1. - rr[rr>1]) * cos(th[rr>1]))
$ python -m timeit -s "import draw" "draw.calculate_loop()"
10 loops, best of 3: 95.2 msec per loop
$ python -m timeit -s "import draw" "draw.calculate_numpy()"
100 loops, best of 3: 2.11 msec per loop