加速顺序检查一个点是否在Python中的形状

时间:2017-03-22 07:04:36

标签: python pandas matplotlib geometry vectorization

我有一个代码,用于顺序查看我DataFrame中找到的每对笛卡尔坐标是否属于某些几何封闭区域。但它很慢,我怀疑是因为它没有矢量化。这是一个例子:

from matplotlib.patches import Rectangle

r1 = Rectangle((0,0), 10, 10)
r2 = Rectangle((50,50), 10, 10)

df = pd.DataFrame([[1,2],[-1,5], [51,52]], columns=['x', 'y'])

for j in range(df.shape[0]):
    coordinates = df.x.iloc[j], df.y.iloc[j]
    if r1.contains_point(coordinates):
        df['location'].iloc[j] = 0
    else r2.contains_point(coordinates):
        df['location'].iloc[j] = 1

有人可以提出加速方法吗?

1 个答案:

答案 0 :(得分:3)

最好将矩形贴片转换为数组并在推断出它们展开的程度后对其进行处理。

cat ../util_files/list_NRPs.txt | xargs

对于给定的样本,函数输出:

enter image description here

<强> 基准:

def seqcheck_vect(df):
    xy = df[["x", "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))
    return df.assign(location=out)

def loopy_version(df): for j in range(df.shape[0]): coordinates = df.x.iloc[j], df.y.iloc[j] if rec1.contains_point(coordinates): df.loc[j, "location"] = 0 elif rec2.contains_point(coordinates): df.loc[j, "location"] = 1 else: pass return df 10K行上进行测试:

DF

因此,矢量化方法比循环方法快大约2200倍。