复制 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.]])
我尝试在 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.]])