NumPy에서 MATLAB의 repmat에 해당하는 것은 무엇입니까?


103

NumPy :를 사용하여 다음과 같은 MATLAB 코드를 실행하고 싶습니다 repmat([1; 1], [1 1 1]). 어떻게해야합니까?

답변:


103

Matlab 사용자를위한 훨씬 더 나은 (공식적인) NumPy 링크가 있습니다. mathesaurus가 상당히 오래되었습니다.

에 해당하는 numpy는 repmat(a, m, n)입니다 tile(a, (m, n)).

이것은 여러 차원에서 작동하며 matlab과 유사한 결과를 제공합니다. (Numpy는 예상대로 3d 출력 배열을 제공합니다-어떤 이유로 matlab은 2D 출력을 제공하지만 내용은 동일합니다).

Matlab :

>> repmat([1;1],[1,1,1])

ans =
     1
     1

파이썬 :

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 [in matlab]하지만 파이썬에서는 np.tile (a, [1,1,2]) .shape는 (1, 2, 2), 내가 같은 NumPy와주고 결과를 원하는 얻을 같은 MATLAB과 같은
vernomcrp

2
np.tile (a [:, np.newaxis], [1,1,2])-동일합니다. 문제는 타일이 필요에 따라 새 축을 추가a 하여 타일 인수의 차원으로 승격 된다는 것 입니다. Matlab은 다른 방식으로 작동하는 것 같습니다. 유사하게, 4d 타일링을 사용하면 newaxis가 두 번 필요하므로 필요에 따라 ...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
Matlab은 bsxfun.
리트


8

이것이 내가 약간의 장난에서 그것을 이해 한 방법입니다. 수정되어 기쁩니다. 도움이되기를 바랍니다.

2x3 요소 의 행렬 M 이 있다고 가정합니다 . 이것은 분명히 두 가지 차원을 가지고 있습니다.


행렬이 이미 가지고있는 차원을 따라 입력 행렬을 조작하도록 요청하는 동안 Matlab과 Python간에 차이가 없음을 알 수있었습니다. 따라서 두 명령

repmat(M,m,n) % matlab

np.tile(M,(m,n)) # python

랭크 2 (2 차원)의 행렬과 실제로 동일합니다.


입력 행렬보다 더 많은 차원에 대해 반복 / 바둑판 식 배열을 요청할 때 문제는 직관적이지 않습니다. 랭크 2의 행렬 M과 모양 2x3으로 돌아 가면 출력 행렬의 크기 / 모양에 어떤 일이 발생하는지 살펴 보는 것으로 충분합니다. 조작 순서가 이제 1,1,2라고 가정합니다.

Matlab에서

> size(repmat(M,1,1,2))
ans =

    2   3   2

입력 행렬의 처음 두 차원 (행과 열)을 복사하고이를 새로운 세 번째 차원으로 한 번 반복했습니다 (두 번 복사 됨). repmat반복 행렬 의 이름 지정 에 충실합니다 .

Python에서

>>> np.tile(M,(1,1,2)).shape
(1, 2, 6)

시퀀스 (1,1,2)가 Matlab과 다르게 읽혀지기 때문에 다른 절차를 적용했습니다. 열, 행 및 평면 외 차원 방향의 복사본 수를 오른쪽에서 왼쪽으로 읽습니다. 결과 객체는 Matlab과 다른 모양을 갖습니다. 하나는 더 이상 주장 할 수 repmattile해당 지시 사항 없습니다.


tile처럼 동작 하기 위해서는 repmat파이썬에서 입력 행렬이 시퀀스의 요소만큼 많은 차원을 가지고 있는지 확인해야합니다. 예를 들어, 이것은 약간의 전제 조건을 지정하고 관련 객체 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)). 나는 이것이 파이썬이 왼쪽이 아닌 (2,3)의 오른쪽에 3 차원을 추가하도록 안내했기 때문에 파이썬이 Matlab에서 의도 한대로 시퀀스 (1,1,2)를 작동하도록 유도했기 때문이라고 생각합니다. 그것을 읽는 방법.

의 요소 [:,:,0]에 대한 대답 파이썬 N은 소자와 동일한 값을 포함 (:,:,1)하기위한 매트랩 않음 M을 .


마지막으로 repmatKronecker 제품 을 사용할 때에 해당하는 것을 찾을 수 없습니다.

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

내가 위와 같이 MN 으로 사전 조정하지 않는 한. 그래서 나는 계속 진행하는 가장 일반적인 방법은의 방법을 사용하는 것이라고 주장하고 싶습니다 np.newaxis.


랭크 3 (3 차원) 의 행렬 L 과 출력 행렬에 새로운 차원이 추가되지 않는 단순한 경우를 고려하면 게임이 더 까다로워집니다 . 겉보기에 동일한 두 명령은 동일한 결과를 생성하지 않습니다.

repmat(L,p,q,r) % matlab

np.tile(L,(p,q,r)) # python

행, 열, 평면 이탈 방향은 Matlab에서는 (p, q, r)이고 Python에서는 (q, r, p)이므로 순위 2 배열에서는 볼 수 없었습니다. 거기에서 조심해야하며 두 언어로 동일한 결과를 얻으려면 더 많은 사전 조정이 필요합니다.


나는이 추론이 일반적이지 않을 수 있다는 것을 알고 있지만, 지금까지만 해결할 수 있습니다. 바라건대 이것은 다른 동료들이 그것을 더 어려운 시험에 초대하기를 바랍니다.


6

모두 알아 tilerepeat.

x = numpy.arange(5)
print numpy.tile(x, 2)
print x.repeat(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.