【发布时间】:2020-06-24 00:39:11
【问题描述】:
我有一个看起来像这样的点云:
红点是点,黑点是红点投影到 xy 平面。虽然它在图中不可见,但每个点也有一个值,当该点移动到 xy 平面时,该值被添加到给定像素。这些点由一个 numpy (np) 数组表示,如下所示:
points=np.array([[x0,y0,z0,v0],[x1,y1,z1,v1],...[xn,yn,zn,vn]])
将这些点放入某个图像的明显方法是通过一个简单的循环,如下所示:
image=np.zeros(img_size)
for point in points:
#each point = [x,y,z,v]
image[tuple(point[0:2])] += point[3]
现在这工作正常,但速度很慢。所以我想知道是否有某种方法可以使用矢量化、切片和其他聪明的 numpy/python 技巧来加速它,因为实际上我必须多次使用大型点云。我想出了一些使用np.put:
def points_to_image(xs, ys, vs, img_size):
img = np.zeros(img_size)
coords = np.stack((ys, xs))
#put the 2D coordinates into linear array coordinates
abs_coords = np.ravel_multi_index(coords, img_size)
np.put(img, abs_coords, ps)
return img
(在这种情况下,这些点被预先分割成包含 x、y 和 v 分量的向量)。虽然这很好用,但它当然只将最后一个点放在每个给定像素上,即它不是相加的。
非常感谢您的帮助!
【问题讨论】:
-
你很接近。缺少的位是
np.bincount。将它与您的 raveled 坐标作为第一个参数,将权重作为第二个参数,将图像大小作为第三个参数一起使用。
标签: python arrays numpy vectorization