复制 2D numpy 数组然后插入零的最快方法?

Fastest way to duplicate 2D numpy array then insert zeros?

我尝试在 Whosebug 上广泛寻找这个问题,但我找不到任何东西。我正在无人机上编写一些算法,这些算法需要速度快,这样我的系统才不会失败。

我有一组点,如下所示:

In: points = np.array( [[ 0 10 10], [ 4  8  8], [14 14 14], [16 19 19]] )
Out: points: 
 [[ 0 10 10]
 [ 4  8  8]
 [14 14 14]
 [16 19 19]]

我正在努力实现以下目标:

new_points: 
 [[ 0 10 10]
 [ 0 10 10]
 [0, 0, 0]
 [0, 0, 0]
 [0, 0, 0]
 [0, 0, 0]
 [0, 0, 0]
 [0, 0, 0]
 [ 4  8  8]
 [ 4  8  8]
 [0, 0, 0]
 [0, 0, 0]
 [0, 0, 0]
 [0, 0, 0]
 [0, 0, 0]
 [0, 0, 0]
 [14 14 14]
 [14 14 14]
 [0, 0, 0]
 [0, 0, 0]
 [0, 0, 0]
 [0, 0, 0]
 [0, 0, 0]
 [0, 0, 0]
 [16 19 19]
 [16 19 19]]

每个点沿轴 = 0 重复一次,然后在这些点之间插入 6 行(可以是任意数字)零行。如果它更容易,我不介意最后一点之后是否也有零。

我尝试使用 np.concatenate(), np.insert(), and np.repeat() 来执行此操作,但是我只能在不需要的位置插入一行零。例如,这是我尝试插入的内容:

In: np.insert(points, np.arange(1,len(points)), 0, axis = 0)
Out: new_points: 
 [[ 0 10 10]
 [ 0  0  0]
 [ 0 10 10]
 [ 0  0  0]
 [ 4  8  8]
 [ 0  0  0]
 [ 4  8  8]
 [ 0  0  0]
 [14 14 14]
 [ 0  0  0]
 [14 14 14]
 [ 0  0  0]
 [16 19 19]
 [ 0  0  0]]

我无法连接成正确的形状。 This Whosebug post 展示了 np.concatenate() 如何更快,所以这就是我尝试它的原因。我试图为此只使用 numpy。有什么建议吗?

先创建一个零数组,然后给它赋points个值:

new_points = np.zeros((points.shape[0] * 8 - 6, points.shape[1]))
new_points[::8] = points
new_points[1::8] = points

new_points
array([[ 0., 10., 10.],
       [ 0., 10., 10.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 4.,  8.,  8.],
       [ 4.,  8.,  8.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [14., 14., 14.],
       [14., 14., 14.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [16., 19., 19.],
       [16., 19., 19.]])

使用 np.c_np.tile 的一种方式:

x,y = points.shape
n1 = 2  # number of times to duplicates the existing rows
n2 = 6  # number of zeros' rows to insert in between

            # n1 times existing data  # n2 times zeros    # to original shape
out = np.c_[np.tile(points, (1,n1)), np.zeros((x, y*n2))].reshape(-1,y)[:-n2]

输出:

array([[ 0., 10., 10.],
       [ 0., 10., 10.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 4.,  8.,  8.],
       [ 4.,  8.,  8.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [14., 14., 14.],
       [14., 14., 14.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [16., 19., 19.],
       [16., 19., 19.]])