首页 > 解决方案 > 使用 Python 有效地查找每个像素中的哪些点

问题描述

我有一个代表一组像素的二维网格。对于每个像素,我都有左上角的坐标。

我还有一长串随机分布的二维点。我正在寻找一种有效的方法来查找每个像素中存在的点的索引。

目前我有以下内容:

import numpy as np
xgrid = np.linspace(0,10,11)
ygrid = np.linspace(0,10,11)

X_random_points = np.random.rand(int(1e7))*10
Y_random_points = np.random.rand(int(1e7))*10

for iterationX in range(0,len(xgrid)-1):
    for iterationY in range(0,len(ygrid)-1):
        valuesInCube = (X_random_points<xgrid[iterationX]) & (X_random_points>xgrid[iterationX-1]) & (Y_random_points<ygrid[iterationY]) &(Y_random_points>ygrid[iterationY-1])  

我想知道是否有人知道如何使这个更快?

标签: pythonnumpy

解决方案


您可以使用np.floor矢量化整个操作并避免完全循环,只要像素之间的间隔在每个方向上是均匀的。对于您的简单情况, wherexgridygrid是整数,您可以这样做

X_random_points = ...
Y_random_points = ...
x_pixels = np.floor(X_random_points)
y_pixels = np.floor(Y_random_points)

如果您的像素不在整数网格上,您必须知道它们之间的分隔。在这种情况下,我建议使用np.arange而不是np.linspace生成像素位置:

delta_x, delta_y = 0.5, 0.5
xgrid = np.arange(0, 5.1, delta_x)
ygrid = np.arange(0, 5.1, delta_y)

X_random_points = np.random.rand(int(1e7)) * 5
Y_random_points = np.random.rand(int(1e7)) * 5

x_pixels = np.floor(X_random_points / delta_x)
y_pixels = np.floor(Y_random_points / delta_y)

对于整数情况,您确实在做同样的事情,因为两者都是,delta_x然后都是。delta_y1


推荐阅读