답변:
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]]])
a
하여 타일 인수의 차원으로 승격 된다는 것 입니다. Matlab은 다른 방식으로 작동하는 것 같습니다. 유사하게, 4d 타일링을 사용하면 newaxis가 두 번 필요하므로 필요에 따라 ...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 이 있다고 가정합니다 . 이것은 분명히 두 가지 차원을 가지고 있습니다.
행렬이 이미 가지고있는 차원을 따라 입력 행렬을 조작하도록 요청하는 동안 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과 다른 모양을 갖습니다. 하나는 더 이상 주장 할 수 repmat
및 tile
해당 지시 사항 없습니다.
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을 .
마지막으로 repmat
Kronecker 제품 을 사용할 때에 해당하는 것을 찾을 수 없습니다.
>>> np.kron(np.ones((1,1,2)),M).shape
(1, 2, 6)
내가 위와 같이 M 을 N 으로 사전 조정하지 않는 한. 그래서 나는 계속 진행하는 가장 일반적인 방법은의 방법을 사용하는 것이라고 주장하고 싶습니다 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 배열에서는 볼 수 없었습니다. 거기에서 조심해야하며 두 언어로 동일한 결과를 얻으려면 더 많은 사전 조정이 필요합니다.
나는이 추론이 일반적이지 않을 수 있다는 것을 알고 있지만, 지금까지만 해결할 수 있습니다. 바라건대 이것은 다른 동료들이 그것을 더 어려운 시험에 초대하기를 바랍니다.
>>> 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]])