NumPyでのMATLABのrepmatに相当するものは何ですか


103

NumPyを使用して、次のMATLABコードと同等のものを実行したいと思いますrepmat([1; 1], [1 1 1])。どうすればこれを達成できますか?

回答:


103

これは、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]]])

2
size(repmat([1; 1]、[1,1,2]))を試すと、ans = 2 1 2 [MATLAB]になりますが、Pythonではnp.tile(a、[1,1,2])になります。 (1、2、2)が、私はMathWorks社のMATLABと同じようnumpyの所与の結果が欲しい得ることを.shape
vernomcrp

2
np.tile(a [:、np.newaxis]、[1,1,2])-同じ結果になります。問題は、必要に応じて新しい軸を前に付けるaことにより、タイルがタイル引数の次元に昇格することです。Matlabは逆の働きをするようです。同様に、4dタイリングでは、newaxisが2回必要になります...必要に応じて...np.tile(a[:,newaxis,newaxis],[1,2,3,4]) = size(repmat(a,[1 2 3 4]))
robince 2009年

17

MATLABのrepmatを使用する必要がある理由のいくつかは、NumPyのブロードキャストメカニズムによって処理されることに注意してください。これにより、同様の形状の配列を使用してさまざまなタイプの数学を実行できます。たとえば、3色の画像を表す1600x1400x3の配列がある場合、(要素ごとに)乗算して[1.0 0.25 0.25]、各ピクセルの緑と青の量を減らすことができます。詳細については、上記のリンクを参照してください。


2
を使用してbsxfunいる場合、Matlabもこのブロードキャストを行うことができます。
gerrit


8

これは、少しいじくり回して理解した方法です。修正して満足し、これが役に立てば幸いです。

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とは形状が異なります。もはやそれを主張することはできずrepmattile同等の指示です。


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)


最後に、repmatKronecker製品を使用する場合に相当するものを見つけることができないようです。

>>> np.kron(np.ones((1,1,2)),M).shape
(1, 2, 6)

上記のようにMNに事前調整しない限り。したがって、先に進む最も一般的な方法は、の方法を使用することであると主張します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つの言語で同じ結果を得るには、より多くの事前調整が必要になります。


この推論は一般的ではないことは承知していますが、ここまでしか解決できません。うまくいけば、これにより他のフェローがより厳しいテストを受けることができます。



1

numpy.matlibには、matlab関数と同様のインターフェイスを持つrepmat関数があります

from numpy.matlib import repmat
repmat( np.array([[1],[1]]) , 1, 1)

0
>>> 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]])
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.