SiLaure's Data

[Numpy] 01. Numpy란? 본문

Records of/Learning

[Numpy] 01. Numpy란?

data_soin 2021. 7. 23. 14:11

 

- What is Numpy?

  •  "numerical python"의 약자.
    컴퓨터공학의 한 분야로, 실수 계산이 python의 취약점을 보완하기 위한 도구로 사용한다. 
  • 데이터가 vector(정형데이터 --표 형식)로 표시되기 때문에 벡터 연산이 필요하다. 
numerical python을 이해하기 위해서는 Numerical Computing과 을 알아야 한다.
1. Numerical Computing : 컴퓨터가 실수값을 효과적으로 계산할 수 있도록 하는 연구 분야
2. Vector Arithmetic : 벡터 연산 --데이터가 벡처로 표현되기 때문에 필요하다.
   (Vecotr는 숫자의 모음을 말한다.) 

 

  • numpy는 다양한 머신러닝 라이브러리들에 의존성을 가지고 있고, 일반 파이썬 리스트에 비해 성능이 월등히 좋다.
성능 : numpy array >>python list(or tuple)
  • python list와 비슷한 개념을 numpy에서는 numpy array라고 부른다. 
python list처럼 여러 데이터를 한번에 다룰 수 있다. 
python list보다는 빡빡한 구조를 가지며, 모든 데이터가 모두 동일한 data type을 가져야 한다.
  • C언어와 JAVA에서 사용하는 array와 비슷한 개념이며, (타입) 동적 할당(dynamic type binding)을 지원하는 파이썬의 리스트와 구조가 다르다.
모든 데이터가 동일한 data type을 가져야 한다는 뜻.
numpy array는 동적할당을 지원하지 않는다.
따라서 직접 type을 지정해주어야 한다.

 

 

 

-  Numpy의 특징

 

1. numpy array는 모든 원소의 자료형이 동일해야 한다.

numpy array가 지원하는 data types

  • data type 뒤에 붙는 숫자는 한 칸에 할당하는 bit 수.
    bit 수가 올라갈수록 숫자의 표현범위가 늘어나서 더 많은 정보량을 표시할 수 있고,
    사용하는 메모리의 용량도 커진다.
1Byte = 8bits
2^10 = 1024
1024B = 2^10B
1000 = 10^3 = Kilo
1KB = 1024B
1MB = 1024KB
1GB = 1024MB
1TB = 1024GB
1PB = 1024TB

 

 

2. numpy array는 선언할 때 크기를 지정한 뒤, 변경할 수 없다.

  • list.append(), pop()을 통해 자유롭게 원소 변경 및 크기 변경이 가능하지만,
    numpy array는 만들어지고 나면 원소의 update는 가능하지만, array의 크기를 변경할 수는 없다.
  • numpy의 append()는 python의 append()와 달리 복사하여 추가하는 개념이다.
  • numpy array의 크기를 변경하는 경우에는 복사가 일어난다.

 

 

 

3. 사실 numpy array는 C, C++로 구현이 되어 있다.

  • 이는 high performance를 내기 위해서이며, python이 Numerical computing에 취약하다는 단점을 보완한다.

C언어와 파이썬의 코드 비교

 

 

 

 

4. numpy array가 python list보다 빠른 이유 중 하나는 원소의 type checking을 할 필요가 없기 때문이다.

예시
Python에서 data type을 checking하는 곳

 

python list와 numpy array의 내부 구현 비교(Source from Data Science Handbook)

 

 

 

5. numpy array는 universal function*(through broadcast)를 제공하기 때문에

  같은 연산 반복에 대해 훨씬 빠르고, 데이터의 크기가 클수록 차이가 더 크다.

* universal function
: UFuncs 라고 표기하기도 한다.

: data type이 다르면 컴퓨터가 인지하는 데이터의 1)표현범위, 데이터의 2)연산이 달라진다.
  => 매번 type checking을 해야 한다.
그러나 numpy는 data type이 다 동일하기 때문에 한번만 check하면 되기 때문에 처리 속도가 빨라진다.
(단지 사용하기 조금 불편할 뿐...)
이를 numpy 자체에서 제공하는 것을 universal function이라고 한다.

 

big_array라는 1000000개의 원소를 가지는 array를 만든 뒤에 for문을 돌면서 각 원소를 뒤집는 연산을 했을 때의 걸리는 시간과, numpy array에 있는 UFuncs(Universal function)을 사용했을 때 걸리는 시간을 측정한 것이다.

거의 1000배 정도 차이가 나는 것을 볼 수 있다.

 

 

 

Comments