NumPy
수치해석, 선형 대수(linear algebra) 계산 기능을 제공하는 Python 패키지로, 자료형이 고정된 다차원 배열 클래스인 ndarray 클래스와 벡터화 연산(vectorized operation)을 지원한다. CPython에서만 동작한다는 특징을 가지며, 넘파이라고 읽는다.
직접 데이터 분석을 할 일은 없는데, 관련 소스를 볼 일이 생기는 것 같아 NumPy와 Pandas 개념을 정리해두려고 한다.
이 글은 기본적인 배열 생성에 대해서 정리한다.
배열 (array)
많은 숫자 데이터를 하나의 변수에 저장하여 관리할 때 속도가 느리고 메모리를 많이 차지하는 리스트보다 배열을 사용하는 것이 적은 메모리로 많은 데이터를 빠르게 처리할 수 있다. 배열을 리스트와 비슷하지만 다음과 같은 점에서 다르다.
- 모든 원소가 같은 자료형이어야 한다.
- 원소의 수를 바꿀 수 없다
Python은 배열 자료형을 기본 제공하지 않으므로 배열을 구현한 패키지인 Numpy를 통해 사용할 수 있다.
패키지 import
NumPy 패키지를 import할 떄는 관례적으로 np라는 이름을 사용한다.
import numpy as np
1차원 배열
np.array 함수에 리스트를 전달하면 ndarray 클래스 객체인 배열로 변환된다.
arr = np.array(range(0, 10))
실행 결과
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
리스트와 비슷해보이지만 type 명령으로 자료형을 확인해보면 ndarray 타입인 것을 확인할 수 있다.
type(arr)
실행 결과
numpy.ndarray
배열은 리스트와 다르게 각각의 원소가 모두 동일해야 한다는 제약사항을 가진다. 대신 원소에 대한 접근과 반복문 실행이 빠르다는 장점을 가진다.
벡터화 연산
배열을 사용하면 각 원소에 대한 반복 연산을 하나의 명령어로 처리하는 벡터화 연산을 사용할 수 있다.
에로 들어 여러 데이터에 2배를 한 값을 구해야 한다면 일반적으로 for문을 사용할 것이다.
data = range(0, 9)
# for
result = []
for i in data:
result.append(2 * i)
# list comprehension
dubble = [2 * i for i in data]
하지만 벡터화 연산을 사용하면 for문을 사용하지 않고 간단히 표현할 수 있으며, 반복문보다 훨씬 빠르게 연산할 수 있다.
arr = np.array(range(0, 10))
arr * 2
실행 결과
array([ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18])
벡터화 연산은 비교와 논리를 포함한 모든 종류의 수학 연산에 대해 적용된다.
a = np.array([1, 2, 3])
b = np.array([10, 20, 30])
2 * a + b
a == 2
b > 10
(a == 2) & (b > 10)
실행 결과
array([12, 24, 36])
array([False, True, False])
array([False, True, True])
array([False, True, False])
2차원 배열
ndarray은 N-dimensional Array의 약자로 2차원 배열, 3차원 배열 등의 다차원 배열 자료 구조를 지원한다. 그 중 2차원 배열은 행렬(matrix)라고 하며, 가로줄을 행(row), 세로줄 열(column)이라고 부른다.
2차월 배열을 생성할 때는 2차원 리스트를 이용한다.
c = np.array([[1, 2, 3],[10, 20, 30]])
실행 결과
array([[ 1, 2, 3],
[10, 20, 30]])
2차원 배열의 행과 열의 수는 다음과 같이 구할 수 있다.
# 행의 수
len(c)
# 열의 수
len(c[0])
실행 결과
2
3
배열의 차원과 크기
배열의 크기와 차원을 구할 때는 배열의 차원을 가리키는 ndim 속성과 배열의 크기를 나타내는 shape 속성을 이용할 수 있다.
example1 = np.array([[10, 20, 30, 40], [50, 60, 70, 80]])
# 차원
print(example1.ndim)
# 크기
print(example1.shape)
실행 결과
2
(2, 4)
참고 문서