SiLaure's Data

[Numpy] 03. Array Operation(Broadcast, Universal Function) 본문

Records of/Learning

[Numpy] 03. Array Operation(Broadcast, Universal Function)

data_soin 2021. 7. 23. 16:56

- Array Operation (like vector) --> Universal Function

 

  • numpy array를 쓰는 가장 큰 이유는 vector처럼 사용할 수 있기 때문이다.
e.g. arr1 = np.array([1, 2, 3, 4, 5]) --> (1, 2, 3, 4, 5)       ==  vector
  • 그렇기 때문에 scipy, matplotlib, scikit-learn, pandas, tensorflow, pytorch 등 대부분의 데이터분석 라이브러리들이 numpy array를 사용한다.
  • 대부분의 데이터 분석 라이브러리들은 벡터를 사용하는데, 그 벡터가 바로 numpy array로 표현되기 때문.
  • 데이터 분석은 99.9% 데이터를 벡터로 표현하여 분석하기 때문에, 이 특징은 굉장히 중요하다.
벡터 == numpy array

 

 

vector
dot product

A + B = (3, 3) 
A - B = (-1, 1) 
A o B = 1x2 + 2x1 = 4 (dot product)

 

 

 

1. vector 2개 생성하기

v1 = np.array((1, 2, 3))
v2 = np.array((4, 5, 6))
type(v1), type(v2)

출력 : (numpy.ndarray, numpy.ndarray)

 

 

2. 리스트로 더하기 연산해보기

t1 = (1, 2, 3)
t2 = (4, 5, 6)
#type(t1), type(t2)

t1 + t2

출력 : (1, 2, 3, 4, 5, 6)

 

 

3. 여러가지 연산들

#  vector addition
v1 + v2
array([5, 7, 9])
-
#  vector subtraction
v1 - v2
array([-3, -3, -3])
v1 * v2
# vector는 곱하기, 나누기가 없기 때문에 원소 간 연산으로 봐야 한다.
# (not vector operation) elementwise multiplication --원소 간 연산
v1 * v2
array([ 4, 10, 18])
# (not vector operation) elementwise division
v1 / v2
array([0.25, 0.4 , 0.5 ])
# dot product
v1 @ v2
# 1*4 + 2*5 + 3*6
32
vector는 곱하기, 나누기가 없기 때문에 원소 간 연산으로 봐야 한다.

 

 

 

- Broadcast

  • 서로 크기가 다른 numpy array를 연산할 때, 자동으로 연산을 전파(broadcast)해주는 기능.
  • 전파가 확장되면 행렬곱 연산을 할 때 편리하다.
# 다치원 array에 확장
arr1 = np.array([[1, 2, 3],
               [4, 5, 6]])
arr1.shape
 --(2, 3)
arr2 = np.array([7, 8, 9])
arr2.shape
 --(3,)

# 2개의 array를 더해보면?
arr1 + arr2
	# [1, 2, 3] + [7, 8, 9] , [4, 5, 6] + [7, 8, 9]

 --array([[ 8, 10, 12],
   	    [11, 13, 15]])

# 2개의 array를 곱해보면? (**)
arr1 * arr2  # [1, 2, 3] * [7, 8, 9] , [4, 5, 6] * [7, 8, 9]

 --array([[ 7, 16, 27],
  	     [28, 40, 54]])
  
# vector scalar multiplication
# arr1에 10을 곱해보면?
arr1 * 10  # vector scalar multiplication

  --array([[10, 20, 30],
    	   [40, 50, 60]])

# arr1을 제곱해보면?
arr1 * arr1
array([[ 1,  4,  9],
       [16, 25, 36]])
np.array의 제곱은 ^2아닌 두 번 곱하는 것이다. (값이 다름)

 

 

 

- Universal Functions

  • numpy array는 하나의 함수를 모든 원소에 자동으로 적용해주는 Universal Function이라는 기능을 제공한다.
  • 이로 인해 모든 원소에 대해 같은 작업을 처리할 때 엄청나게 빠른 속도를 낼 수 있다.

 

1. no.array를 생성하고 실수 타입으로 변환하기

arr1 = np.array([1, 2, 3], dtype=float)
int와 int 사이의 연산에서 오직 나눗셈만 결과값이 실수로 변환된다.
위에서는 dtype을 따로 정해주었지만, 1로 나누면 따로 지정하는 대신 간단하게 변환할 수 있다.
arr1 = np.array([1, 2, 3])
arr1 = arr1 / 1
arr1.dtype

출력 : dtype('float64')

 

 

2. 모든 원소의 역수 구하기

for x in arr1 : 
    x = 1 /x
    L.append(x)
np.array(L)
각 원소에 1 / 라는 operation을 모두 적용하는 연산이 된다.
1 / arr1

출력 : array([1. , 0.5 , 0.33333333])

 

 

3. 모든 원소에 2를 더하기

arr1 + 2

출력 : array([3., 4., 5.])

Comments