포트폴리오

python - numpy패키지 기능(R함수 비교)

leegunho 2022. 6. 28. 12:33

python numpy패키지 안에있는 함수들을 활용해 보고 R에서 numpy패키지 안에있는 함수들과 비슷한 기능을 하는 함수가 

어떤것이 있을까 정리를 해보았습니다. 

 

python코드

 
from SyncRNG import SyncRNG
import pandas as pd
import numpy as np
import random
 
### np.where(python), ifelse(R), which(R)  ###
#where 함수는 두가지 기능을 함
#1.특정 조건에 맞는 원소의 위치를 반환 python = np.where(), R = ifelse() 사용
#2.특정 조건에 맞는 원소와 그렇지 않은 원소를 원하는 값으로 변경  python = np.where(), R = which() 사용
 
#data1 에 5~15까지 숫자 생성
import numpy as np
data1 = np.arange(5, 15)
data1
 
# data1에 있는 값들중 10 보다 작은수의 위치 반환
# python 인덱싱은 0부터 시작하기 떄문에 0[5], 1[6], 2[7], 3[8], 4[9]
np.where(data1 < 10)
 
# data1에 있는 값들중 10보다 큰 수는 그대로 유지, 작은수들은 'False'로 변환
#문자형으로 출력됨
np.where(data1 > 10, data1, 'False')
 
 
 
 
 
 
### np.dot(python), %*%(R) ###
# 행렬의 곱을 표현 할 떄 사용한다.
# array 로 다차원으로 생성후 다차원 행렬곱: n차원 * m차원
# x 각행, y 각열 끼리 순서대로 내적을 수행
import numpy as np
x = np.array([[1., 2., 3.], [4., 5., 6.]])
y = np.array([[6., 23.], [-1, 7], [8, 9]])
x
y
#1행1열 = 1*6 + 2*-1 + 3*8 = 28
#1행2열 = 1*23 + 2*7 + 3*9 = 64
#2행1열 = 4*6 + 5*-1 + 6*8 = 67
#2행2열 = 4*23 + 5*7 + 6*9 = 181
x.dot(y)
 
 
 
 
 
 
###np.random.shuffle(python), sample(R) ###
# np.random.shuffle = 기존의 배열을 변경
# 헷갈릴수도 있음. np.random.permutation = 기존 배열은 냅두고, 순서를 랜덤하게 섞은 배열 객체를 새로 생성
# x에 1~11까지 배열 생성
x = np.arange(1, 11)
x
# 원본 배열의 순서를 랜덤으로 변경
np.random.shuffle(x)
x
 
#np.random.permutation
 
# x에 1~11까지 배열생성
x = np.arange(1, 11)
x
# 원본 배열은 그대로, 랜덤하게 순서를 바꾼 객체만 반환
np.random.permutation(x)
#원본이 그대로 인것을 확인 할 수 있음
x
 
 
 
 
 
 
###np.intersect1d(python),intersect(R)###
#두 개의 배열 x,y 의 교집합을 정렬하여 반환함
 
#배열 x,y를 생성
#x,y 를 보면 3,4 가 공통적으로 있음을 확인 할 수있음
x = np.array([1, 2, 3, 4])
y = np.array([3, 4, 6, 5])
# 결과 = array([3, 4]) 가 나옴 원본변경x
np.intersect1d(x, y)
 
 
 
 
 
 
###argmin(python), which.min(R)###
#np.argmin 함수는 함수 내에 array와 비슷한 형태(리스트 등 포함) 의 input
#을 넣어주면 가장 작은 원소의 인덱스를 반환하는 형식입니다.
#다만 가장 작은 원소가 여러개 있는 경우 가장 앞의 인덱스를 반환!
 
#첫번쨰 비교는 배열에서
x = np.array([1,5,6,16,14,0,8])
#두번쨰 비교는 리스트 자료형에서
y = [3,2,5,4,5]
#세번쨰 비교는 2차원 배열에서
a = np.array([[4, 3, 2], [8, 5, 9], [7, 6, 1]])
 
x
y
a
 
#파이썬 인덱싱은 0부터 시작하므로, 6번쨰 값이 가장 작다고 출력됨
np.argmin(x)
 
#파이썬 인덱싱은 0부터 시작하므로, 2번쨰 값이 가장 작다고 출력됨
np.argmin(y)
 
#axis를 지정하지 않은 경우 axis=NOne 이 되어 모든 원소를 순서대로 1차원 array에 펴진
#상태를 가정하고 값을 반환함 ex) axis = None (4 3 2 8 5 9 7 6 1)
np.argmin(a)
 
#axis = 0 으로 지정하면 세로축 원소들끼리 비교하여 각 세로축 내부에서 각각적용하여 결과를 반환
#첫번쨰 열에서 가장 작은값이 4니까 0번쨰을 반환
#두번쨰 열에서 가장 작은값이 3이므로 0번쨰을 반환
#세번쨰 열에서 가장 작은값이 1이므로  2번쨰를 반환
#[0, 0, 2]
np.argmin(a, axis = 0)
 
 
#axis = 1로 설정 한 경우도 마찬가지의 원리로 가로축 원소끼리의 비교 결과를 보여줌
#첫번쨰 행에서 가장 작은값이 2이므로 2번쨰 반환
#두번쨰 행에서 가장 작은값이 5이므로 1번쨰 반환
#세번쨰 행에서 가장 작은 값이 1이므로 2번쨰 반환
# [2, 1, 2]
np.argmin(a, axis = 1)
a
 
 
 
 
 
###argmax(python), which.max(R)###
#np.argmax 함수는 함수 내에 array와 비슷한 형태(리스트 등 포함) 의 input
#을 넣어주면 가장 큰 원소의 인덱스를 반환하는 형식입니다.
#다만 가장 큰 원소가 여러개 있는 경우 가장 앞의 인덱스를 반환!
 
#첫번쨰 비교는 배열에서
x = np.array([1,5,6,16,14,0,8])
#두번쨰 비교는 리스트 자료형에서
y = [3,2,5,4,5]
#세번쨰 비교는 2차원 배열에서
a = np.array([[4, 3, 2], [8, 5, 9], [7, 6, 1]])
 
x
y
a
 
#파이썬 인덱싱은 0부터 시작하므로, 4번쨰 값이 가장 크다고 출력됨
np.argmax(x)
 
#파이썬 인덱싱은 0부터 시작하므로, 3번쨰 값이 가장 크다고 출력됨 (가장 큰 값이 2개가 중복 = 가장 앞에 있는것을 인덱싱)
np.argmax(y)
 
#axis를 지정하지 않은 경우 axis=NOne 이 되어 모든 원소를 순서대로 1차원 array에 펴진
#상태를 가정하고 값을 반환함 ex) axis = None (4 3 2 8 5 9 7 6 1)
np.argmax(a)
 
#axis = 0 으로 지정하면 가로축 원소들끼리 비교하여 각 세로축 내부에서 각각적용하여 결과를 반환
#첫번쨰 열에서 가장 큰 값이 8니까 1번쨰을 반환
#두번쨰 열에서 가장 큰 값이 6이므로 2번쨰을 반환
#세번쨰 열에서 가장 큰 값이 9이므로  1번쨰를 반환
#[1, 2, 1]
np.argmax(a, axis = 0)
 
 
#axis = 1로 설정 한 경우도 마찬가지의 원리로 가로축 원소끼리의 비교 결과를 보여줌
#첫번쨰 행에서 가장 큰 값이 4이므로 0번쨰 반환
#두번쨰 행에서 가장 큰 값이 9이므로 2번쨰 반환
#세번쨰 행에서 가장 큰 값이 7이므로 0번쨰 반환
# [0, 2, 0]
np.argmax(a, axis = 1)

R코드

 

비슷한 기능을 하는 함수도 많았고, python 과 R 두 언

### np.where(python), ifelse(R), which(R)  ###
#where 함수는 두가지 기능을 함
#1.특정 조건에 맞는 원소의 위치를 반환 python = np.where(), R = ifelse() 사용
#2.특정 조건에 맞는 원소와 그렇지 않은 원소를 원하는 값으로 변경  python = np.where(), R = which() 사용

#data1 에 5~15까지 숫자 생성
data1 <- array(5:15)
data1
#integer(정수)로 나옴 
typeof(data1)

#which() 함수에 조건식을 입력하면 조건식에 만족하는 값의 위치를 반환 
#R 인덱싱은 1부터 시작 1[5], 2[6], 3[7], 4[8], 5[9]
data1
which(data1<10)

#python 에np.where()함수와 비슷한 ifelse 사용 
#ifelse 도 np.where() 과 똑같은 기능을함 (조건에 맞는 값, 안맞는값 변환 )
data1_ty<- ifelse(data1 < 10, 'False', data1)
data1_ty
#character(문자형) 으로 출력됨
typeof(data1_ty)







### np.dot(python), %*%(R) ###
# 행렬의 곱을 표현 할 떄 사용한다.
# 행렬은 동일한 변수형을 가지는 2차원 데이터 구조(matrix)
#숫자형 변수만이 아닌 문자로도 구성할 수 있음
#array 안쓴이유 : byrow 기능이 없어서 만드는데 한정적임 

#byrow = TRUE 를 하는이유 = 행렬의 값을 입력하는 순서를 행우선 
x=matrix(c(1,2,3,4,5,6),nrow=2, byrow = TRUE)
x

y=matrix(c(6,23,-1,7,8,9),ncol=2, byrow = TRUE)
y
#R에서 행렬곱은 %*% 사용 
x%*%y






###np.random.shuffle(python), sample(R) ###
# 데이터 추출에 사용되는 sample()함수 로도 순서를 random 하게 바꿀 떄도 쓰일 수 있음 
# 단 sample(2:8) 같이 하면 그냥 순서 섞기에 불과하다 

#x에 1~11 까지 배열생성 
x <- array(1:11)
x
# sample() 안에 x배열을 넣으면 랜덤으로 순서변경
# 결과는 파이썬의 np.random.shuffle() 와 똑같이 랜덤으로 변경 
x <- sample(x)
x
# R에는 np.arange 와 같은 기능을 하는 함수가 없음 


###np.intersect1d(python),intersect(R)###
#intersect() 함수는 두 벡터를 집합으로 인식하여 교집합을 구해줌 
#array()함수를 이용하여 배열 생성 python과 똑같이 
x <- array(1:4)
x
y <- array(3:6)
y

# python과 동일한 결과를 얻을수 있음 
intersect(x,y)





###argmin(python), which.min(R)###
#R 에는 axis 지정하는게 없음. 
#R 인덱싱은 1부터 시작 

#배열생성
x <- array(c(1,5,6,16,14,0,8))
x

##리스트생성
#R 에서 리스트는 which.min 을 하지못함 
y <- list(c(3,2,5,4,5))
y


#행렬생성 후 배열로 
a <-  matrix(c(4,3,2,8,5,9,7,6,1),ncol=3, byrow = TRUE)
a
a<- array(a, dim = c(3,3,1))
a

x_min <- which.min(x)
x_min

#R 에서 리스트는 which.min 을 사용하지 못함
y_min <- which.min(y)


a_min <- which.min(a)
a_min



###argmax(python), which.max(R)###
#R 에는 axis 지정하는게 없음. 
#R 인덱싱은 1부터 시작 

#배열생성
x <- array(c(1,5,6,16,14,0,8))
x

##리스트생성
#R 에서 리스트는 which.min 을 하지못함 
y <- list(c(3,2,5,4,5))
y


#행렬생성 후 배열로 
a <-  matrix(c(4,3,2,8,5,9,7,6,1),ncol=3, byrow = TRUE)
a
a<- array(a, dim = c(3,3,1))
a


x_max <- which.max(x)
#1부터 시작 해서 순서대로. 
x_max

#리스트는 불가 double 로 변환해야함 
y_max <- which.max(y)



a_max <- which.max(a)
a_max

어에서 사용하는 기능(함수)이 동일한 것도 있다는것을 확인하였습니다.