重复一个二维NumPy数组N次

6
我需要将一个32X32形状的二维数组通过复制来扩充成一个32X32X3形状的三维数组。请问如何以最佳方式实现此操作?
下面是源数组和期望数组的示例。我需要在应用程序的更大范围内应用此逻辑。
源数组:
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

预期的数组:

array([[[1, 2, 3],
        [4, 5, 6],
        [7, 8, 9]],

       [[1, 2, 3],
        [4, 5, 6],
        [7, 8, 9]],

       [[1, 2, 3],
        [4, 5, 6],
        [7, 8, 9]]])
3个回答

9

根据我的测试,np.repeatnp.tile稍微快一些:

X = np.repeat(arr[None,:], 3, axis=0)

或者使用np.concatenate

X = np.concatenate([[arr]] * 3, axis=0)

arr = np.arange(10000 * 1000).reshape(10000, 1000)

%timeit np.repeat(arr[None,:], 3, axis=0)
%timeit np.tile(arr, (3, 1, 1))
%timeit np.concatenate([[arr]] * 3, axis=0)
# Read-only, array cannot be modified.
%timeit np.broadcast_to(arr, (3, *arr.shape))
# Creating copy of the above.
%timeit np.broadcast_to(arr, (3, *arr.shape)).copy()

170 ms ± 3.82 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
187 ms ± 3.12 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
243 ms ± 3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
10.9 µs ± 218 ns per loop (mean ± std. dev. of 7 runs, 100000 loops 
189 ms ± 2.45 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)each) 

np.array_equals(np.repeat(arr[None,:], 3, axis=0), 
                np.tile(arr, (3, 1, 1))
True

感谢基准测试。看起来“tile”源代码本身调用了“repeat”。 - hilberts_drinking_problem

3
听起来需要使用np.tile函数:
In [101]: np.tile(A, (3,1,1))
Out[101]: 
array([[[1, 2, 3],
        [4, 5, 6],
        [7, 8, 9]],

       [[1, 2, 3],
        [4, 5, 6],
        [7, 8, 9]],

       [[1, 2, 3],
        [4, 5, 6],
        [7, 8, 9]]])

第二个参数指定每个维度的副本数量。

2
如果您不需要修改结果,可以使用 broadcast_to:
np.broadcast_to(arr, (3, *arr.shape))

使用@coldspeed的答案进行验证:

arr = np.arange(10000 * 1000).reshape(10000, 1000)
X = np.repeat(arr[None,:], 3, axis=0)
broadcast_x = np.broadcast_to(arr, (3, *arr.shape))

np.array_equal(X, broadcast_x)

True

如果您需要进行修改,可以在结果上调用copy(),这应该接近于repeattile的速度。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接