如何在 Numpy 中"zip"多个 N-D 数组?



条件如下:

1(我们有一个N-D数组列表,这个列表的长度未知M

2(每个数组的维度相等,但未知

3(每个数组应沿第0维拆分,生成的元素应沿长度M的第1维分组,然后沿长度相同的第0维堆叠回

4( 应N+1生成的秩,并应M

以上与zip相同,但在N-D数组的世界里。

目前我通过以下方式做:

xs = [list of numpy arrays]
grs = []
for i in range(len(xs[0])):
gr = [x[i] for x in xs] 
gr = np.stack(gr)
grs.append(gr)
grs = np.stack(grs)

我可以通过批量操作写得更短吗?

更新

这就是我想要的

将 numpy 导入为 NP

sz = 2
sh = (30, 10, 10, 3)
xs = []
for i in range(sz):
xs.append(np.zeros(sh, dtype=np.int))
value = 0
for i in range(sz):
for index, _ in np.ndenumerate(xs[i]):
xs[i][index] = value
value += 1
grs = []
for i in range(len(xs[0])):
gr = [x[i] for x in xs]
gr = np.stack(gr)
grs.append(gr)
grs = np.stack(grs)
print(np.shape(grs))

此代码正常工作,生成形状(30, 2, 10, 10, 3)数组。是否有可能避免循环?

似乎您需要将数组转置到其第一维和第二维;您可以使用swapaxes来实现此目的:

np.asarray(xs).swapaxes(1,0)

示例

xs = [np.array([[1,2],[3,4]]), np.array([[5,6],[7,8]])]
grs = []
for i in range(len(xs[0])):
gr = [x[i] for x in xs] 
gr = np.stack(gr)
grs.append(gr)
grs = np.stack(grs)
grs
#array([[[1, 2],
#        [5, 6]],
#       [[3, 4],
#        [7, 8]]])
np.asarray(xs).swapaxes(1,0)
#array([[[1, 2],
#        [5, 6]],
#       [[3, 4],
#        [7, 8]]])

np.stack采用轴参数;查看grs的形状,我猜np.stack(xs, 1)做同样的事情。

In [490]: x
Out[490]: 
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]]])
In [491]: x.shape
Out[491]: (2, 3, 4)
In [494]: xs = [x, x+10, x+100]
In [495]: grs = []
...: for i in range(len(xs[0])):
...:    gr = [x[i] for x in xs] 
...:    gr = np.stack(gr)
...:    grs.append(gr)
...: grs = np.stack(grs)
...: 
In [496]: grs
Out[496]: 
array([[[[  0,   1,   2,   3],
[  4,   5,   6,   7],
[  8,   9,  10,  11]],
[[ 10,  11,  12,  13],
[ 14,  15,  16,  17],
[ 18,  19,  20,  21]],
[[100, 101, 102, 103],
[104, 105, 106, 107],
...
[116, 117, 118, 119],
[120, 121, 122, 123]]]])
In [497]: grs.shape
Out[497]: (2, 3, 3, 4)

测试np.stack

In [499]: np.allclose(np.stack(xs, 1),grs)
Out[499]: True

最新更新