我正在使用numpy.histogramdd将3d点归类。我的目标是计算包含多少个垃圾箱,它与特定点的距离小于一个常数。 numpy.histogramdd返回binedges,这是“描述每个维度的bin边缘的D数组的列表”,但是要找到bins坐标并不容易。有没有比我下面的方法更好的方法(并且循环更少)?

hist_bin_centers_list = [binedges[d][:-1] + (binedges[d][1:] - binedges[d][:-1])/2. for d in range(len(binedges))]
indices3d = itertools.product(*[range(len(binedges[d])-1) for d in range(len(binedges))])
ret_indices = []
for i,j,k in indices3d:
    bin_center = [bin[ind] for bin,ind in zip(hist_bin_centers_list, (i, j, k))]
    if hist[i,j,k]>0 and cdist([pos], [bin_center])[0] < max_dist:
        ret_indices.append((i,j,k))
return len(ret_indices)


感谢@DilithiumMatrix建议,这是一个更好的植入方法:

bin_centers = list(itertools.product(*hist_bin_centers_list))
dists = cdist([pos], bin_centers)[0].reshape(hist.shape)
hits = len(np.where((hist > 0) & (dists < approx))[0])

最佳答案

仅使用numpy.where怎么样?

例如将两个条件结合在一起:

nonzero = numpy.where( (hist > 0) & (binDist < max_dist) )


在其中计算距离数组binDist,例如binDist[i,j,k]是从bin i,j,kpos的距离。

10-07 18:23