我有一个NumPy数组,其大小为:(54,41,2)我如何最有效地将其调整为(57,41,2),以使57维中的其他三个数值为零?< / p>
我这样做但我不确定它是否正确:
final_data = np.zeros((57, 41, 2))
final_data[:smaller_data.shape[0]] = smaller_data
答案 0 :(得分:1)
np.concatenate
是一个很好的候选人。它是明确的,这就是它的目的。
示例:
>>> import numpy as np
>>> a = np.arange(3**3).reshape(3,3,3)
>>> b = np.zeros((2,3,3))
>>> np.concatenate((a,b), axis=0)
array([[[ 0., 1., 2.],
[ 3., 4., 5.],
[ 6., 7., 8.]],
[[ 9., 10., 11.],
[ 12., 13., 14.],
[ 15., 16., 17.]],
[[ 18., 19., 20.],
[ 21., 22., 23.],
[ 24., 25., 26.]],
[[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.]],
[[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.]]])
你必须记住,在numpy中,数组通常以连续的方式存储。这就是为什么追加到一个数组(在任何轴上)将导致一个 new 数组,因为该数组需要一个新的内存位置。
备注:在这种情况下,它与np.vstack
的作用相同,尽管我发现在限制为2D数组时使用vstack
更具逻辑性。
将np.concatenate
与您首先定义零数组然后覆盖数组的一部分的原始方法进行比较,它取决于所涉及的数组的大小。在任何情况下,速度增益都很小:
In [14]: a = np.random.random((100,100,150))
In [15]: %timeit original_way(a)
100 loops, best of 3: 3.77 ms per loop
In [16]: %timeit concat_way(a)
100 loops, best of 3: 2.93 ms per loop
In [17]: 2.93/3.77
Out[17]: 0.7771883289124669
In [18]: a = np.random.random((1000,100,150))
In [19]: %timeit original_way(a)
10 loops, best of 3: 64.6 ms per loop
In [20]: %timeit concat_way(a)
10 loops, best of 3: 64.8 ms per loop
如果这是你的应用程序的瓶颈,你将会寻找非numpy解决方案。