Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 网格框中的点计数_Python - Fatal编程技术网

Python 网格框中的点计数

Python 网格框中的点计数,python,Python,假设有一个网格,其中有一些点,如下图所示。 我的目标是计算网格中每个盒子的点数。这是我第一次尝试 for tupel in point_list: a=0 b=0 for i in self.boxvector: if tupel[0] < i: a=self.boxvector.index(i)-1

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

            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
点列表中的元组的
:
a=0
b=0
对于self.boxvector中的i:
如果元组[0]
它可以工作,但速度很慢。有没有办法加快速度

我使用名为
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,0]
。因此,每个框都有一个值,每次算法在相应框中找到一个点时,该值都会递增。点列表的形式为
点列表=[(x0,y0),(x1,y1),(x3,y3),…]


谢谢你的帮助

您可以计算位置。除以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
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()
只需考虑最大值,即可得到最大值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

鉴于您似乎已经在使用matplotlib,只需使用

例如:

>>> x,y = (0.8, -0.5)
>>> int((x + 1) / 0.5)
3
>>> int((y + 1) / 0.5)
1
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()

另请参见

matplotlib.nxutils.pnpoly()

matplotlib.nxutils.points\u in_poly()

多边形实用程序中非常快速高效的点。您只需基于栅格角点的顶点创建多边形


使用np.arange而不是np.linspace获得规则网格