添加到3d numpy数组的维度的最佳方法是什么?

时间:2015-03-17 22:25:27

标签: python numpy

我有一个NumPy数组,其大小为:(54,41,2)我如何最有效地将其调整为(57,41,2),以使57维中的其他三个数值为零?< / p>

我这样做但我不确定它是否正确:

final_data = np.zeros((57, 41, 2))
final_data[:smaller_data.shape[0]] = smaller_data

1 个答案:

答案 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解决方案。