R과 Python의 행렬

R과 Python의 애증의 관계

# R
library(reticulate)

R에서 array 정의 하기

3차원 array의 경우 R에서는 (행, 열, 쌓여있는 갯수) 이런식으로 정의가 됨.

# R
arr1 <- array(1:24, c(3,4,2))
arr1
#result>> , , 1
#result>> 
#result>>      [,1] [,2] [,3] [,4]
#result>> [1,]    1    4    7   10
#result>> [2,]    2    5    8   11
#result>> [3,]    3    6    9   12
#result>> 
#result>> , , 2
#result>> 
#result>>      [,1] [,2] [,3] [,4]
#result>> [1,]   13   16   19   22
#result>> [2,]   14   17   20   23
#result>> [3,]   15   18   21   24

문제는 3 by 4 행렬의 원소를 채우는 방식을 가로방향으로 채우고 싶은 것. 이걸 행렬처럼 byrow로 정의하고 싶은데 R에는 그런 명령어가 없음 (아시는분 알려주세요). 그래서 다음과 같이 할 수 있음.

# R
arr2 <- array(1:24, c(4, 3, 2))
arr2 <- aperm(arr2, c(2, 1, 3))
arr2
#result>> , , 1
#result>> 
#result>>      [,1] [,2] [,3] [,4]
#result>> [1,]    1    2    3    4
#result>> [2,]    5    6    7    8
#result>> [3,]    9   10   11   12
#result>> 
#result>> , , 2
#result>> 
#result>>      [,1] [,2] [,3] [,4]
#result>> [1,]   13   14   15   16
#result>> [2,]   17   18   19   20
#result>> [3,]   21   22   23   24

R에서 array를 Python으로 보내기

arr2를 python에서 불러보면 이렇게 뜸.

# python
r.arr2
#result>> array([[[ 1, 13],
#result>>         [ 2, 14],
#result>>         [ 3, 15],
#result>>         [ 4, 16]],
#result>> 
#result>>        [[ 5, 17],
#result>>         [ 6, 18],
#result>>         [ 7, 19],
#result>>         [ 8, 20]],
#result>> 
#result>>        [[ 9, 21],
#result>>         [10, 22],
#result>>         [11, 23],
#result>>         [12, 24]]], dtype=int32)

Index 차이 때문에 이렇게 됨. 이 문제를 해결하기 위해서는 다시 어레이 디멘젼을 바꿔서 파이썬에 피드해주는 수밖에 없음.

# R
arr3 <- aperm(arr2, c(3, 1, 2))

arr3를 python에서 불러보면, 우리가 생각하는 행렬이 됨.

# python
r.arr3
#result>> array([[[ 1,  2,  3,  4],
#result>>         [ 5,  6,  7,  8],
#result>>         [ 9, 10, 11, 12]],
#result>> 
#result>>        [[13, 14, 15, 16],
#result>>         [17, 18, 19, 20],
#result>>         [21, 22, 23, 24]]], dtype=int32)

Python에서 array 정의 하기

Python의 array는 (쌓여있는 갯수, 행, 열) 이런식으로 정의가 됨.

# Python
import numpy as np

m1 = np.reshape(np.arange(1,25), (2, 3, 4), "C")
m1
#result>> array([[[ 1,  2,  3,  4],
#result>>         [ 5,  6,  7,  8],
#result>>         [ 9, 10, 11, 12]],
#result>> 
#result>>        [[13, 14, 15, 16],
#result>>         [17, 18, 19, 20],
#result>>         [21, 22, 23, 24]]])

이걸 R로 불러오면 우리가 생각하는 array가 아님.

# R
py$m1
#result>> , , 1
#result>> 
#result>>      [,1] [,2] [,3]
#result>> [1,]    1    5    9
#result>> [2,]   13   17   21
#result>> 
#result>> , , 2
#result>> 
#result>>      [,1] [,2] [,3]
#result>> [1,]    2    6   10
#result>> [2,]   14   18   22
#result>> 
#result>> , , 3
#result>> 
#result>>      [,1] [,2] [,3]
#result>> [1,]    3    7   11
#result>> [2,]   15   19   23
#result>> 
#result>> , , 4
#result>> 
#result>>      [,1] [,2] [,3]
#result>> [1,]    4    8   12
#result>> [2,]   16   20   24

이걸 aperm을 이용해서 잘 바꿔주면, 원하는 행렬을 얻게 됨.

m1 <- aperm(py$m1, c(2, 3, 1))
m1
#result>> , , 1
#result>> 
#result>>      [,1] [,2] [,3] [,4]
#result>> [1,]    1    2    3    4
#result>> [2,]    5    6    7    8
#result>> [3,]    9   10   11   12
#result>> 
#result>> , , 2
#result>> 
#result>>      [,1] [,2] [,3] [,4]
#result>> [1,]   13   14   15   16
#result>> [2,]   17   18   19   20
#result>> [3,]   21   22   23   24
Avatar
이삭
PhD candidate

I believe anyone can learn anything with a proper education process.

comments powered by Disqus
Next
Previous