2016-12-31 4 views
2

У меня есть 3D Np массивы, как это:Повторяющиеся Numpy массивы

x= array([[[ 1., 2., 3.], 
    [ 4., 5., 6.], 
    [ 7., 8., 9.], 
    [ 10., 11., 12.]], 

    [[ 13., 14., 15.], 
    [ 16., 17., 18.], 
    [ 19., 20., 21.], 
    [ 22., 23., 24.]]]) 

Я хотел бы повторить мой массив п раз (например, 3 раза), как это:

array([[[ 1., 2., 3.], 
    [ 4., 5., 6.], 
    [ 7., 8., 9.], 
    [ 10., 11., 12.]], 

    [[ 1., 2., 3.], 
    [ 4., 5., 6.], 
    [ 7., 8., 9.], 
    [ 10., 11., 12.]], 

    [[ 1., 2., 3.], 
    [ 4., 5., 6.], 
    [ 7., 8., 9.], 
    [ 10., 11., 12.]], 

    [[ 13., 14., 15.], 
    [ 16., 17., 18.], 
    [ 19., 20., 21.], 
    [ 22., 23., 24.]], 

    [[ 13., 14., 15.], 
    [ 16., 17., 18.], 
    [ 19., 20., 21.], 
    [ 22., 23., 24.]] 

    [[ 13., 14., 15.], 
    [ 16., 17., 18.], 
    [ 19., 20., 21.], 
    [ 22., 23., 24.]]]) 

Я попытался как это:

xx=np.vstack([x]*3) 
print xx.reshape(6,4,3) 


array([[[ 1., 2., 3.], 
    [ 4., 5., 6.], 
    [ 7., 8., 9.], 
    [ 10., 11., 12.]], 

    [[ 13., 14., 15.], 
    [ 16., 17., 18.], 
    [ 19., 20., 21.], 
    [ 22., 23., 24.]], 

    [[ 1., 2., 3.], 
    [ 4., 5., 6.], 
    [ 7., 8., 9.], 
    [ 10., 11., 12.]], 

    [[ 13., 14., 15.], 
    [ 16., 17., 18.], 
    [ 19., 20., 21.], 
    [ 22., 23., 24.]], 

    [[ 1., 2., 3.], 
    [ 4., 5., 6.], 
    [ 7., 8., 9.], 
    [ 10., 11., 12.]], 

    [[ 13., 14., 15.], 
    [ 16., 17., 18.], 
    [ 19., 20., 21.], 
    [ 22., 23., 24.]]]) 

Как я могу получить в порядке, что хочу, должен быть простой способ сделать это. Заранее благодарим за ваши предложения.

ответ

2

Вы можете использовать np.repeat с axis = 0:

np.repeat(x, [3, 3], axis = 0) # or more generally np.repeat(x, [n] * len(x), axis = 0) 
           # here n is the repeat times 
Out[514]: 
array([[[ 1., 2., 3.], 
     [ 4., 5., 6.], 
     [ 7., 8., 9.], 
     [ 10., 11., 12.]], 

     [[ 1., 2., 3.], 
     [ 4., 5., 6.], 
     [ 7., 8., 9.], 
     [ 10., 11., 12.]], 

     [[ 1., 2., 3.], 
     [ 4., 5., 6.], 
     [ 7., 8., 9.], 
     [ 10., 11., 12.]], 

     [[ 13., 14., 15.], 
     [ 16., 17., 18.], 
     [ 19., 20., 21.], 
     [ 22., 23., 24.]], 

     [[ 13., 14., 15.], 
     [ 16., 17., 18.], 
     [ 19., 20., 21.], 
     [ 22., 23., 24.]], 

     [[ 13., 14., 15.], 
     [ 16., 17., 18.], 
     [ 19., 20., 21.], 
     [ 22., 23., 24.]]]) 

Другим вариантом было бы индексировать его как:

x[[0,0,0,1,1,1]] 

или программно:

x[[i for i in range(len(x)) for j in range(3)]] 
Out[518]: 
array([[[ 1., 2., 3.], 
     [ 4., 5., 6.], 
     [ 7., 8., 9.], 
     [ 10., 11., 12.]], 

     [[ 1., 2., 3.], 
     [ 4., 5., 6.], 
     [ 7., 8., 9.], 
     [ 10., 11., 12.]], 

     [[ 1., 2., 3.], 
     [ 4., 5., 6.], 
     [ 7., 8., 9.], 
     [ 10., 11., 12.]], 

     [[ 13., 14., 15.], 
     [ 16., 17., 18.], 
     [ 19., 20., 21.], 
     [ 22., 23., 24.]], 

     [[ 13., 14., 15.], 
     [ 16., 17., 18.], 
     [ 19., 20., 21.], 
     [ 22., 23., 24.]], 

     [[ 13., 14., 15.], 
     [ 16., 17., 18.], 
     [ 19., 20., 21.], 
     [ 22., 23., 24.]]]) 
+0

Начиная с (2,4,3) вам не нужно изменять форму после повтора. – hpaulj

+0

@hpaulj Спасибо за комментарий. Он работает с '[3,3]' вдоль 'axis = 0' без изменения. – Psidom

4

После немного испытания и ошибка Я нашел способ сделать это:

np.tile(x.reshape(2,12), [1,3]).reshape(6,4,3) 
Смежные вопросы