AttackOnNunu

Once more into the fray


  • 홈

  • About

  • 태그

  • 카테고리

  • 아카이브

  • 검색

(PYTHON) Day - 3

작성일 2020-01-21 In LANGUAGE 🚀 , PYTHON , HACKERRANK 댓글:

Reference

  • 문제 출처 - HackerRank
  • 파이썬 연습 - Practice - Python

개인적인 생각과 상상으로 작성한 내용들이 포함되어 있습니
문제를 풀고 Discussion Tab을 참고하며 코드 스타일을 개선하려고 노력하고자 합니다


HackerRank

Mean, Var, Std

평균, 분산, 표준편차를 구하는 문제

  • HackerRank 의 답안 출력 양식이 numpy 1.13 버전을 사용하고 있는데
    현제 Python3 numpy는 1.14 버전이기 때문에 PASS하기 위해 버전을 맞춰준다
    import numpy

    numpy.set_printoptions(legacy='1.13')
    N, M = map(int, input().split())

    my_array = numpy.array([input().split() for _ in range(N)], int)
    print(numpy.mean(my_array, axis = 1))
    print(numpy.var(my_array, axis = 0))
    print(numpy.std(my_array))
  • N*M을 입력 받지만 M은 필요 없으므로 N만 입력 받는 식으로 2줄 코딩
    n = np.array([input().split() for \_ in range(int(input().split()[0]))],int)
    print(np.mean(n,axis=1),np.var(n,axis=0),np.std(n),sep="\n")

Sum, Product

덧셈과 곱셈을 구하는 문제

import numpy

# sum 덧셈 default 값이 none과 동일

my_array = numpy.array([ [1, 2], [3, 4] ])

print numpy.sum(my_array, axis = 0) #Output : [4 6]
print numpy.sum(my_array, axis = 1) #Output : [3 7]
print numpy.sum(my_array, axis = None) #Output : 10
print numpy.sum(my_array) #Output : 10

# product 곱셈 (덧셈과 같음 0축이 열, 1축이 행으로 곱함)

print numpy.prod(my_array, axis = 0) #Output : [3 8]
print numpy.prod(my_array, axis = 1) #Output : [ 2 12]
print numpy.prod(my_array, axis = None) #Output : 24
print numpy.prod(my_array) #Output : 24
  • 입력 받은 행렬의 각 열의 합을 먼저 구하고 그 합들의 곱을 최종적으로 출력하는 문제
    import numpy as np

    N, M = map(int, input().split())

    my_array = np.array([input().split() for _ in range(N)], int)
    print(np.prod(np.sum(my_array, axis=0)))

Dot, Cross

내적, 외적을 구하는 문제

import numpy

# dot 내적

A = numpy.array([ 1, 2 ])
B = numpy.array([ 3, 4 ])

print numpy.dot(A, B) #Output : 11

# cross 외적

A = numpy.array([ 1, 2 ])
B = numpy.array([ 3, 4 ])

print numpy.cross(A, B) #Output : -2
  • 2개의 행렬을 입력 받고 내적만 하는 문제
    import numpy

    N = int(input())

    array_A = numpy.array([input().split() for _ in range(N)], int)
    array_B = numpy.array([input().split() for _ in range(N)], int)

    print(numpy.dot(array_A, array_B))

Inner, Outer

두 벡터의 내적(inner product)은 「.」(dot)으로 표기하며, 이래서 점곱(dot product)이라고도 말한다. 혹은 (a, b)와 같이 표기하기도 한다.
결과값이 스칼라이기 때문에 스칼라곱(scalar product)이라고도 하며, 계산할 때 한쪽 벡터의 코사인값을 사용하기 때문에
(즉, 한쪽 벡터에 직사광선을 쪼였을 때 그 그림자에 해당하는 코사인값을 사용) 영사곱(projection product)이라고도 말한다.

똑같은 개념을 두고 왜 이리 표현하는 말들이 많은지 의아할 수도 있는데, 대수학, 기하학, 물리학 등의 학문영역별로 명칭, 표기가 다르다는 정도만 이해하면 된다.
최적화에서도 민감도분석할 때 보면 수학자는 쌍대변수(dual variable)이라고 말하는데 경제학자들은 잠재가격(shadow price)라고 말한다.

외적 또한 cross product 혹은 outer product라고 한다
자세한 설명은 아래 링크를 통해 반복 복습!!
https://rfriend.tistory.com/146?category=606751

  • 내적 외적하는 문제
    입력에 대한 2가지 코딩 스타일
    import numpy as np

    A = np.array(list(map(int,input().split())))
    # 1차원 리스트를 만들고 싶기 때문에 []를 생략함!
    B = np.array(input().split(), int)

    print(np.inner(A,B), np.outer(A, B), sep='\n')

(PYTHON) Numpy - Broadcasting

작성일 2020-01-20 In LANGUAGE 🚀 , PYTHON , TERMINOLOGY 댓글:

Reference

  • Broadcasting, 브로드캐스팅- 정보통신기술용어해설

  • Broadcasting arrays in Numpy - Eli Bendersky’s website

  • Array Broadcasting in NumPy - SciPy.org

  • The foundation of scientific python - oreilly.com


Numpy

broadcasting

흔히 방송과 관련해서 ‘브로드캐스트(broadcast)’라는 용어를 자주 들었을 것 입니다.
‘TV나 신문과 같은 전송매체를 통해 대중에게 정보를 전송하는 행위’ 라고 일반적으로 정의합니다.
혹은 네트워크 과목을 배우셨으면 유니캐스트(unicast), 멀티캐스트(multicast)를 같이 떠올리시며
단일 노드로부터 해당 네트워크의 모든 노드에게 패킷/프레임을 전파하는 것 으로 이해하실 수 있습니다.

broadcast

Python의 Numpy 패키지에서는 해당 용어를 조금 다르게 정의합니다.

“Broadcasting is the process of making arrays to have compatible shapes for arithmetic operations.”

Broadcasting은 서로 다른 구조(shape)를 가진 배열의 산술 연산이 가능하도록 차원을 맞춰주는 것 을 말합니다.

아시다 싶이 행렬의 덧셈과 뺄셈은 각 행렬이 같은 구조일 때만 가능합니다.
행렬의 곱셈에서는 앞 행렬의 열(column)의 수와 뒷 행렬의 행(row)의 수가 같으면 연산이 가능합니다.

아래 예제는 3-차원 벡터 2개의 곱셈을 연산하는 코드로 아무런 문제 없이 결과값이 출력되는 것을 볼 수 있습니다.

from numpy import array
a = array([1.0, 2.0, 3.0])
b = array([2.0, 2.0, 2.0])
a \* b

# output

# array([ 2., 4., 6.])

하지만 만약 3-차원 벡터와 스칼라 값의 곱셈을 연산하는 코드를 실행하면 어떻게 될까요?

from numpy import array
a = array([1.0, 2.0, 3.0])
b = 2.0
a \* b

# output

# array([ 2., 4., 6.])

이 또한 별 문제 없이 정상적으로 결과값을 출력한다는 것을 볼 수 있습니다.

행렬의 연산은 같은 크기(차원)일 때만 가능한데
위 코드가 정상적으로 동작한다는 것을 보니 내부적으로 연산을 위해 스칼라 값을 같은 차원의 벡터 값으로 변환했다는 것을 유추할 수 있습니다.
즉, Numpy에서는 브로드캐스팅을 통해 두 행렬 간 연산이 가능하도록 아래 그림과 같이 상대적으로 작은 행렬의 차원(크기)을 큰 행렬과 맞춰주는 것 입니다.

figure1

broadcasting rule

그렇다고 이 브로드캐스팅이 만능인 것은 아닙니다.
최소한의 조건은 만족해야 동작하는데 이러한 조건을 broadcasting rule 이라고 합니다.

“In order to broadcast, the size of the trailing axes for both arrays in an operation must either be the same size or one of them must be one.”

Broadcasting이 허용되려면, 각 행의 크기(차원)가 같거나 둘 중 하나라도 1이면 됩니다.

정의만으로는 이해가 잘 안되지만 몇 가지 예제를 보시면 매우 간단하다는 것을 깨닫게 될 것입니다.

A
B
(2d array)
(1d array)
4 x 3
   3
Result(2d array)4 x 3
A
B
(2d array)
(1d array)
4 x 3
   1
Result(2d array)4 x 3
A
B
(4d array)
(3d array)
8 x 1 x 6 x 1
   7 x 1 x 5
Result(4d array)8 x 7 x 6 x 5
A
B
(3d array)
(3d array)
15 x 3 x 5
   3 x 1
Result(3d array)15 x 3 x 5
A
B
(1d array)
(1d array)
3
4
Resulterrorerror
A
B
(3d array)
(2d array)
8 x 4 x 3
   2 x 1
Resulterrorerror

figure2

figure2

figure2

from numpy import array
a = array([[0.0, 0.0, 0.0],
[10.0, 10.0, 10.0],
[20.0, 20.0, 20.0],
[30.0, 30.0, 30.0]])
b = array([1.0, 2.0, 3.0])
a + b

# output

# array([[ 1., 2., 3.],

# [ 11., 12., 13.],

# [ 21., 22., 23.],

# [ 31., 32., 33.]])

from numpy import array, newaxis
a = array([0.0, 10.0, 20.0, 30.0])
b = array([1.0, 2.0, 3.0])
a[:,newaxis] + b

# output

# array([[ 1., 2., 3.],

# [ 11., 12., 13.],

# [ 21., 22., 23.],

# [ 31., 32., 33.]])


N-dimensional arrays

Numpy에서 차원에 따라 axis가 조금씩 헷갈리기 때문에 그림을 잘 기억하도록 하자

dimensional arrays

(PYTHON) Day - 2

작성일 2020-01-20 In LANGUAGE 🚀 , PYTHON , HACKERRANK 댓글:

Reference

  • Numpy - Numpy.org
  • 문제 출처 - HackerRank
  • 파이썬 연습 - Practice - Python

개인적인 생각과 상상으로 작성한 내용들이 포함되어 있습니다
문제를 풀고 Discussion Tab을 참고하며 코드 스타일을 개선하려고 노력하고자 합니다


Numpy

개요 - About NumPy

Numpy는 Python에서 scientific computing을 하기 위한 기본 패키지입니다.

Scientific computing이란
과학적 문제를 해결 및 분석하기 위한 시뮬레이션이나 수학적 모델링 및 정량 분석 등을 수행하는 소프트웨어 및 애플리케이션을 개발하는 것을 말합니다

Numpy의 특징들 중에서도 특히:

  • 강력한 N-차원 배열 객체
    [a powerful N-dimensional array object]
  • 세련된 기능들
    [sophisticated (broadcasting) functions]
  • C/C++ 및 Fortran 코드 통합 도구
    [tools for integrating C/C++ and Fortran code]
  • 유용한 선형 대수, 푸리에 변환 및 난수 기능
    [useful linear algebra, Fourier transform, and random number capabilities]

이런 과학적인 용도 이외에도, Numpy는 일반 데이터의 효율적인 다차원 컨테이너로 사용될 수 있으며 임의의 데이터 타입을 선언할 수도 있습니다.
Numpy를 통해 다양한 데이터베이스와 원활하고 신속하게 통합할 수 있습니다.

역사 - Older Array Packages

파이썬에서 최초로 배열 객체와 관련해서 작성된 패키지는 Numeric 이였습니다.
과거에는 다양한 어플리케이션 개발에 유용하게 사용되었는데… 사람의 욕심은 끝이 없고…
더 많은 기능이 포함된 Numarray 패키지를 구현해서 사용하게 됩니다.
굳이 2개로 놔두는 것 보다 통합하는 것이 좋겠다 싶어서 Numeric과 Numarray 패키지의 기능들을 모두 포함시켜 지금의 NumPy 패키지를 탄생시켰습니다.

NumPy가 처음 만들어지고 이제 막 사용되던 2005년 말 약 6개월 동안에는 SciPy Core 라고 불렸습니다.
하지만 좀 더 명확하게 용도와 기능에 맞게 구분하기 위해 현재 SciPy 패키지는 따로 분리되어 존재하게 되었고
2006년 1월에 Numeric + Python 을 합쳐 NumPy 라는 명칭으로 변경되어 현재까지 사용되고 있습니다.


HackerRank

1차원 - vector (row)
2차원 - matrix (row, column)
3차원 - tensor (row, column, depth)

axis에 대해서: 2차원 좌표평면을 생각하면서 x축(row), y축(col)이 각각 0, 1에 해당한다고 생각하면 외우기 쉬움

  • NumPy에서 axis의 이해 TAEWAN.KIM

Min, Max

각 열의 최소값을 먼저 찾고 그 중 최대값을 결과로 출력하는 문제

import numpy

N, M = map(int, input().split())
my_array = numpy.array([input().split() for _ in range(N)], int)

print(numpy.max(numpy.min(my_array, axis=1)))

배열만 사용하기 때문에 array만 호출하고,
‘.’을 사용한 코딩

from numpy import array
n, _m = map(int, input().split())
a = array([input().split() for _ in range(n)], int)
print(a.min(axis=1).max())

__ 극한의 한 줄 코딩

print(np.max(np.min(np.array([input().split() for _ in range(int(input().split()[0]))],int),axis=1))) 

Floor, Ceil, Rint

이 문제에서는 내림, 올림, 반올림(정수로)만 다루지만 추가적으로,

  • around() : 0.5를 기준으로 올림 혹은 내림
  • round_( , N) : N 소수점 자릿수까지 반올림
  • fix() : ‘0’ 방향으로 가장 가까운 정수로 올림 혹은 내림
  • trunc() : 각 원소의 소수점 부분은 잘라버리고 정수값만 남김
    들이 존재한다.

HackeRank의 체점 시스템의 버그로 출력 옵션을 조금 수정해줘야 한다.

import numpy as np

np.set_printoptions(sign=' ')

a = np.array(input().split(), float)
print(np.floor(a))
print(np.ceil(a))
print(np.rint(a))

이런 출력 방식이 있다는 것을 참고!

import numpy as np
a = np.array(input().split(), float)
print(\*(f(a) for f in [np.floor, np.ceil, np.rint]), sep='\n')
1…151617…33
NUNU

NUNU

개인적으로 공부하면서 정리한 내용들을 블로그에 남기고 있습니다.
99 포스트
18 카테고리
53 태그
RSS
Creative Commons
© 2021 NUNU
Powered by Hexo v3.9.0
|
Theme – NexT.Mist v7.2.0