Numpy

이브이·2021년 3월 20일
0
post-thumbnail

Numpy array의 장점
python list() 보다 빠른 연산, 효율적 메모리 사용.

numpy array vs python list

문법 차이



성능차이

자주 쓰이는 함수

np.array - 배열 생성
np.zeros - 0이 들어있는 배열 생성
np.ones - 1이 들어있는 배열 생성
np.empty - 초기화가 없는 값으로 배열을 반환
np.arange(n) - 배열 버전의 range 함수
np.random - 다양한 난수가 들어있는 배열 생성

예시


list(range(10))
#[0,1,2,3,4,5,6,7,8,9]

import numpy as np

#1차원 배열
np.array([1, 2, 3, 4, 5])
#array([1, 2, 3, 4, 5])

#중간에 실수 형태가 들어갈 때 
np.array([1, 2.1, 3, 4, 5])
#array([1., 2.1, 3., 4., 5.])

#2차원 배열 
np.array([1, 2],
		[3, 4])
# array([1, 2],
		[3, 4])
    
# 실수 형태로 만들기
np.array([1, 2, 3, 4], dtype='float')
#array([1., 2., 3., 4.])

배열 데이터 타입 dtype

Python List와 다르게 array는 단일타입으로 구성

dtype설명다양한표현
int정수형타입i, int_, int32, int64, i8
float실수형타입f, float_, float32, float64, f8
str문자열타입str, U, U32
bool부울타입?, bool_

ndarray : n차원의 array

arr = np.array([1, 2, 3, 4], dtype=float)
arr # array([1., 2., 3., 4.])

arr.dtype
# dtype(‘float64’)

arr.astype(int)
# array([1, 2, 3, 4])

다양한 배열 만들기

np.zeros(10, dtype=int)
# array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])

np.ones((3, 5), dtype=float)
# array([[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.]])

np.arange(0, 20, 2)
# array([ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18])

np.linspace(0, 1, 5)
# array([0. , 0.25, 0.5 , 0.75, 1. ])

난수로 채워진 배열 만들기

np.random.random((2, 2))
# array([[0.30986539, 0.85863508],
[0.89151021, 0.19304196]])

np.random.normal(0, 1, (2, 2))
# array([[ 0.44050683, 0.04912487],
[-1.67023947, -0.70982067]])

np.random.randint(0, 10, (2, 2))
# array([[3, 9],
[3, 2]])

배열의 기초

x2 = np.random.randint(10, size=(3, 4))
# array([[2, 2, 9, 0],
[4, 2, 1, 0],
[1, 8, 7, 3]])

#차원
x2.ndim # 2

#행렬의 모형
x2.shape # (3, 4)

#원소 갯수
x2.size # 12

x2.dtype # dtype(‘int64’)

찾고 잘라내기

Indexing, Slicing -> python과 동일

모양 바꾸기

reshape: array의 shape를 변경

x = np.arange(8)
x.shape
# (8,)
x2 = x.reshape((2, 4))
# array([[0, 1, 2, 3],
[4, 5, 6, 7]])
x2.shape
# (2, 4)

이어 붙이고 나누고

concatenate: array를 이어 붙임

x = np.array([0, 1, 2])
y = np.array([3, 4, 5])
np.concatenate([x, y])
# array([0, 1, 2, 3, 4, 5])

np.concatenate: axis축을 기준으로 이어붙임

matrix = np.arange(4).reshape(2, 2)
np.concatenate([matrix, matrix], axis=0)

np.concatenate: axis축을 기준으로 이어붙임

matrix = np.arange(4).reshape(2, 2)
np.concatenate([matrix, matrix], axis=1)

np.split: axis축을 기준으로 분할

matrix = np.arange(16).reshape(4, 4)
left, right = np.split(matrix, [3], axis=1)

NumPy 연산

기본연산

array는 +, - *, /에 대한 기본 연산을 지원

x = np.arange(4)
# array([0, 1, 2, 3])
x + 5
# array([5, 6, 7, 8])
x - 5
# array([-5, -4, -3, -2])
x * 5
# array([ 0, 5, 10, 15])
x / 5
# array([0. , 0.2, 0.4, 0.6])

행렬간 연산

다차원 행렬에서도 적용 가능

x = np.arange(4).reshape((2, 2))
y = np.random.randint(10, size=(2, 2))
x + y
# array([[1, 7],
[6, 5]])
x - y
# array([[-1, -5],
[-2, 1]])

브로드캐스팅

Broadcasting: shape이 다른 array끼리 연산
matrix + 5

matrix + np.array([1, 2, 3])

np.arange(3).reshape((3,1)) + np.arange(3)

집계 함수 & 마스킹 연산

집계: 데이터에 대한 요약 통계

max 메소드와 min 메소드를 사용하면 numpy array의 최댓값과 최솟값을 구할 수 있습니다.
mean 메소드를 사용하면 numpy array의 평균값을 구할 수 있습니다.
median 메소드를 사용하면 중간값을 구할 수 있는데요. 특이하게 median은 numpy array의 메소드가 아니라 numpy의 메소드입니다.

x = np.arange(8).reshape((2, 4))
np.sum(x)
# 28
np.min(x)
# 0
np.max(x)
# 7
np.mean(x)   => 평균 평균
# 3.5
np.std(x)   => 표준편차 
------------------------------------
x = np.arange(8).reshape((2, 4))
np.sum(x, axis=0)
# array([ 4, 6, 8, 10])
np.sum(x, axis=1)
# array([ 6, 22])

마스킹연산: True, False array를 통해서 특정값 뽑아내는 방법

x = np.arange(5)
# array([0, 1, 2, 3, 4])
x < 3
# array([ True, True, True, False, False])
x > 5
# array([False, False, False, False, False])
x[x < 3]
# array([0, 1, 2])

파이썬 리스트를 통해 생성

numpy 모듈의 array 메소드에 파라미터로 파이썬 리스트를 넘겨주면 numpy array가 리턴됩니다.

array1 = numpy.array([2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31])
    
print(array1)
[ 2  3  5  7 11 13 17 19 23 29 31]

균일한 값으로 생성

numpy 모듈의 full 메소드를 사용하면, 모든 값이 같은 numpy array를 생성할 수 있습니다.

array1 = numpy.full(6, 7)
    
print(array1)
[7 7 7 7 7 7]

모든 값이 0인 numpy array 생성

모든 값이 0인 numpy array를 생성하기 위해서는 full 메소드를 사용하면 되겠죠. 하지만 사실은 더 간편한 방법이 있습니다.

array1 = numpy.full(6, 0)
array2 = numpy.zeros(6, dtype=int)
    
print(array1)
print()
print(array2)
[0 0 0 0 0 0]

[0 0 0 0 0 0]

모든 값이 1인 numpy array 생성

모든 값이 1인 numpy array를 생성하는 것도 비슷합니다. zeros 메소드 대신 ones를 사용하면 됩니다.

array1 = numpy.full(6, 1)
array2 = numpy.ones(6, dtype=int)
    
print(array1)
print()
print(array2)
[1 1 1 1 1 1]

[1 1 1 1 1 1]

랜덤한 값들로 생성

어쩔 때는 임의의 값들로 배열을 생성시키고 싶습니다. 그럴 때는 numpy의 random 모듈의 random 함수를 사용하면 됩니다.

numpy 모듈 안에 random이라는 모듈이 있고, 그 안에 또 random이라는 함수가 있는 겁니다!

array1 = numpy.random.random(6)
array2 = numpy.random.random(6)
    
print(array1)
print()
print(array2)
[0.42214929 0.45275673 0.57978413 0.61417065 0.39448558 0.03347601]

[0.42521953 0.65091589 0.94045742 0.18138103 0.27150749 0.8450694 ]

연속된 값들이 담긴 numpy array 생성

numpy 모듈의 arange 함수를 사용하면 연속된 값들이 담겨 있는 numpy array를 생성할 수 있습니다.

arange 함수는 파이썬의 기본 함수인 range와 굉장히 비슷한 원리로 동작하는데요. 파라미터가 1개인 경우, 2개인 경우, 3개인 경우 모두 살펴봅시다.

파라미터 1개

arange(m)을 하면 0부터 m-1까지의 값들이 담긴 numpy array가 리턴됩니다.

array1 = numpy.arange(6)
print(array1)
[0 1 2 3 4 5]

파라미터 2개

arange(n, m)을 하면 n부터 m-1까지의 값들이 담긴 numpy array가 리턴됩니다.

array1 = numpy.arange(2, 7)
print(array1)
[2 3 4 5 6]

파라미터 3개

arange(n, m, s)를 하면 n부터 m-1까지의 값들 중 간격이 s인 값들이 담긴 numpy array가 리턴됩니다.

array1 = numpy.arange(3, 17, 3)
print(array1)
[ 3  6  9 12 15]

출처 : 코드잇 - 데이터 사이언스 시작하기

profile
자 이제 시작이야. 내 꿈을 위한 여행

0개의 댓글

관련 채용 정보