Numpy Sum数组坐标到数组的高效转换

m4pnthwp  于 2022-12-26  发布在  其他
关注(0)|答案(2)|浏览(136)

给定一个点数组

points = np.array([[1,1,1], [0,1,1], [1,0,0], [1,1,1]])

创建一个计算坐标的数组,表示:

r = [[0,0],  [[1,0],
     [0,1]],  [0,2]]

这意味着坐标[1,1,1]存在两次,因此在位置[1,1,1]处,在结果阵列中存在2
在普通的python中,这将是:

for p in points:
    r[p[0]][p[1]][p[2]] += 1

我需要在一个实时应用程序的上下文中,有高达300k点每帧和一个高达400x400x400的矩阵形状,所以速度是重要的。点的数量和形状的结果矩阵动态变化。
我是numpy的新手,还没有找到一种有效的方法来做到这一点,用普通的python for循环来做太慢了,每帧需要一秒钟。

myzjeezk

myzjeezk1#

请考虑以下几点。

points = np.array([[1,1,1], [0,1,1], [1,0,0], [1,1,1]])

unique, counts = np.unique(points, return_counts = True, axis = 0)
n = 1+np.max(unique)
r = np.zeros([n,n,n], dtype = int)
r[tuple(unique.T)] = counts

(* 注:* 上面最后一行相当于r[unique[:,0],unique[:,1],unique[:,2]] = counts)。
结果数组r:

[[[0 0]
  [0 1]]

 [[1 0]
  [0 2]]]
rkkpypqq

rkkpypqq2#

可以使用np.ravel_multi_index将3D坐标分解为1D偏移,并使用np.bincount计算这些偏移。

import numpy as np

points = np.array([[1,1,1], [0,1,1], [1,0,0], [1,1,1]])

m = points.max(0)+1
np.bincount(np.ravel_multi_index(points.T, m), minlength=np.prod(m)).reshape(m)

产出

array([[[0, 0],
        [0, 1]],

       [[1, 0],
        [0, 2]]])

相关问题