回答:
これは、Matlabユーザーのためのはるかに優れた(公式)NumPyですリンクです。Mathesaurusはかなり古くなっていると思います。
の派手な同等物repmat(a, m, n)
はtile(a, (m, n))
。
これは複数の次元で機能し、MATLABと同様の結果になります。(Numpyは期待どおりに3d出力配列を提供します-何らかの理由でMATLABは2d出力を提供します-内容は同じです)。
Matlab:
>> repmat([1;1],[1,1,1])
ans =
1
1
Python:
In [46]: a = np.array([[1],[1]])
In [47]: np.tile(a, [1,1,1])
Out[47]:
array([[[1],
[1]]])
a
ことにより、タイルがタイル引数の次元に昇格することです。Matlabは逆の働きをするようです。同様に、4dタイリングでは、newaxisが2回必要になります...必要に応じて...np.tile(a[:,newaxis,newaxis],[1,2,3,4]) = size(repmat(a,[1 2 3 4]))
Matlabユーザー向けのNumPyをご覧ください。
Matlab:
repmat(a, 2, 3)
Numpy:
numpy.kron(numpy.ones((2,3)), a)
NumpyのMatlib(numpy.matlib.repmat()):
numpy.matlib.repmat(a, 2, 3)
これは、少しいじくり回して理解した方法です。修正して満足し、これが役に立てば幸いです。
2x3要素の行列Mがあるとします。これには明らかに2つの側面があります。
行列が既に持っている次元に沿って入力行列を操作するように求めている間、MatlabとPythonの間に違いはありませんでした。したがって、2つのコマンド
repmat(M,m,n) % matlab
np.tile(M,(m,n)) # python
ランク2(2次元)の行列と本当に同等です。
入力行列よりも多くの次元で繰り返し/タイリングを要求する場合、問題は直感に反します。ランク2および形状2x3の行列Mに戻ると、出力行列のサイズ/形状に何が起こるかを調べるだけで十分です。操作のシーケンスが1,1,2になったとしましょう。
Matlabで
> size(repmat(M,1,1,2))
ans =
2 3 2
入力行列の最初の2つの次元(行と列)をコピーし、それを新しい3番目の次元(2回コピー)に1回繰り返しました。ネーミングに忠実repmat
繰り返しマトリックス。
Pythonで
>>> np.tile(M,(1,1,2)).shape
(1, 2, 6)
シーケンス(1,1,2)はMatlabとは異なる方法で読み取られるため、異なる手順が適用されています。列、行、面外の方向のコピー数は、右から左に読み取られます。結果のオブジェクトは、Matlabとは形状が異なります。もはやそれを主張することはできずrepmat
、tile
同等の指示です。
のtile
ように動作するにrepmat
は、Pythonで、入力行列が要素がシーケンス内にあるのと同じ数の次元を持っていることを確認する必要があります。これは、たとえば、少し前処理を行って関連オブジェクトNを作成することによって行われます。
N = M[:,:,np.newaxis]
次に、入力側には出力側ではN.shape = (2,3,1)
なくM.shape = (2,3)
>>> np.tile(N,(1,1,2)).shape
(2, 3, 2)
それはの答えでした size(repmat(M,1,1,2))
。これは、Pythonが3番目の次元を(2,3)の左側ではなく右側に追加するようにガイドしたため、PythonがMatlabで意図したとおりにシーケンス(1,1,2)を処理するためだと思いますそれを読む方法。
N[:,:,0]
のPython回答のの要素には、Mの Matlab回答の要素と同じ値が含まれます。(:,:,1)
最後に、repmat
Kronecker製品を使用する場合に相当するものを見つけることができないようです。
>>> np.kron(np.ones((1,1,2)),M).shape
(1, 2, 6)
上記のようにMをNに事前調整しない限り。したがって、先に進む最も一般的な方法は、の方法を使用することであると主張しますnp.newaxis
。
ランク3(3次元)の行列Lと、出力行列に新しい次元が追加されない単純なケースを考えると、ゲームはより複雑になります。これらの2つの一見同等の命令は同じ結果を生成しません
repmat(L,p,q,r) % matlab
np.tile(L,(p,q,r)) # python
行、列、面外の方向は、Matlabでは(p、q、r)、Pythonでは(q、r、p)であり、ランク2の配列では表示されませんでした。そこでは注意が必要であり、2つの言語で同じ結果を得るには、より多くの事前調整が必要になります。
この推論は一般的ではないことは承知していますが、ここまでしか解決できません。うまくいけば、これにより他のフェローがより厳しいテストを受けることができます。
>>> import numpy as np
>>> np.repeat(['a','b'], [2,5])
array(['a', 'a', 'b', 'b', 'b', 'b', 'b'], dtype='<U1')
>>> np.repeat([1,2], [2,5])
array([1, 1, 2, 2, 2, 2, 2])
>>> np.repeat(np.array([1,2]), [3]).reshape(2,3)
array([[1, 1, 1],
[2, 2, 2]])
>>> np.repeat(np.array([1,2]), [2,4]).reshape(3,2)
array([[1, 1],
[2, 2],
[2, 2]])
>>> np.repeat(np.matrix('1 2; 3 4'), [2]).reshape(4,2)
matrix([[1, 1],
[2, 2],
[3, 3],
[4, 4]])