Python 矢量化可以应用于由两个或多个函数定义的函数Z=f(X,Y)吗

Python 矢量化可以应用于由两个或多个函数定义的函数Z=f(X,Y)吗,python,numpy,Python,Numpy,我使用np.meshgrid()绘制一个标量函数:Z=f(X,Y) 当f(X,Y)由一个方程定义时,我没有问题。但是,当f(X,Y)被分成两个或多个方程时,例如: X, Y = np.meshgrid(x, y, sparse = True, indexing = 'ij') Z = f1(X,Y), y1 < y <= y2 Z = f2(X,Y), y > y2 X,Y=np.meshgrid(X,Y,sparse=True,index=ij) Z=f1(X,Y),y1Y

我使用np.meshgrid()绘制一个标量函数:Z=f(X,Y)

当f(X,Y)由一个方程定义时,我没有问题。但是,当f(X,Y)被分成两个或多个方程时,例如:

X, Y = np.meshgrid(x, y, sparse = True, indexing = 'ij')
Z = f1(X,Y), y1 < y <= y2
Z = f2(X,Y), y > y2
X,Y=np.meshgrid(X,Y,sparse=True,index=ij)
Z=f1(X,Y),y1
我不知道如何从meshgrid数组中提取“Y”的值,以便在条件语句中对照y1和y2进行检查。我尝试过几种方法,如下面的一种,但都无济于事:

row1, col1 = np.where(Y == y1)
row2, col2 = np.where(Y == y2)
if( Y > Y[row1][0] and Y <= Y[row2][0] ):
    Z = f1(X, Y)
elif ( Y > Y[row2][0] ):
    Z = f2(X, Y)
row1,col1=np。其中(Y==y1)
行2,col2=np,其中(Y==y2)
如果(Y>Y[row1][0]和Y[row2][0]):
Z=f2(X,Y)
当我使用数组计算Z时,执行速度非常慢,至少慢10到20倍,这取决于网格大小,与矢量化相比。 在这种情况下可以应用矢量化吗?怎样?
谢谢

如果分割是针对给定的常量x或y值,如您的示例中所示,您可以计算两个区域(y=y1)的函数,然后叠加结果:

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(-5, 5, 0.1)
y1 = np.arange(-5, 2, 0.1)
y2 = np.arange(2, 5, 0.1)

xx, yy1 = np.meshgrid(x, y1, sparse=True)
xx, yy2 = np.meshgrid(x, y2, sparse=True)

z1 = np.sin(xx**2 + yy1**2) / (xx**2 + yy1**2)
z2 = xx + yy2

z = np.vstack([z1,z2])
y = np.hstack([y1,y2])
h = plt.contourf(x,y,z)


但是,如果区域不是单独用x或y划分,而是用x+y划分,则这不起作用。

一般使用
np

z = np.where(Y <= y2, f1(X, Y), f2(X, Y))

请注意,如果您的某个函数在其范围外引发错误,您将得到错误,因为
np。其中
计算整个
X,Y
范围内的函数。在这种情况下,你会想尝试@Stef的方法

Daniel F。还有Stef,谢谢你的时间,我真的很感激!。两种解决方案都很有效。我将实施Daniel的解决方案,因为我已经有了类似的解决方案。然而,Stef的方法是一个很好的选择,因为我的应用程序中z=f(x,y)的表达式大约有3行长,所以为每个区域分别定义它将提高可读性并避免混乱。再次感谢!不客气。如果你喜欢的话,你可以对两个答案都投赞成票。斯特夫,我当然对两个答案都投了赞成票,但因为我的“声誉”。。。“感谢您的反馈!声誉低于15的人所投的票会被记录下来,但不会改变公开显示的帖子分数。”我想,随着我的“声誉”的提高,希望(LOL),投票结果会显示出来。再次感谢您的帮助。好的,没问题(我不知道升级投票需要最低声誉)。
Z = np.zeros_like(Y)  # same shape and dtype as `Y`
np.where(y1 < Y <= y2, f1(X, Y), out = Z)
np.where(y< y2, f2(X,Y), out = Z)