반응형

04. NumPy 기본: 배열과 벡터 연산

4.2 유비버설 함수: 배열의 각 원소를 빠르게 처리하는 함수

ufunc라고 불리기도 하는 유니버설 함수는 ndarray안에 있는 데이터 원소별로 연산을 수행하는 함수다

유니버설 함수는 하나 이상의 스칼라값을 받아서 하나 이상의 스칼라 결괏값을 반환하는 간단한 함수를 고속으로 수행할 수 있는 백터화된 래퍼 함수라고 생각하면 된다.

np.sqrt(arr)

np.exp(arr)

위 함수들은 단항 유니버설 함수라고 한다.

add나 maximum 처럼 2개의 인자를 취해서 단일 배열을 반환하는 함수는 이항 유니버설 함수라고 한다.

modf는 파이썬 내장함수인 divmod의 백터화 버전인데, 분수를 받아서 몫과 나머지를 함께 반환한다.

 

4.3 배열을 이용한 배열지항 프로그래밍

Numpy 배열을 사용하면 반복문을 작성하지 않고 간결한 배열 연산을 많은 종류의 데이터 처리 작업을 할 수 있다.

배열 연산을 사용해서 반복문을 명시적으로 제거하는 기법을 흔히 벡터화라고 부르는데,

일반적으로 벡터화된 배열에 대한 산술 연산은 순수 파이썬 연산에 비해 2~3 배에서 많게는 수집, 수백 배 까지 빠르다.

브로드캐스팅 은 아주 강력한 벡터 연산 방법이다.

 

np.meshgrid함수는 두 개의 1차원 배열을 받아서 가능한 모든(x,y) 짝을 만들 수 있는 2차원 배열 두개를 반환한다.

np.meshgrid 가능한 모든 짝 

 

4.3.1 배열 연산으로 조건절 표현하기

numpy.where함수는 x if 조건 else y같은 삼항식의 벡터화된 버전이다.

xarr = np.array([1.11.21.31.41.5])

yarr = np.array([2.12.22.32.42.5])

cond = np.array([TrueFalseTrueTrueFalse])

 

result = [(x if c else y) for x,y,c in zip(xarr, yarr, cond)]

print(result)

 

result = np.where(cond, xarr, yarr)

print(result)

numpy.where로 넘기는 배열은 그냥 크기만 같은 배열이거나 스칼라 값이 될 수 있다.

 

4.3.2 수학 메서드와 통계 메서드

배열 전체 혹은 배열에서 한 축을 따르는 자료에 대한 통계를 수학 함수는 배열 메서드를 사용할 수 있다.

sum, mean, std Numpy의 최상위 함수를 이용하거나 배열의 인스턴스 메서드를 사용해서 구할 수 있다.

axis 인자를 받아서 해당 aixs 에 대한 통계를 계산하고 한 차수 낮은 배열을 반환한다.

 

cumsum과 cumprod메서드는 중간 계산값을 담고 있는 배열을 반환한다.

다차원 배열에서 cumsum같은 누산 함수는 같은 크기의 배열을 반환한다. 하지만 축을 지정하여 부분적으로 계산하면 낮은 차수의 슬라이스를 반환한다.

 

4.3.3 불리언 배열을 위한 메서드

1 True

0 False

any와 all 메서드는 불리언 배열에 특히 유용하다.

any메서드는 하나 이상의 값이 True인지 검사하고 ,

all 메서드는 모든 원소가 True인지 검사한다.

 

4.3.4 정렬

sort()메서드에 

np.sort 메서드는 배열을 직접 변경하지 않고 정렬된 결과를 가지고 있는 복사본을 반환한다.

배열의 분위수를 구하는 쉽고 빠른 방법은 우선 배열을 정렬한 후 특정 분위의 값을 선택하는 것디아.

 

4.3.5 집합 관련 함수

Numpy 는 1차원 ndarray 를 위한 몇가지 기본적인 집합 연산을 제공한다.

np.unique()

np.in1d함수는 두개의 배열을 인자로 받아서 첫 번쨰 배열의 원소가 

두번째 배열의 원소를 포함하느닞 나타내는 불러언 배열을 반환한다.

 

 

4.4 배열 데이터의 파일 입출력

Numpy는 디스크에서 텍스트나 바이너리 형식의 데이터를 불러오거나 저장할 수 있다.

pandas 

 

npy 파일 과 npz파일 

npy 파일

np.save와 np.load는 배열 데이터를 효과적으로 디스크에 저장하고 불러오기 위한 함수다.

배열은 기본적으로 압축되지 않은 원시(가공되지 않은) 바이터리 형식의 .npy파일로 저장된다.

.npy 로 끝나지 않으면 자동적으로 확장자가 추가된다.

np.save()

np.load()

 

npz 파일

np.savez 함수를 이용하면 여러 개의 배열을 압축된 형식으로 저장할 수 있는데, 저장하려는 배열을 키워드 인자 형태로 잔달한다.

npz파일을 불러올 떄는 배열을 필요할 때 불러올 수 있도록 사전 형식의 객체에 저장한다.

np.load()

p.savez_compressed: 압축이 잘 되는 데이터 

np.savez_compressed() 

 

4.5 선형대수

행렬의 곱셈, 분할, 행렬식 그리고 정사각 행렬 수학 같은 선형대수는 배열을 다루는 라이브러리에서 중요한 부분이다.

매트랩 

행렬 곱셈 dot

x.dot(y) np.dot(x,y)

 

numpy.linalg는 행렬의 분할과 역행렬, 행렬식과 같은 것들을 포함하고 있다.

이는 매트랩, R같은 언어에서 사용하는 표준 포트란 라이브러리인 BLAS, LAPACK또는 Intel MKL Math Kernel Library(Numpy 빌드에 따라 다르다)을 사용해서 구현되였다.

from numpy.linalg import inv, qr

X = np.random.randn(5,5)

mat = X.T.dot(X)

print(inv(mat))

 

print(mat.dot(inv(mat)))

 

q,r = qr(mat)

print(r)

print(q)

반응형

+ Recent posts