np.transpose(arr, *axes)
arr.transpose(*axes)
np.transpose(Numpy v1.19 Manual)에 대한 정의는 다음과 같다.
Reverse or permute the axes of an array; returns the modified array.
For an array a with two axes, transpose(a) gives the matrix transpose.
해석해보면, 배열(array)의 축을 뒤집거나 변경하십시오; 수정된 배열을 반환합니다.
축이 두 개인 배열 a의 경우, Transpose(a)는 행렬 전치를 제공합니다.
Parameters :
a : array_like
Input array.
axes : tuple or list of ints, optional
If specified, it must be a tuple or list which contains a permutation of [0,1,..,N-1] where N is the number of axes of a. The i’th axis of the returned array will correspond to the axis numbered axes[i] of the input. If not specified, defaults to range(a.ndim)[::-1], which reverses the order of the axes.
Returns:
p : ndarray
a with its axes permuted. A view is returned whenever possible.
자세한 내용을 살펴보면, 입력 파라미터로 (배열(array), 축(axes)-optional)을 받아서 뒤집거나 변경하는 연산을 수행한다. N은 a의 축 수를 의미하며, 파라미터로 지정하지 않을 경우 축의 순서를 반대로 하는 range(a.ndim) [::-1]이 기본값이다.
말로하면 어려울 수 있으니, 3차원 데이터를 통해 예를 들어보자. (Python)
arr = np.arange(24).reshape(2,3,4)
print(arr)
arr = arr.transpose()
print(arr)
위 코드의 결과는 다음과 같다. CxHxW라고 정의하면, C =2, H =3, W=4인 arr 데이터를 의미한다.
Transpose 연산을 추가해보면 다음과 같다. 파라미터가 없을 경우, transpose가 [::-1]이므로 C=4,H=3,W=2가 되었다.
결과 : 1. arr 원본 데이터, 2. arr.transpose()
[[[0 1 2 3]
[4 5 6 7]
[8 9 10 11]
[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]]
[[[0 12]
[4 16]
[8 20]]
[[1 13]
[5 17]
[9 21]]
[[ 2 14]
[ 6 18]
[10 22]
[[ 3 15]
[ 7 19]
[11 23]]]
파라미터를 주고싶을 경우에는, 3차원 데이터를 기준으로 0,1,2를 바꾸고 싶은 방향으로 넣어주면된다.
예 ) CHW -> HCW 라고 하면, arr.transpose(1,0,2)이 된다.
[[[ 0 1 2 3]
[12 13 14 15]
[[ 4 5 6 7]
[16 17 18 19]
[[ 8 9 10 11]
[20 21 22 23]]]
참고: C언어 구현 (인터넷 상에 없어서 구현해봤다.)
C = 2, H = 3, W = 4
원본 : CHW
변환 : HWC(np.transpose(1,2,0))
#include <stdio.h>
int main(void) {
// your code goes here
int i,j,k;
int channel, height, width, src_idx, dst_idx;
int dst_data[24], src_data[24];
channel = 2;
height= 3;
width =4;
for (i=0; i<24;i++){
scanf("%d", &src_data[i]);
}
for (i=0; i<24;i++){
printf("%d ", src_data[i]);
}
printf("\n ============================= \n");
for(i=0; i<channel; i++){
for(j =0; j<height; j++){
src_idx = height*width*i+ width*j;
dst_idx = channel*width*j+i;
for(k=0; k< width; k++){
dst_data[dst_idx+channel*k] = src_data[src_idx+k];
}
}
}
for (i=0; i<24;i++){
printf("%d ", dst_data[i]);
}
return 0;
}
Result
Python에서 결과를 보면 다음과 같다.
'프로그래밍 > Python' 카테고리의 다른 글
[python] 반복문(for문)과 내부기능 (0) | 2020.12.11 |
---|---|
[python] 파이썬 각 자리수 분리, 더하기 (0) | 2020.11.17 |
[Python] Numpy Slicing (2) | 2020.06.28 |
[Python] 경로명 분리하기 (0) | 2020.01.20 |