假设我有一个形状为ndarray
的3d NumPy (n, 0, 2)
,我想连续使用形状(1,2)
的第一维填充它,使用某些函数比如vstack
。
换句话说,我想从(n, 0, 2)
ndarray
切换到(n, m, 2)
。但是,由于我事先并不知道m
,我需要对我的阵列进行一些动态更新。
有可能吗?
答案 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)
concatenate
和vstack
加入现有轴。
In [27]: np.concatenate(alist, axis=0).shape
Out[27]: (6, 4)
从具有0维度的数组开始是不好的做法。你不是fill it in
。最好将它与其他3d数组连接起来。这是一种缓慢且容易出错的模仿附加到[]
列表。