2017-10-05 109 views
1

各占一半。假设我们有以下的二维数组:快速numpy的方式重复(纵向)的二维阵列

In [200]: a = np.arange(8).reshape(4,2) 

In [201]: a 
Out[201]: 
array([[0, 1], 
     [2, 3], 
     [4, 5], 
     [6, 7]]) 

如何可以重复的是各占一半,所以我有以下二维数组:

array([[0, 1], 
     [2, 3], 
     [0, 1], 
     [2, 3], 
     [4, 5], # second half 
     [6, 7], 
     [4, 5], 
     [6, 7]]) 

我尝试产生错误的结果:

In [202]: np.tile(np.split(a, 2), 2).reshape(-1,2) 
Out[202]: 
array([[0, 1], 
     [0, 1], 
     [2, 3], 
     [2, 3], 
     [4, 5], 
     [4, 5], 
     [6, 7], 
     [6, 7]]) 

回答

2

重塑分裂第一轴分为两个给我们一个三维阵列,然后沿着第一重复,最终重塑回2D -

np.repeat(a.reshape(-1,2,2),2,axis=0).reshape(-1,2) 

归纳了 -

def repeat_blocks(a): 
    N = a.shape[0] 
    B = N//2 # Block length 
    R = 2 # number of repeats 
    out = np.repeat(a.reshape(N//B,B,-1),R,axis=0).reshape(N*R,-1) 
    return out 

样品试验 -

案例#1:

In [120]: a 
Out[120]: 
array([[0, 1], 
     [2, 3], 
     [4, 5], 
     [6, 7]]) 

In [121]: repeat_blocks(a) 
Out[121]: 
array([[0, 1], 
     [2, 3], 
     [0, 1], 
     [2, 3], 
     [4, 5], 
     [6, 7], 
     [4, 5], 
     [6, 7]]) 

案例#2:

In [123]: a 
Out[123]: 
array([[ 0, 1], 
     [ 2, 3], 
     [ 4, 5], 
     [ 6, 7], 
     [ 8, 9], 
     [10, 11]]) 

In [124]: repeat_blocks(a) 
Out[124]: 
array([[ 0, 1], 
     [ 2, 3], 
     [ 4, 5], 
     [ 0, 1], 
     [ 2, 3], 
     [ 4, 5], 
     [ 6, 7], 
     [ 8, 9], 
     [10, 11], 
     [ 6, 7], 
     [ 8, 9], 
     [10, 11]]) 
+1

非常优雅,一如既往 - 谢谢! – MaxU