使用Python高效地查找每个像素中的点

2024-10-03 21:34:21 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我还有一个很长的随机分布的2D点列表。我正在寻找一种有效的方法来寻找每个像素点的索引。你知道吗

目前我有以下几点:

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])  

我想知道有没有人知道怎么做得更快?你知道吗


Tags: inforlennprangerandom像素points
2条回答

我可以给你一个可能仍然有用的相关方法。相反,您可以找到每个点属于哪个像素。函数numpy.digitizescipy.stats.binned_statistic_2d在这里很有用。scipy.stats.binned_statistic_2d感觉有点笨拙,因为它不仅仅是存储点,还需要为每个x,y点提供一些值。你知道吗

您应该注意,bin编号从1(而不是0)开始计数。你知道吗

x_p, y_p = np.digitize(X_random_points, xgrid), np.digitize(Y_random_points, xgrid)

# OR #

_, _, _, (x_p, y_p) = scipy.stats.binned_statistic_2d(X_random_points, Y_random_points, np.zeros(len(X_random_points)), bins=(xgrid, ygrid), expand_binnumbers=True)

对于特定像素,您甚至可以从x_py_p中找到属于该像素的所有点。你知道吗

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

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_xdelta_y都是1。你知道吗

相关问题 更多 >