4

假设有一个网格,其中有一些点,如下图所示。 演示 我的目标是计算网格中每框的点数。这是我的第一次尝试。

            for tupel in point_list:
               a=0
               b=0
               for i in self.boxvector:
                  if tupel[0] < i:
                     a=self.boxvector.index(i)-1
                     break

               for i in self.boxvector:
                  if tupel[1] < i:
                     b=self.boxvector.index(i)-1
                     break

               farray[a][b]+=1

它有效,但速度很慢。有没有加快速度?

我使用一个名为的变量boxvector来定义网格。在这个例子中,boxvector 是:boxvector = [-1., -.5, 0, .5, 1.]。网格始终是二次方的,最大值为 -1 和 1。框通过 表示farray,看起来像farray = [[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]]。因此,每次算法在相应的框中找到一个点时,每个框都会增加一个值。point_list 具有以下形式point_list = [(x0,y0),(x1,y1),(x3,y3), ...]

感谢您的帮助 !

4

3 回答 3

7

看到您似乎已经在使用 matplotlib,只需使用numpy.histogram2d.

举个例子:

import numpy as np
import matplotlib.pyplot as plt

t = np.linspace(0, 4*np.pi, 100)
x = np.cos(3 * t)
y = np.sin(t)

gridx = np.linspace(-1, 1, 5)
gridy = np.linspace(-1, 1, 5)

grid, _, _ = np.histogram2d(x, y, bins=[gridx, gridy])

plt.figure()
plt.plot(x, y, 'ro')
plt.grid(True)

plt.figure()
plt.pcolormesh(gridx, gridy, grid)
plt.plot(x, y, 'ro')
plt.colorbar()

plt.show()

在此处输入图像描述

在此处输入图像描述

于 2012-06-13T14:48:28.413 回答
2

也可以看看

matplotlib.nxutils.pnpoly()

matplotlib.nxutils.points_inside_poly()

多边形实用程序中非常快速有效的点。您只需要根据网格角的顶点创建多边形。

http://matplotlib.sourceforge.net/api/nxutils_api.html

于 2012-06-13T14:53:10.070 回答
1

您可以计算位置。除以 0.5(盒子大小)。由于您的数组以 0 开头,但您的坐标以 -1 开头,因此在除法之前调整为 1。您将有 1 ( (1+1)/0.5 == 4) 的边缘情况,因此请确保它不会溢出 3。

这是一个例子:

>>> x,y = (0.8, -0.5)
>>> int((x + 1) / 0.5)
3
>>> int((y + 1) / 0.5)
1

只需考虑得到 3 的最大结果。所以:

>>> f_pos = lambda pos: min(int((pos + 1) / 0.5), 3)
>>> f_pos(x)
3
>>> f_pos(y)
1

所以,完成它:

f_pos = lambda pos: min(int((pos + 1) / 0.5), 3)
for x,y in point_list:
    f_array[f_pos(x)][f_pos(y)] += 1
于 2012-06-13T14:39:24.923 回答