https://numpy.org/doc/stable/user/whatisnumpy.html 에 따르면 다음과 같은 특징들이 있다.
NumPy array는 Python의 리스트와는 다르게 고정된 사이즈로 생성된다(리스트는 동적으로 사이즈 조절이 가능하다.). 그래서 ndarray의 사이즈를 변경한다는 것은 새로운 array를 생성하고 기존 것을 삭제하는 일을 수반한다.
NumPy array의 요소(element)는 모두 같은 자료형이어야 하고, 따라서 모두 같은 사이즈의 메모리를 차지한다. 예외가 존재하는데, 객체(object)의 array인 경우에는 당연하게도 다른 사이즈의 요소들로 이루어질 수 있다.
일반적으로 방대한 숫자의 데이터에 대한 연산이 Python의 내장 시퀀스 자료형들보다 효율적이고 적은 코드로 실행될 수 있다.
수많은 Python 기반의 과학/수학 패키지들이 NumPy array를 사용하기 때문에, Python 기반의 과학/수학 소프트웨어를 효율적으로 사용하려면 Python 내장 시퀀스 자료형만으로는 충분치 않고, NumPy array를 사용할 줄 알아야 한다.
for (i = 0; i < rows; i++): {
c[i] = a[i]*b[i];
}
위 코드는 a와 b list를 요소끼리 곱해서 c list에 저장하는 Python 코드이다.
하지만 만약 요소의 개수가 수백만개라면 Python에서 루프를 시키는 것은 비효율적이다.
우리는 위 같은 작업을 C로 더 빠르게 수행할 수 있다. 다음은 C 코드이다.
for (i = 0; i < rows; i++): {
c[i] = a[i]*b[i];
}
2-D array 라면 C 코드는 아래와 같다.
for (i = 0; i < rows; i++): {
for (j = 0; j < columns; j++): {
c[i][j] = a[i][j]*b[i][j];
}
}
NumPy에서는 다음과 같은 코드 한 줄이면 된다. ndarray를 포함하는 연산은 element-by-element 연산이 default mode이고, 심지어 pre-compiled C 코드로 빠르게 실행된다.
c = a * b
요약하자면, NumPy를 사용하면 C의 버금가는 속도로 실행할 수 있으면서, 우리가 Python을 기반으로 하는 무언가에 기대하는 코드의 단순함(simplicity)까지도 누릴 수 있다.
NumPy는 벡터화(vectorization)을 통해 명시적인 looping, indexing 등을 제거했다. 벡터화를 통해서 코드가 훨씬 간결해지고 읽기 쉬워진다. 그러면 일반적으로 버그도 줄어들게 된다. 그리고 Broadcasting 개념이 있는데, 이것은 뒤에서 살펴보도록 하자.