" vstack"一个3d Numpy ndarray

时间:2017-01-16 13:56:58

标签: python python-3.x numpy

假设我有一个形状为ndarray的3d NumPy (n, 0, 2),我想连续使用形状(1,2)的第一维填充它,使用某些函数比如vstack

换句话说,我想从(n, 0, 2) ndarray切换到(n, m, 2)。但是,由于我事先并不知道m,我需要对我的阵列进行一些动态更新。

有可能吗?

1 个答案:

答案 0 :(得分:3)

动态构建3D阵列'最好在列表中收集子阵列并执行“堆叠”。一次到底

In [21]: alist = []
In [22]: for i in range(3):
    alist.append(np.arange(i,i+8).reshape(2,4))
   ....:     
In [23]: alist
Out[23]: 
[array([[0, 1, 2, 3],
        [4, 5, 6, 7]]), array([[1, 2, 3, 4],
        [5, 6, 7, 8]]), array([[2, 3, 4, 5],
        [6, 7, 8, 9]])]

一旦收集,他们可以以任何兼容的方式加入。 np.array在开始时将它们连接到新轴上。

In [24]: np.array(alist)
Out[24]: 
array([[[0, 1, 2, 3],
        [4, 5, 6, 7]],

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

       [[2, 3, 4, 5],
        [6, 7, 8, 9]]])
In [25]: _.shape
Out[25]: (3, 2, 4)

np.stack也可以这样做,或者可以在其他位置创建新轴。

In [26]: np.stack(alist,axis=1).shape
Out[26]: (2, 3, 4)

concatenatevstack加入现有轴。

In [27]: np.concatenate(alist, axis=0).shape
Out[27]: (6, 4)

从具有0维度的数组开始是不好的做法。你不是fill it in。最好将它与其他3d数组连接起来。这是一种缓慢且容易出错的模仿附加到[]列表。