2017-07-28 67 views
0

的条件如下:如何在Numpy中“压缩”几个N-D数组?

1),我们有ND阵列的列表和该列表是未知长度的M

2)的尺寸的每个数组相等,但未知

3)每个阵列应该沿第0维劈裂和所得元件应当沿长度M的1-ST尺寸被分组,然后沿着相同的长度是

4的第0维叠层式背面)产生的秩应N+1和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) 

我可以写与大容量操作较短?

UPDATE

这是我想

进口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)) 

此代码apparantly正常工作,生产形状(30, 2, 10, 10, 3)的阵列。是否有可能避免循环?

+0

嗯...这将变得更加清晰,如果你能提供某种样品的输入和输出。 –

+0

然后你将采取样本输入的维度,但我想避免这个:) –

回答

1

似乎你需要调换阵列相对于它的第一维和第二维;可以使用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]]]) 
+3

总之:'np.swapaxes(xs,1,0)'。 – Divakar

+0

@Divakar冷静的短手。 – Psidom

+0

不,我需要增加排名,而swapaxes保存它... –

0

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