Python 将numpy数组的行划分为多个存储桶

Python 将numpy数组的行划分为多个存储桶,python,numpy,runtime,vectorization,numpy-ndarray,Python,Numpy,Runtime,Vectorization,Numpy Ndarray,我正在编写处理大型点云的代码。我已经能够成功地将我的大部分代码矢量化,以提高效率,但是,我想不出一个好方法来实现这一点: 我有一个nx3 numpy数组,它表示z>=0的3d(x,y,z)中的点。我想创建一个长度为k的列表,它是通过将numpy数组的行按z值对折生成的。i、 e.如果一个点的z值为$z_i$,那么该点应该进入bucket$j=\lfloor z_i/d\rfloor$,其中$d$是bucket的分辨率$d$预先计算为$z{max}/k$,其中k是固定数量的桶。现在,我尝试了以下方

我正在编写处理大型点云的代码。我已经能够成功地将我的大部分代码矢量化,以提高效率,但是,我想不出一个好方法来实现这一点:

我有一个nx3 numpy数组,它表示z>=0的3d(x,y,z)中的点。我想创建一个长度为k的列表,它是通过将numpy数组的行按z值对折生成的。i、 e.如果一个点的z值为$z_i$,那么该点应该进入bucket$j=\lfloor z_i/d\rfloor$,其中$d$是bucket的分辨率$d$预先计算为$z{max}/k$,其中k是固定数量的桶。现在,我尝试了以下方法:

buckets = [set() for _ in range(num_buckets)]
d = max_z / num_slices

for i in range(len(points)):
    p = points[i]
    k = int(math.floor(p[2] / d))
    buckets[min(k, num_buckets - 1)] |= {tuple(p)}
但是,这是非常低效的,因为我迭代了整个点数据集(非常大)。另一方面,它强调桶数的独立性。对于给定z值的点,我有一个闭合的索引形式,所以我不需要迭代桶列表

也就是说,num_bucket远小于点数,所以我还写了这个,它必须更快:

for i in range(num_buckets):
    ps = points[np.floor(in_fov[:,2] / d) == i]
    buckets[i] = ps
这当然更快了,但是现在运行时依赖于num_bucket,而且增长相当麻烦,因为我正在为每个bucket对一个大数组进行numpy过滤


我的问题是,是否有更好的方法可以做到这一点,允许我将nx3数组的每一行分配给一个列表索引,该索引允许我利用这样一个事实,即我可以独立计算每个点的索引,并希望消除对num_bucket的迭代。

一件事可以是只计算一次bucket
floor
根本不依赖于
i
,因此您只能在循环内部进行索引。如果您的目标是加快代码的速度,那么创建一组元组列表(即第一个解决方案中的
Bucket
)甚至一组数组(第二个解决方案)似乎不是一个很好的选择。您可能想简单地创建这样一个索引数组:<代码> BukKyStindex=Poo[[,2 ] /[(点:,2).Max()/ NUMIX桶] < /代码>,然后使用此方法在算法的下一步中直接选择相关行。