코딩못하는사람

Numpy모듈 본문

머신러닝,마이닝

Numpy모듈

공부절대안함 2020. 9. 17. 17:22

1 NumPy 기본: 배열과 벡터 연산

Numpy 에서 제공하는 것

• 효율적인 다차원 배열인 ndarray는 빠른 배열 계산과 유연한 브로드캐스팅 기능 제공

• 반복문을 작성할 필요 없이 전체 데이터 배열을 빠르게 계산 할 수 있는 표준 수학함수

• 배열 데이터를 디스크에 쓰거나 읽을 수 있는 도구와 메모리에 적재된 파일을 다루는 도구

• 선형대수, 난수 생성기, 퓨리에 변환 기능

 

데이터 분석 에서 중요하게 생각하는 기능

• 벡터 배열 상에서 데이터 가공, 정제 , 부분집합, 필터링 변형 그리고 다른 여러 종류의 연산을 빠르게 수행

• 정렬, 유일 원소 찾기, 집한 연산 같은 일방적인 배열 처리 알고리즘

• 통계의 효과적인 표현과 데이터를 수집 요약하기

• 다양한 종류의 데이터를 병합하고 역끼 위한 데이터 정렬과 데이터 간의 관계 조직

• 내부에서 if -elif- else를 사용하는 반복문 대신 사용할 수 있는 조건 표현을 허용하는 배열 처리

• 데이터 묶음 전체에 적용할 수 있는 수집, 변형 , 함수 적용 같은 데이터 처리

 

Numpy 사용

import numpy as np

 

배열선언 np.arange()
my_arr = np.arange(10)  >>[0 1 2 3 4 5 6 7 8 9]       np를 활용
my_list = list(range(10))  >>[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 파이썬 기본 리스트

 

성능차이

Numpy를 사용한 코드 순수한 파이썬으로 작성한 코드보다 > 속도 : 열배 ~ 백배 빠름 > 메모리 적게사용

벡터화:배열의 중요한 특징은 for 을 사용하지않고 데이터를 일괄처리 가능하다

ex)각 배열의 값들을 2배 한다고하면 리스트는 for 문을 사용해야 하지만 np배열은 *2로 바로가능

%time for _ in range(10): my_arr2 = my_arr * 2

total: 59.3 ms

%time for _ in range(10): my_list2 = [x * 2 for x in my_list]

total: 666 ms

 

다차원 배열

(2,3)의 배열을 만든다고 가정하면

data = np.round(np.random.randn(2, 3))*10

[[ 2.  2. -4.]
 [-0.  2. -2.]]

 

산술연산

data*2 = data+data(np타입 array라서 가능하다 리스트였으면 그냥 extend느낌)

[[ 4.  4. -8.] 
 [-0.  4. -4.]]

곱셈도 마찬가지 배열의 값들끼리 이루어짐

• .shape : 튜플과 배열에 저장된 각 차원의 크기

• .dtype : 튜플과 배열에 저장된 자료형

• .ndim : 배열의 차원수

 

ndarrays 생성하기

리스트를 생성후>np.array로 변환시켜줌

data=[1,2,3,4]

data=np.array(data)

 

zeros(): () 사이즈 만큼 0으로 채워진 배열 생성 

ones():() 사이즈 만큼 1으로 채워진 배열 생성 

empty():() 사이즈 만큼 빈 배열 생성

data1 =np.zeros((2,3))
[[0,0,0]

[0,0,0]]

 

dtype로 배열을 만들때 데이터 종류까지 설정가능

arr1 = np.array([1, 2, 3], dtype=np.float64)

arr2 = np.array([1, 2, 3], dtype=np.int32)

 

astype으로 형변환도 가능

 

불린 인덱스

names = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'])

data=np.array([1,2,3,4,5,6,7])

 

print(names == 'Bob')

>>>[ True False False  True False False False]

print(data[names =='Bob')    names에서 True였던 인덱스만 반환

>>>[1 4]

 

fancy indexing:

arr = np.arange(32).reshape((8, 4))>>8*4형식으로 0~31 생성

 

arr[[1, 5, 7, 2], [0, 3, 1, 2]] == arr[[1,0],[5,3],[7,1],[2,2]]

>>>[4,23,29,10]

arr[[1, 5, 7, 2]][:, [0, 3, 1, 2]]    #arr[[1, 5, 7, 2]]한거에서 한번더 전체중에 0,3,1,2인덱스 순으로 배열하는것

>>>[[ 4, 7, 5, 6], [20, 23, 21, 22], [28, 31, 29, 30], [ 8, 11, 9, 10]]

 

배열 전치와 축 바꾸기 

전치행렬 (행과 열 바꾸기) =T

 

Transpose()연산

shape이 있을때 자신이 원하는 순서대로 변경가능

•Shape : (4, 5, 7)

•transpose(0, 1, 2) : (4, 5, 7)

•transpose(0, 2, 1) : (4, 7, 5)

•transpose(1, 2, 0) : (5, 7, 4)

•transpose(1, 0, 2) : (5, 4, 7

 

내적=np.dot

 

Tensor

랭크 :tensor의 차원수

3차원 텐서 Shape 규칙

(x, i, j) @ (x, j, k)을 연산할 때 x는 같거나 양쪽 중 한쪽이 1이여야 하며, 맨 끝 두개의 Shape은 (i, j) @ ( j, k)에서 j는 동일해야하고, 결과 Shape은 (x, i, k)가 된 다.

  • (4, 1, 2) @ (4, 2, 5) = (4, 1, 5) 

  • (4, 1, 2) @ (3, 2, 5) = 가장 앞자리가 달라서 에러 

  • (1, 1, 2) @ (3, 2, 5) = (3, 1, 5)

표현 >>print((rand(4, 1, 2) @ rand(4, 2, 5)).shape) (rand는 numpy.random모듈에 속함)

 

squeeze

필요 없는 텐서를 없애기 (1인것들을 줄여줌)

•Shape : (4, 1, 2) → squeeze : (4, 2)

•Shape : (4, 1, 1, 1, 2) → squeeze : (4, 2)

•Shape : (1, 4, 1, 2) → squeeze : (4, 2)

 

expand_dims

squeeze와 반대로 원하는 Axis에 크기가 1인 Axis를 새로 만듦

•Shape : (4, 2) → expand_dims(0) : (1, 4, 2)

•Shape : (4, 2) → expand_dims(1) : (4, 1, 2)

•Shape : (4, 2) → expand_dims(2) : (4, 2, 1)

 

Concatenate

두 텐서를 이어 붙여서 새로운 텐서. axis 값에 따라 shape의 크기가 늘어나는 곳을 알 수 있다.

 

 

 

 

 

 

 

 

 

 

split

배열을 원하는 크기로 나눠줌

a = np.arange(8.0)

np.split(a, 2)

>>>[array([ 0., 1., 2., 3.]), array([ 4., 5., 6., 7.])]

'머신러닝,마이닝' 카테고리의 다른 글

pandas 모듈 (2)  (0) 2020.10.20
pandas 모듈 Series,DataFrame  (0) 2020.10.19
numpy모듈(2) 실습  (0) 2020.09.28
Perceptron 신경망  (1) 2020.09.18
Comments