Python/NumPy | Pandas

[Python] NumPy - 배열 1

비번변경 2022. 11. 11. 17:04

NumPy

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)

 

 

참고 문서

데이터 사이언스 스쿨 - 3장 넘파이 배열 프로그래밍