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获得规则网格