본문 바로가기
AI/[TEAMLAB]Numpy 사용법

[TEAMLAB] 3 - 7. numpy - array opeations

by 쵸빙 2020. 1. 20.

      저번 시간에는 array 내부의 operation을 알아보았고, 이번 시간에는 numpy의 array 간의 operation에 대해 알아보도록 하겠다.

 

     array 간의 기본적인 사칙 연산은 위와 같이 간단하다. 덧셈과 뺄셈은 matrix 연산처럼 같은 위치에 있는 것끼리 연산하게 된다. matrix의 연산은 곱하는 행렬의 열 수와 곱해지는 행렬의 행 수가 같아야 했다.

 

     그런데 곱셈은 array 간의 shape이 같을 때, 같은 위치에 있는 값들을 곱한다는 점에서 다르다.

위에서 말했던 덧셈, 뺄셈처럼 같은 위치끼리 연산되는 것을 element-wise라고 한다. 매트랩에서의 .*라는 연산과 같다.

 

Dot product

     dot product는 우리가 원래 알고 있었던 행렬 곱셈 연산이다. 이것은 .dot()이라고 해야한다.

 

Transpose

     Transpose는 전치행렬을 구해주는데 .transpose()를 쓰거나 .T를 쓰면 된다.

 

Broadcasting

     다음으로 살펴볼 것은 가장 중요하다고도 여겨질 수 있는 broadcasting이다.

이것은 shape이 다른 matrix 간의 연산을 자동으로 맞춰서 해주는 것이다. 이것이 numpy에서 가장 특이하고 어렵게까지 여겨지는 기술이다.

 

     + (더하기), - (빼기) , * (곱하기) , / (나누기) , // (몫), ** (제곱) 모두 가능하다.

 

     첫 번째 예를 보면 같은 shape끼리는 element-wise로 당연하게 더해진다.

두 번째 예를 보면 4 * 3와 1 * 3을 더해지면 같은 열끼리만 더해진다.

세 번째 예를 보면 4 * 1 과 1 * 3을 더하면 자동으로 broadcast가 되어 더해진다.

 

     코드로는 위와 같이 표현할 수 있다. 하지만 broadcast는 어느 정도 행이나 열이 맞아야지 계산이 되지 전혀 다른 형태라면 error가 뜬다는 것을 기억하자.

 

     마지막으로 numpy의 속도를 비교해보도록 하자. %timeit으로 속도가 얼마나 걸리는지 알 수 있다.

 

for loop을 이용했을 때 걸리는 시간

     for loop을 사용하면 위와 같이 시간이 오래 걸린다. 

 

      numpy는 for loop이나 list comprehension을 이용한 것보다 훨씬 빠른 결과를 내는 것을 알 수 있다.

그 이유로는 맨 처음 시간에 설명했듯이 list와 달리 원소가 이어져서 저장되어있어서 값들을 찾아오는 것이 편하기 때문이다.

 

다음 시간에는 numpy의 comparison에 대해 알아보도록 하겠다.