重复2D NumPy数组N次

2024-03-28 21:57:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要通过复制源数组来增加(复制)32X32形状的2d数组到32X32X3形状的3d数组。我怎样才能做到最好呢?在

下面是源和预期数组的示例。我需要在更大的应用范围内应用这个逻辑

源数组:

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

预期的数组:

^{pr2}$

Tags: 示例数组逻辑array形状pr2
3条回答

根据我的测试,np.repeatnp.tile快一点:

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

或者,使用np.concatenate

^{pr2}$
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

听起来像是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]]])

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

如果不需要修改结果,请使用broadcast_to

np.broadcast_to(arr, (3, *arr.shape))

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

^{pr2}$

True

如果do需要能够修改,那么可以对结果调用copy(),在速度方面应该接近repeat和{}。在

相关问题 更多 >