프로그래밍/Python

[python] np.transpose (python ,c)

유니디니 2020. 12. 18. 16:11
728x90
반응형
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에서 결과를 보면 다음과 같다.

 

반응형