Loading...

Python / / 2022. 5. 12. 09:48

파이썬 11강. numpy

반응형

 

 

 

파이썬은 객체를 지향하는 언어는 아니다.

모든 게 1급 객체이기 때문에 기본 자료형이 값을 들고있는건 아무것도 없다는 말이다.

모든게 다 콜 바이 레퍼런스!

포인터인 것이다.

 

사이즈를 모르기 때문에 모두 heap 주소를 참조한다.

 

레퍼런스 타입의 단점은 항상 점프해야한다.

 

20번 주소로 갔더니 300번지라고 적혀있어서 300번지로 가면 안녕이라는 데이터가 있다.

300번지가 포인터인것이다.

 

찾아갔을때 값이 바로 있는게 찾기 빠른데,

주소가 있어서 한번 더 찾아가야 하면 느려지기 때문에 나온게 numpy 라이브러리이다.

수치연산 라이브러리!

 

장점

1. 차원을 다루기 좋은 메서드를 많이 제공한다.

 

2. call by reference 단점 해결

→ numpy 라이브러리를 사용하는 순간 API가 된다.

 

numpy를 사용하면 c++ 언어로 만들어진 메서드를 사용하게 된다.

 

c++은 엄청 빠르고 타입도 더 세밀하게 나뉘어져있다.

c++은 일반인이 사용하기 어렵기 때문에 numpy라는 라이브러리로 만든것이다.

 

예를 들어 일반인이 column_stack이라는 메서드를 호출하면 사실 내부는 비어있고

호출하는 순간 c++ 메서드를 콜한다.

 

실제 연산은 c++ 언어로 하고 numpy는 콜하고 리턴값을 받는다.

 

즉 numpy는 인터페이스이다.

 


 

주피터 노트북을 사용하기 때문에 라이브러리가 다 설치되어있다.

import만 해서 사용해주면 된다.

 

import numpy as np

temp1 = [1, 2, 3, 4] # 레퍼런스
arr1 = np.array(temp1, dtype=np.float16)

print(type(temp1))
print(type(arr1))

print(temp1)
print(arr1) # 콤마 없이 . 어쩌구 하는거 numpy!

 

temp1은 파이썬 타입이다.

1, 2, 3, 4 모두 레퍼런스인 것이다.

 

이를 넘파이 리스트로 변경할 때 np.array 메서드를 사용한다.

이때 타입을 지정해줘야한다.

 

1, 2, 3, 4를 표현할 때는 3비트면 되겠다.

1비트로는 0과 1만 표현할 수 있잖아!

 

dtype=np.float16

 

float은 자바에서 4바이트이다.

옆에 적힌 숫자는 비트를 말한다.

 

왜 np.array에 타입을 지정해줄까?

용량을 효율적으로 사용하기 위해서이다.

 

출처 https://rfriend.tistory.com/285

 

 


 

arr1.shape를 사용해보니 (4, ) 라고 결과가 나온다.

4개의 행이 있고 열이 없는 1차원 배열(벡터)이라는 것이다.

 

print(type(arr1[0]))
print(type(temp1[0]))
print(arr1.shape) # (4, 1) 행만 있고 열이 없는 1차원 배열

 

temp2 = [
    [1, 2, 3],
    [4, 5, 6], 
    [7, 8, 9],
    [10, 11, 12]
]

arr2 = np.array(temp2, dtype=np.int8)

print(arr2)
print(arr2.shape)

 


 

3 방향이 없는 상수 : 0차원 스칼라 Scala

[3, 3, 4, 5] 방향이 있는 연속되는 숫자 : 1차원 벡터 Vector

[
  [1, 2],
  [3, 4]

1차원 배열이 모여있는 2차원 배열

: 2차원 매트릭스 Matrix (DB 테이블과 동일)

2차원 데이터를 분석하는데 최적화 된 라이브러리 : pandas (R과 유사)
2차원을 제외한 모든 것은 numpy 사용!

3차원 텐서 Tensor

 


 

스프링 컨트롤러에서 필요한 데이터만 정제해둔 뒤 데이터를 리턴해주는 주소만 파이썬에게 알려주고

파이썬에서 requests로 데이터를 내려받을 수 있다.

 

실시간으로 db에는 데이터가 수집되어 쌓이고 있기 때문에

내가 최신 데이터를 request 요청한 것은 아니게된다.

이런 서버는 stateless하게 만들지 않는다.

 

그래서 request 후에 응답을 받고나서 연결을 모두 끊는게 아니라

request 커넥션만 끊고 response 커넥션은 유지한다.

그리고 데이터가 변경될때마다 DB 서버에서 push해준다.

 

빅데이터 플랫폼을 만들때는 리얼 타임 서버를 만든다. (push 서버)

 

request하고 요청을 받으면 request 선은 끊기지만 response 선은 연결되고,

새로운 데이터가 들어올때마다 계속해서 push해주는 것이다.

 

1. http 프로토콜 : 응답 후 연결 다 끊는 것 

 

2. 소켓통신 : request, response 연결 둘 다 유지하는 것 

 

3. SSE 프로토콜 : request 연결만 끊는 것

내가 요청이 필요할 때는 다시 request하면 되는거고 ,

response가 연결되어있으니까 구독하고 있는 거니까 변경이 일어날때마다 push해준다.

 


 

temp3 = [ # 2차원 리스트
    [1, 2, 3, 4], 
    [1, 2, 5, 8]
]

matrix1 = np.array(temp3) # 디폴트값이 있어서 타입 지정 안해줘도됨

print(matrix1.size) # 8
print(matrix1.shape) # 2행 4열
print("=" * 50)

# 1차원으로 변환 vector
arr1 = matrix1.reshape(8, )
print(arr1) # flatten 평평하게 만들기
print("=" * 50)

# 2차원으로 변환 matrix
arr2 = matrix1.reshape(4, 2) # 사이즈를 같게해야함!!
print(arr2)
print("=" * 50)

# 3차원으로 변환 tensor
arr3 = matrix1.reshape(1, 2, 4) # 제일 마지막 인자가 컬럼이니까 얘부터 만들어보면 덜헷갈리겠다
print(arr3)

 

# 슬라이싱

temp4 = [
    [1, 2, 3, 4], 
    [1, 2, 5, 8]
]

matrix1 = np.array(temp4)
# print(matrix1[0][0]) # 1

print(matrix1[0, 0]) # numpy에서만 가능한 문법 : [0][0]을 [0, 0]으로 사용 가능
print(matrix1[:, 1:3]) # 시작번지 : 0, 끝번지 직전까지 출력
print(matrix1[1, 2:])

 

temp1 = [
    [0, 1, 2, 3, 4],
    [5, 6, 7, 8, 9],
    [10, 11, 12, 13, 14]
]

m1 = np.array(temp1)

arr1 = m1.reshape(15) # == m1.reshape(-1) == m1.reshape(m1.size) == m1.flattern()
print(arr1)
print(m1) # m1은 변하지 않음. reshape는 기존 값을 변경하지 않는 불변 함수 -> 복제

 

# step
temp1 = [
    [0, 1, 2, 3, 4],
    [5, 6, 7, 8, 9],
    [10, 11, 12, 13, 14]
]

print(m1[:, 0]) # 모든 행의 첫번째 열 출력
print(m1[:, 0::2]) # 2씩 step
print(m1[::2, :])

 

arr1 = np.arange(10) # 배열 생성 함수
print(arr1)
print(arr1.reshape(2, 5))
print("=" * 50)

arr2 = np.zeros(shape=(10,)) # false
print(arr2)
print("=" * 50)

arr3 = np.ones(shape=(10,)) # true
print(arr3)
print("=" * 50)

arr4 = np.ones_like(arr3) # arr3와 같은 모양으로 1을 채운 배열
print(arr4)
arr5 = np.zeros_like(arr2)
print(arr5)

 

 

 

[출처]

 

https://cafe.naver.com/metacoding

 

메타코딩 : 네이버 카페

코린이들의 궁금증

cafe.naver.com

메타 코딩 유튜브

https://www.youtube.com/c/%EB%A9%94%ED%83%80%EC%BD%94%EB%94%A9

 

메타코딩

문의사항 : getinthere@naver.com 인스타그램 : https://www.instagram.com/meta4pm 깃헙 : https://github.com/codingspecialist 유료강좌 : https://www.easyupclass.com

www.youtube.com

 
반응형