Numpyのrepeat、tileの使い方についてまとめました。


repeat関数の役割:①配列要素の拡充②配列次元の低下
numpy.repeat(a、repeat、axis=None):もしaxis=Noneなら、多次元配列に対して、多次元配列を一次元配列に変化させて、それからrepeatパラメータに従って配列要素を拡張することができます。axis=Mの場合、配列が軸M上に配列要素を拡充することを表します。
次に3次元配列を例にとって、repeat関数の使用方法を調べます。

In [1]: import numpy as np 
In [2]: arr = np.arange(12).reshape(1,4,3) 
In [3]: arr
Out[3]:
array([[[ 0,  1,  2],
        [ 3,  4,  5],
        [ 6,  7,  8],
        [ 9, 10, 11]]])
①repeatsは整数N、axis=None:配列arrはまず扁平化され、配列arrの各要素を順次N回繰り返します。

In [4]: arr.repeat(2)
Out[4]:
array([ 0,  0,  1,  1,  2,  2,  3,  3,  4,  4,  5,  5,  6,  6,  7,  7,  8,
        8,  9,  9, 10, 10, 11, 11])
②repeatは整数配列rp_arr、axis=None:配列arrはまず扁平化されてから、配列arrの要素を順次に対応rp_を繰り返します。arr配列における要素の対応回数。若rp_arrは1つの値の1次元配列であり、配列arrの各要素は同じ回数を繰り返す。そうでないとrp_arr配列の長さは配列arrの長さと同じでなければなりません。そうでなければエラーを報告します。
a:rp_arrは1次元配列で放送します。

In [5]: arr.repeat([2])
Out[5]:
array([ 0,  0,  1,  1,  2,  2,  3,  3,  4,  4,  5,  5,  6,  6,  7,  7,  8,
        8,  9,  9, 10, 10, 11, 11])
b:rp_arrの長さは配列arrより小さいので、放送できません。エラーを報告します。
In[6]:arr.repeat([2,3,4])
-----------------------------------
ValueError Traceback(most recent call last)
<ipython-input-6-d 3 b 52907284 c>in<module>()
-->1 arr.repeat([2,3,4])
ValueError:operands could not be broadcast together with shape(12,)(3,)
c:rp_arrの長さと配列arrの長さは同じです。

In [7]: arr.repeat(np.arange(12))
Out[7]:
array([ 1,  2,  2,  3,  3,  3,  4,  4,  4,  4,  5,  5,  5,  5,  5,  6,  6,
        6,  6,  6,  6,  7,  7,  7,  7,  7,  7,  7,  8,  8,  8,  8,  8,  8,
        8,  8,  9,  9,  9,  9,  9,  9,  9,  9,  9, 10, 10, 10, 10, 10, 10,
       10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11])
d:rp_arrは配列arrより長いです。放送もできません。エラーが発生しました。
In[8]:arr.repeat(np.arange(13))
-----------------------------------
ValueError Traceback(most recent call last)
<ipython-input-8 c 8454224 d 1 b>in<module>()
-->1 arr.repeat(np.arange(13))
ValueError:operands could not be broadcast together with shape(12,)(13,)
結論:2つの配列が放送を満たす条件は、2つの配列の後縁次元(すなわち、最後から計算される次元)の軸長が等しいか、または、一方の長さが1であることである。
③repeatsは整数N、axis=M:配列arrの軸M上の各要素はN回繰り返し、M=-1は最後の軸を表します。

In [9]: arr.repeat(2,axis=0)
Out[9]:
array([[[ 0,  1,  2],
        [ 3,  4,  5],
        [ 6,  7,  8],
        [ 9, 10, 11]],
 
       [[ 0,  1,  2],
        [ 3,  4,  5],
        [ 6,  7,  8],
        [ 9, 10, 11]]])
In [12]: arr.repeat(2,axis=-1)#arr.repeat(2,axis=-1)   arr.repeat(2,axis=2)
Out[12]:
array([[[ 0,  0,  1,  1,  2,  2],
        [ 3,  3,  4,  4,  5,  5],
        [ 6,  6,  7,  7,  8,  8],
        [ 9,  9, 10, 10, 11, 11]]])
④repeatは整数配列rp_arr,axis=M:配列arr 1軸M上の要素を順番に繰り返すとrp_に対応します。arr配列における要素の対応回数。若rp_arrは1つの値の1次元配列であり、配列arr 1軸M上の各要素は同じ回数を繰り返す。そうでないとrp_arr配列長は配列arr 1軸Mの長さと同じでなければなりません。そうでなければエラーを報告します。
a:rp_arr長さと配列arr 1軸M上の長さは等しいです。
軸0に配列要素を拡張

In [13]: arr1 = np.arange(24).reshape(4,2,3) 
In [14]: arr1
Out[14]:
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 [15]: arr1.repeat((1,2,3,4),axis=0)
Out[15]:
array([[[ 0,  1,  2],
        [ 3,  4,  5]],
 
       [[ 6,  7,  8],
        [ 9, 10, 11]],
 
       [[ 6,  7,  8],
        [ 9, 10, 11]],
 
       [[12, 13, 14],
        [15, 16, 17]],
 
       [[12, 13, 14],
        [15, 16, 17]],
 
       [[12, 13, 14],
        [15, 16, 17]],
 
       [[18, 19, 20],
        [21, 22, 23]],
 
       [[18, 19, 20],
        [21, 22, 23]],
 
       [[18, 19, 20],
        [21, 22, 23]],
 
       [[18, 19, 20],
        [21, 22, 23]]])
軸1に配列要素を拡張

In [19]: arr1.repeat([1,2],axis=1)
Out[19]:
array([[[ 0,  1,  2],
        [ 3,  4,  5],
        [ 3,  4,  5]],
 
       [[ 6,  7,  8],
        [ 9, 10, 11],
        [ 9, 10, 11]],
 
       [[12, 13, 14],
        [15, 16, 17],
        [15, 16, 17]],
 
       [[18, 19, 20],
        [21, 22, 23],
        [21, 22, 23]]])
b:rp_arrが単一の値配列の場合、放送します。

In [20]: arr1.repeat([2],axis=0)
Out[20]:
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]],
 
       [[12, 13, 14],
        [15, 16, 17]],
 
       [[12, 13, 14],
        [15, 16, 17]],
 
       [[18, 19, 20],
        [21, 22, 23]],
 
       [[18, 19, 20],
        [21, 22, 23]]])
c:rp_arrと配列arr 1の軸が放送条件を満たしていないとエラーが発生します。
In[21]:arr 1.repeat((1,2,3)、axis=0)
-----------------------------------
ValueError Traceback(most recent call last)
<ipython-input-21-8 a e 4 dc 97 e 410>in<module>()
-->1 arr 1.repeat((1,2,3)、axis=0)
ValueError:operands could not be broadcast together with shape(4,)(3,)
tile関数の2つの役割:①配列要素の拡充②配列次元の向上
numpy.tile(A,reps):repsによる要素拡張配列Aにおける対応軸上の要素
①repsは整数Nである。整数Nを一つの要素Nを含むシーケンスrepsとして理解することができ、配列・ndimがrepsシーケンスの長さより大きい場合、repsシーケンスのインデックスが0の位置で要素1を追加し始める必要がある。repsの長さと配列の次元数が等しいまで、各軸上の要素を順番にrepsシーケンス中の要素の対応する回数を繰り返す。
一次元配列については、全体的な配列がN回繰り返されるので、配列の最後の位置から繰り返します。

In [26]: arr3 = np.arange(4) 
In [27]: arr3
Out[27]: array([0, 1, 2, 3]) 
In [28]: np.tile(arr3,2)
Out[28]: array([0, 1, 2, 3, 0, 1, 2, 3])
マルチ次元配列では、arr 2.ndim=3、reps=[2]、配列の長さがシーケンスrepsの長さより大きいことが分かるので、repsに元素を追加して、reps=[1,1,2]になり、arr 2配列は、repsの要素に基づいてその対応軸上の要素を繰り返します。軸1上の各要素を2回繰り返します。

In [29]: arr2 = np.arange(24).reshape(4,2,3) 
In [30]: arr2
Out[30]:
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 [31]: np.tile(arr2,2)
Out[31]:
array([[[ 0,  1,  2,  0,  1,  2],
        [ 3,  4,  5,  3,  4,  5]],
 
       [[ 6,  7,  8,  6,  7,  8],
        [ 9, 10, 11,  9, 10, 11]],
 
       [[12, 13, 14, 12, 13, 14],
        [15, 16, 17, 15, 16, 17]],
 
       [[18, 19, 20, 18, 19, 20],
        [21, 22, 23, 21, 22, 23]]])
②repsは整数シーケンスrp_arr:配列の場合、ndimはrp_より大きいです。arr長さは、方法は①と同じで、配列ndimがrp_より小さい場合arr長さは、配列の最初の縁維に新しい軸を追加する必要があります。配列の次元数とrp_まで。arr長さが等しく、そして配列の各軸上の要素が順次repsシーケンスの要素に対応する回数を繰り返す。
a:配列の次元がrp_より大きいarr長さ:rp_が必要ですarrが(1,2,3)に昇格します

In [33]: arr2 = np.arange(24).reshape(4,2,3) 
In [34]: arr2
Out[34]:
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 [35]: np.tile(arr2,(2,3))
Out[35]:
array([[[ 0,  1,  2,  0,  1,  2,  0,  1,  2],
        [ 3,  4,  5,  3,  4,  5,  3,  4,  5],
        [ 0,  1,  2,  0,  1,  2,  0,  1,  2],
        [ 3,  4,  5,  3,  4,  5,  3,  4,  5]],
 
       [[ 6,  7,  8,  6,  7,  8,  6,  7,  8],
        [ 9, 10, 11,  9, 10, 11,  9, 10, 11],
        [ 6,  7,  8,  6,  7,  8,  6,  7,  8],
        [ 9, 10, 11,  9, 10, 11,  9, 10, 11]],
 
       [[12, 13, 14, 12, 13, 14, 12, 13, 14],
        [15, 16, 17, 15, 16, 17, 15, 16, 17],
        [12, 13, 14, 12, 13, 14, 12, 13, 14],
        [15, 16, 17, 15, 16, 17, 15, 16, 17]],
 
       [[18, 19, 20, 18, 19, 20, 18, 19, 20],
        [21, 22, 23, 21, 22, 23, 21, 22, 23],
        [18, 19, 20, 18, 19, 20, 18, 19, 20],
        [21, 22, 23, 21, 22, 23, 21, 22, 23]]])
b:配列の次元はrp_より小さい。arrの長さ:配列の最初の縁の次元で新しく1本の軸を増加して、shapeを(1,4,2,3)にする必要があります。

In [36]: np.tile(arr2,(2,1,1,3))
Out[36]:
array([[[[ 0,  1,  2,  0,  1,  2,  0,  1,  2],
         [ 3,  4,  5,  3,  4,  5,  3,  4,  5]],
 
        [[ 6,  7,  8,  6,  7,  8,  6,  7,  8],
         [ 9, 10, 11,  9, 10, 11,  9, 10, 11]],
 
        [[12, 13, 14, 12, 13, 14, 12, 13, 14],
         [15, 16, 17, 15, 16, 17, 15, 16, 17]],
 
        [[18, 19, 20, 18, 19, 20, 18, 19, 20],
         [21, 22, 23, 21, 22, 23, 21, 22, 23]]],
 
 
       [[[ 0,  1,  2,  0,  1,  2,  0,  1,  2],
         [ 3,  4,  5,  3,  4,  5,  3,  4,  5]],
 
        [[ 6,  7,  8,  6,  7,  8,  6,  7,  8],
         [ 9, 10, 11,  9, 10, 11,  9, 10, 11]],
 
        [[12, 13, 14, 12, 13, 14, 12, 13, 14],
         [15, 16, 17, 15, 16, 17, 15, 16, 17]],
 
        [[18, 19, 20, 18, 19, 20, 18, 19, 20],
         [21, 22, 23, 21, 22, 23, 21, 22, 23]]]])
numpyのrepeatとtileは、コピー配列として使用されます。
repeatとtileはコピー配列に使用できますが、違いがあります。
重要な違いは、レピートは元素に対する複製であり、tileは配列全体の単位であり、レピートコピー時に要素は順次複製されます。誤用しないように注意してください。違いは[1,1,2,2]と[1,2,1,2,2]と同じです。
repeat
使い方

np.repeat(a, repeats, axis=None)
配列aの要素を繰り返しコピーします。要素の定義はaxisに関連しています。axisはタイミングを指しません。配列は複製されます。各要素は一つの値です。axisを指定するとき、aixisは次元上の要素を指定します。

a = np.array([[1,2], 
                      [3,4]])
axisを指定しないで、デフォルトのNoneです。このとき配列は1次元に展開され、コピーされます。

np.repeat(a, 2)  #              
运行结果
パラメータはリストです

np.repeat(a, [1, 2, 1, 2])  #           ,       a           ,    4
在这里插入图片描述
指定axis
指定すると、複製要素のエッジの次元が指定されています。このときは配列を平らにしないで、元の次元を維持します。

np.repeat(a, 2,  axi=0)  #     0             
结果

np.repeat(a, [1, 2], axis=1)  #         ,       a           ,   2
その結果、複製要素は第1次元から計算され、第1列は一回コピーされ、第2列は二回コピーされたことが分かります。
结果
タイムライン
使い方

np.tile(a, repeats)
配列をコピーします。repeatは整数または元のグループ、配列とすることができます。
repeatは整数です
例としては、配列を2つの部分にコピーし、最後の1次元で2つの要素を重ね合わせます。配列の次元は不変で、最後の1次元は複製回数によって倍になります。
结果
repeatはリストまたは元のグループです。
リストの長さが1の場合、整数の場合と同じです。
リスト長が1でない場合、リストは後ろから前を見て、最後の項目は2ですので、2つの配列をコピーして、最後の1次元で重畳します。最後の2番目の項目は3です。前のステップの結果をコピーして、最後の2次元で次のようになります。
结果
リストの長さが配列の次元を超えている場合、前と同様に、後ろから前へコピーすると、コピー結果は次元がリストの次元と一致するようになります。結果は以下のようになります。
在这里插入图片描述
結果のshpeをコピーします
在这里插入图片描述
しかし、単純な単一の配列の繰り返しについては、個人的には、stackとconcatentateを使って同じ配列を積み重ねていくのが好きです。
以上は個人の経験ですので、参考にしていただければと思います。