假设有一个网格,其中包含一些点,如下图所示。 我的目标是计算每个网格的点数。这是我的第一次尝试。
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), ...]
感谢您的帮助!
答案 0 :(得分: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()
答案 1 :(得分:2)
另见
matplotlib.nxutils.pnpoly()
和
matplotlib.nxutils.points_inside_poly()
多边形实用程序中非常快速有效的点。您只需要根据网格角的顶点创建多边形。
答案 2 :(得分: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