Python 高效重复numpy.where

Python 高效重复numpy.where,python,pandas,numpy,where,computational-geometry,Python,Pandas,Numpy,Where,Computational Geometry,我有一个代码,我想在其中检查坐标对是否落在某些矩形中。但是,有许多矩形,我不知道如何将下面的代码推广到许多矩形。我只能在一个循环中使用eval来完成它,但这太难看了 下面是一个代码,它检查由坐标组成的数据帧的每个条目指向哪个矩形。如果属于第一个,则分配0,第二个为1,否则分配一个nan。我希望有这样一个代码,它可以产生类似的结果,假设我们有一个大的矩形对象列表,而不必在最后一行应用eval或循环。非常感谢 from matplotlib.patches import Rectangle rec

我有一个代码,我想在其中检查坐标对是否落在某些矩形中。但是,有许多矩形,我不知道如何将下面的代码推广到许多矩形。我只能在一个循环中使用
eval
来完成它,但这太难看了

下面是一个代码,它检查由坐标组成的
数据帧的每个条目指向哪个矩形。如果属于第一个,则分配0,第二个为1,否则分配一个
nan
。我希望有这样一个代码,它可以产生类似的结果,假设我们有一个大的矩形对象列表,而不必在最后一行应用
eval
或循环。非常感谢

from matplotlib.patches import Rectangle

rec1 = Rectangle((0,0), 100, 100)
rec2 = Rectangle((100,0), 100, 100)
x = np.random.poisson(100, size=200)
y = np.random.poisson(80, size=200)
xy = pd.DataFrame({"x" : x, "y" : y}).values
e1 = np.asarray(rec1.get_extents())
e2 = np.asarray(rec2.get_extents())
r1m1, r1m2 = np.min(e1), np.max(e1)
r2m1, r2m2 = np.min(e2), np.max(e2)
out = np.where(((xy >= r1m1) & (xy <= r1m2)).all(axis=1), 0, 
               np.where(((xy >= r2m1) & (xy <= r2m2)).all(axis=1), 1, np.nan))
从matplotlib.patches导入矩形
rec1=矩形((0,0),100100)
rec2=矩形((100,0),100100)
x=np.随机.泊松(100,尺寸=200)
y=np.随机泊松(80,尺寸=200)
xy=pd.DataFrame({“x”:x,“y”:y}).value
e1=np.asarray(rec1.get_extents())
e2=np.asarray(rec2.get_extensts())
r1m1,r1m2=np.最小值(e1),np.最大值(e1)
r2m1,r2m2=np.最小值(e2),np.最大值(e2)

out=np。其中((xy>=r1m1)&(xy=r2m1)&(xy=r1m1)&(xy=r2m1)&(xy=r3m1)&(xy嵌套式,这样的嵌套式很难阅读和扩展:

where(cond1, 0, where(cond2, 1, where(cond3, 2, ..)))
您将从其他问题中看到,
where
最常用于生成索引,即
I,J=np.where(cond)
版本,而不是
np.where(cond,0,x)
版本

所以,为了清楚起见,我很想把你的代码写成

res = xy.copy()   # or np.zeros_like(xy)
for i in range(n):
    ij = np.where(cond[i]
    res[ij] = i

matplotlib有一个内置例程
包含点
,用于检查一个点是否包含在速度相当快的多边形对象中

from matplotlib.patches import Rectangle

rec1 = Rectangle((0, 0), 100, 100)
rec1.contains_point((1, 1))
# True
rec1.contains_point((101, 101))
# False

这里有一个矢量化方法,使用-

2) 查看
rec3
的扩展数据块:

In [317]: e3
Out[317]: 
array([[ 100.,  100.],
       [ 200.,  200.]])
3) 为
xy
随机获得5分:

In [319]: x = np.random.poisson(100, size=5)
     ...: y = np.random.poisson(100, size=5)
     ...: xy = pd.DataFrame({"x" : x, "y" : y}).values
     ...: 
4) 让我们设置
pt[1]
,使其内部
rec3
。因此,该pt的o/p应为
2

In [320]: xy[1] = [150,175]
5) 让我们设置
pt[3]
,使其位于所有矩形之外。因此,对应的o/p应为
NaN

In [321]: xy[3] = [400,400]
6) 运行发布的代码并打印输出:

In [323]: out
Out[323]: array([ nan,   2.,   2.,  nan,   2.])

如图所示,
out[1]
2
out[3]
NaN
,这是前面预计的。

是否使用循环?我没有看到任何。谢谢@Divakar,我没有使用循环。但是我不知道如何有一个类似于最后一行的行,它将通过许多矩形(不仅仅是2个),而没有循环。因此,如果并且仅当pt在所有给定矩形的范围内,那么
xy
中的每个pt的输出
out
将是
1
?此外,我们是否可以假设所有矩形的范围都存储在一个多维数组中,就像一个3D数组一样?对于2个矩形,是的。但我想概括一下这段代码,在给定矩形对象列表的情况下,对每对坐标所属的矩形进行有效分类。你能添加另一个矩形对象并向我们显示预期的输出吗?
In [320]: xy[1] = [150,175]
In [321]: xy[3] = [400,400]
In [323]: out
Out[323]: array([ nan,   2.,   2.,  nan,   2.])