python - Python:将点分配给 bin 的更快或无循环方式?
问题描述
我有一个由 N 个 2D 点组成的 N×2 数组,我想将其分配给一个 M×K 的 bin 网格。
例如,点[m + 0.1, k]
和[m + 0.1, k + 0.9]
应该落入 bin [m, k]
,其中m
和k
都是整数。一个点可能不会落入任何垃圾箱。
在实现方面,我希望将结果存储在逻辑 M×K×N 数组中,如果 point落入 bin中,则in_bin
在哪里。in_bin[m, k, n]
True
n
[m, k]
这就是我这样做的方式,天真地使用双循环。
M = 10
K = 11
N = 100
pts = 20 * np.random.rand(N, 2)
in_bin = np.zeros((M, K, N), dtype=bool)
for m in range(M):
for k in range(K):
inbin_h = (pts[:, 0] >= m) & (pts[:, 0] < (m + 1))
inbin_w = (pts[:, 1] >= k) & (pts[:, 1] < (k + 1))
in_bin[m, k, np.where(inbin_h & inbin_w)[0]] = True
解决方案
您可以使用histogram2d
以下方法执行此操作:
hist = np.dstack(np.histogram2d([pts[i,0]],[pts[i,1]],bins=[np.arange(M+1),np.arange(K+1)])[0] for i in range(len(pts)))
它只涉及点数的单个 for 循环。如果 N 远小于 M*K 这应该更快。
这是另一种没有任何 for 循环的方法,使用searchsorted
which 是什么histogram2d
用途:
def bin_points(pts, m, k):
binsx = np.arange(m+1)
binsy = np.arange(k+1)
index_x = np.searchsorted(binsx,pts[:,0]) - 1
index_y = np.searchsorted(binsy,pts[:,1]) - 1
# mask out values which fall outside the bins
mask = (index_x >= 0) & (index_x < m) & (index_y >= 0) & (index_y < k)
index_x = index_x[mask]
index_y = index_y[mask]
n = np.arange(pts.shape[0])[mask]
in_bin = np.zeros((M, K, pts.shape[0]), dtype=bool)
in_bin[index_x,index_y,n] = 1
以下是一些基准:
M = 10,K = 11,N = 100
In [2]: %timeit bin_points(pts,M,K)
10000 loops, best of 3: 34.1 µs per loop
In [3]: %timeit bin_points_double_for_loop(pts,M,K)
1000 loops, best of 3: 1.71 ms per loop
In [4]: %timeit bin_points_broadcast(pts,M,K)
10000 loops, best of 3: 39.6 µs per loop
M = 100,K = 110,N = 1000
In [2]: %timeit bin_points(pts,M,K)
1000 loops, best of 3: 721 µs per loop
In [3]: %timeit bin_points_double_for_loop(pts,M,K)
1 loop, best of 3: 249 ms per loop
In [4]: %timeit bin_points_broadcast(pts,M,K)
100 loops, best of 3: 3.04 ms per loop
推荐阅读
- highcharts - Highcharts wrap 不是一个函数
- python - 当我运行我的代码时,它会打开窗口但不显示图像
- php - php5. 是否可以以某种方式并行运行 2 个功能?
- python - 为什么我的列表不能直接存储对象?(我的列表只是创建和存储一个元组,元组存储对象)
- javascript - vuetify v-menu 组件中的激活器插槽重新定义
- oracle - 全部插入
- apache - 动态附件文件名
- java - Why does Retrofit use Interface instead of a normal java class?
- go - Go 如何在没有内置 Comparable 接口的情况下处理比较?
- php - 如何仅在 woocommerce 的商店页面上显示有货的变体?