2024-03-28 21:57:59 发布
网友
我需要通过复制源数组来增加(复制)32X32形状的2d数组到32X32X3形状的3d数组。我怎样才能做到最好呢?在
下面是源和预期数组的示例。我需要在更大的应用范围内应用这个逻辑
源数组:
array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
预期的数组:
根据我的测试,np.repeat比np.tile快一点:
np.repeat
np.tile
X = np.repeat(arr[None,:], 3, axis=0)
或者,使用np.concatenate:
np.concatenate
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:
broadcast_to
np.broadcast_to(arr, (3, *arr.shape))
使用@coldspeed的答案进行验证:
True
如果do需要能够修改,那么可以对结果调用copy(),在速度方面应该接近repeat和{}。在
copy()
repeat
根据我的测试,
np.repeat
比np.tile
快一点:或者,使用
^{pr2}$np.concatenate
:听起来像是
np.tile
的工作:第二个参数指定每个维度上的副本数。在
如果不需要修改结果,请使用
broadcast_to
:使用@coldspeed的答案进行验证:
^{pr2}$如果do需要能够修改,那么可以对结果调用}。在
copy()
,在速度方面应该接近repeat
和{相关问题 更多 >
编程相关推荐