2017-10-05 11 views
1

の各半分を繰り返す:それの各半分を繰り返すことがどのように高速numpyの方法は、我々は、以下の2次元配列持つと仮定すると、(垂直)2次元配列

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

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

をので、私は、次の2次元配列があります。

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

私の試みは間違った結果生成します。そして、私たちの3次元配列を与える二つに第一の軸を分割する

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

関連する問題