기본 콘텐츠로 건너뛰기

[matplotlib]quiver()함수

Numpy Introduction

1. 개요 

NumPy의 주요목적은 동일한 자료형의 다차원의 배열을 만드는 것으로 
일반적으로 숫자이지만 다른 동일한 자료형의 원소들에 대한 테이블의 형식을 가지며 양의 정수로 인덱싱된다
NumPy에서 차원들은 axes로 불리며 그 axes의 개수는 rank라고 한다.

예를 들어 3차원 공간에서 [1,2,1] x, y, z 축으로구성되는 공간에서 1개의 점을로 표현될 수 있으므로 rank 1의 배열이다이 배열은 행렬과 유사한 구조이고 rank는 행렬의 행의 수로 간주할 수 있다예를들어 아래의 경우는 rank 2 , 2차원의 배열을 나타낸다

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


Numpy np 클래스로 구성되어 있으며 그 클래스의 메소드로 생성한 객체의 여러 특성들을 조사할 수 있다
사용하기 위해 다음과 같이 Numpy 모듈을 호출하여 배열을 생성해보자.
import numpy as np
a=np.array([1,2,3]) print(a)
[1 2 3]
a.dtype #dtype은 자료의 형태를 나타낸다. b=np.array([1, 3.4, 7,9.2]) #int, float를 같이 생성할 경우 int는 float로 자동변환된다.
print(b)
[ 1. 3.4 7. 9.2]
b.dtype
dtype('float64')

또한 아래와 같이 자료형을 먼저 지정하여 배열을 생성할 수 있다.
c=np.array([[1.5, 2.3],[4, 5.6]], dtype=complex)
c
array([[ 1.5+0.j, 2.3+0.j],
[ 4.0+0.j, 5.6+0.j]])

많은 경우 배열의 원소들은 모르고그 크기만 알려질 경우가 존재하며 이 경우 Numpy는 알려진 차원의 모든 원소를 0 또는 1, 의미없는 수로 하고 각 위치에 원소들을 추가하는 방식으로 배열을 생성한다
np.zeros((rank의 수(=행의수), 열의수배열의 수)): 모든 원소가 0으로 생성된다
np.ones():  모든 원소를 1로 생성 
np.empty(): 초기화되지 않은 원소들로 채워진 배열을 생성할 경우 사용한다. empty일 경우 원소 값들은 의미없는 값들로 채워진다.

np.zeros((2,4))
[[ 0.  0.  0.  0.]
 [ 0.  0.  0.  0.]]
np.ones((3,4), dtype=int)
[[1 1 1 1]
 [1 1 1 1]
 [1 1 1 1]]
np.empty((2, 3))
[[  2.12199579e-314   2.12199579e-314   2.12199579e-314]
 [  2.12199579e-314   2.12199579e-314   2.12199579e-314]]
연속되 수로 채워진 배열을 생성할 경우 np.arange(시작수끝수간격)을 사용하며 이 함수는 range()와 유사하다.
np.arange(1,10,2)
array([1, 3, 5, 7, 9])
 arange 함수는 일정한 간격으로 연속수를 생성하는데 그 원소가 부동소수일 경우 정확히 예상되는 값을 반환하지 않는 경우가 있다이 경우 특정한 수들 사이에 정확한 간격으로 생성할 수의 갯수를 지정하는 것이 보다 정확한 경우가 있다이 경우 사용할 수 있는 함수가 linspace() 함수이다.
np.linspace(0,0.1, 10) array([ 0. , 0.01111111, 0.02222222, 0.03333333, 0.04444444, 0.05555556, 0.06666667, 0.07777778, 0.08888889, 0.1 ])
위에서 생성한 arange()함수에 의한 배열은 1차원이다. 이 배열을 다차원으로 만들기 위해
np.reshape(객체, (행, 열)) 매소드를 사용한다.
a=np.linspace(1,10, 12)
print(a)
[ 1. 1.81818182 2.63636364 3.45454545 4.27272727
5.09090909 5.90909091 6.72727273 7.54545455 8.36363636
9.18181818 10. ]
a1=a.reshape(3,4)#np.reshape(a, (3,4))
[[ 1. 1.81818182 2.63636364 3.45454545]
[ 4.27272727 5.09090909 5.90909091 6.72727273]
[ 7.54545455 8.36363636 9.18181818 10. ]]


print(a1)

2. 기본연산

배열 사이의 사칙연산은 같은 위치(인덱스)를 가진 원소들 사이에서 이루어진다.
나누기에서 분모가 0인 경우 inf로 반환된다.

a=np.linspace(1,10, 4).reshape(2,2) b=np.array([1,0,2,5]).reshape(2,2)
print(a)
[ 7. 10.]]
[[1 0]
[2 5]]
[[ 2. 4.]
[ 9. 15.]]
print(a-b)
[[ 0. 4.]
[ 5. 5.]]
print(a*b)
[[ 1. 0.]
[ 14. 50.]]
print(a/b)
[[ 1. inf]
[ 3.5 2. ]]
[[ 1. 4.]
print(b)

print(a+b)
거듭제곱 역시 원소별로 연산된다.
print(a**2)
[[ 1. 16.]
[ 49. 100.]]
위와 같은 연산은 기본적으로 각 배열 원소들의 자료형이 동일해야 하지만 정수와 부동소수의 연산에서는 결과는 부동소수형으로 반환된다.

행렬곱은 dot()함수를 사용한다. 
np.dot(a, b)
array([[ 9., 20.],
[ 27., 50.]])
다음이 성립한다.
두 수 또는 두 배열에서
a += b : a = a+b
a -= b : a = a-b
a *= b : a = a*b
a-=b
print(a)
[[ 0. 4.]
[ 5. 5.]]
이 결과는 위의 a-b 와 같다.

np.random.randn(행의수, 열의 수): 배열의 차원에 대응되는 랜덤수를 생성한다.
a=np.random.randn(3, 4)
print(a)[[ 0.55576641 -1.52804787 0.95204818 0.0058944 ] [ 1.46959748 -0.02880267 0.18168452 -1.79988331] [-1.02709437 -1.61528953 0.32983511 0.75436175]]
a=np.around(a, 0)
print(a)
[[ 1. -2. 1. 0.]
[ 1. -0. 0. -2.]
[-1. -2. 0. 1.]]

np.around(객체, 자릿수): 부동소수점의 자릿수 지정하여 반올림한다.


배열의 합, 최대, 최소값, 누적합은 각각
np.sum(객체, axis=None), np.max(객체, axis=None), np.min(객체, axis=None), np.cumsum(axis=None)함수를 사용한다. 매개변수 axis의 인수 1은 행, 0은 열을 의미한다. 적용하는 데이터의 구조가 모두 np 배열이라면 위 함수는 객체.sum() 과 같이 사용할 수 있다.
print(a)
[[ 1. -2. 1. 0.]
[ 1. -0. 0. -2.]
[-1. -2. 0. 1.]]
print(a.sum()) #=np.sum(a)-3.0
print(a.max())#=np.max(a)
1.0
print(a.min())#=np.min((a)
-2.0
[ 1. -1. 0. 0. 1. 1. 1. -1. -2. -4. -4. -3.]
[ 0. -1. -2.]
print(a.max(axis=1))
[ 1. 1. 1.]
print(a.min(axis=1))
[-2. -2. -2.]
print(np.cumsum(a, axis=1))
[[ 1. -1. 0. 0.]
[ 1. 1. 1. -1.]
[-1. -3. -3. -2.]]

print(a.cumsum())#=np.cumsum(a)


print(a.sum(axis=1))

댓글

이 블로그의 인기 게시물

[Linear Algebra] 유사변환(Similarity transformation)

유사변환(Similarity transformation) n×n 차원의 정방 행렬 A, B 그리고 가역 행렬 P 사이에 식 1의 관계가 성립하면 행렬 A와 B는 유사행렬(similarity matrix)이 되며 행렬 A를 가역행렬 P와 B로 분해하는 것을 유사 변환(similarity transformation) 이라고 합니다. $$\tag{1} A = PBP^{-1} \Leftrightarrow P^{-1}AP = B $$ 식 2는 식 1의 양변에 B의 고유값을 고려한 것입니다. \begin{align}\tag{식 2} B - \lambda I &= P^{-1}AP – \lambda P^{-1}P\\ &= P^{-1}(AP – \lambda P)\\ &= P^{-1}(A - \lambda I)P \end{align} 식 2의 행렬식은 식 3과 같이 정리됩니다. \begin{align} &\begin{aligned}\textsf{det}(B - \lambda I ) & = \textsf{det}(P^{-1}(AP – \lambda P))\\ &= \textsf{det}(P^{-1}) \textsf{det}((A – \lambda I)) \textsf{det}(P)\\ &= \textsf{det}(P^{-1}) \textsf{det}(P) \textsf{det}((A – \lambda I))\\ &= \textsf{det}(A – \lambda I)\end{aligned}\\ &\begin{aligned}\because \; \textsf{det}(P^{-1}) \textsf{det}(P) &= \textsf{det}(P^{-1}P)\\ &= \textsf{det}(I)\end{aligned}\end{align} 유사행렬의 특성 유사행렬인 두 정방행렬 A와 B는 'A ~ B' 와 같...

[sympy] Sympy객체의 표현을 위한 함수들

Sympy객체의 표현을 위한 함수들 General simplify(x): 식 x(sympy 객체)를 간단히 정리 합니다. import numpy as np from sympy import * x=symbols("x") a=sin(x)**2+cos(x)**2 a $\sin^{2}{\left(x \right)} + \cos^{2}{\left(x \right)}$ simplify(a) 1 simplify(b) $\frac{x^{3} + x^{2} - x - 1}{x^{2} + 2 x + 1}$ simplify(b) x - 1 c=gamma(x)/gamma(x-2) c $\frac{\Gamma\left(x\right)}{\Gamma\left(x - 2\right)}$ simplify(c) $\displaystyle \left(x - 2\right) \left(x - 1\right)$ 위의 예들 중 객체 c의 감마함수(gamma(x))는 확률분포 등 여러 부분에서 사용되는 표현식으로 다음과 같이 정의 됩니다. 감마함수는 음이 아닌 정수를 제외한 모든 수에서 정의됩니다. 식 1과 같이 자연수에서 감마함수는 factorial(!), 부동소수(양의 실수)인 경우 적분을 적용하여 계산합니다. $$\tag{식 1}\Gamma(n) =\begin{cases}(n-1)!& n:\text{자연수}\\\int^\infty_0x^{n-1}e^{-x}\,dx& n:\text{부동소수}\end{cases}$$ x=symbols('x') gamma(x).subs(x,4) $\displaystyle 6$ factorial 계산은 math.factorial() 함수를 사용할 수 있습니다. import math math.factorial(3) 6 a=gamma(x).subs(x,4.5) a.evalf(3) 11.6 simpilfy() 함수의 알고리즘은 식에서 공통사항을 찾아 정리하...

sympy.solvers로 방정식해 구하기

sympy.solvers로 방정식해 구하기 대수 방정식을 해를 계산하기 위해 다음 함수를 사용합니다. sympy.solvers.solve(f, *symbols, **flags) f=0, 즉 동차방정식에 대해 지정한 변수의 해를 계산 f : 식 또는 함수 symbols: 식의 해를 계산하기 위한 변수, 변수가 하나인 경우는 생략가능(자동으로 인식) flags: 계산 또는 결과의 방식을 지정하기 위한 인수들 dict=True: {x:3, y:1}같이 사전형식, 기본값 = False set=True :{(x,3),(y,1)}같이 집합형식, 기본값 = False ratioal=True : 실수를 유리수로 반환, 기본값 = False positive=True: 해들 중에 양수만을 반환, 기본값 = False 예 $x^2=1$의 해를 결정합니다. solve() 함수에 적용하기 위해서는 다음과 같이 식의 한쪽이 0이 되는 형태인 동차식으로 구성되어야 합니다. $$x^2-1=0$$ import numpy as np from sympy import * x = symbols('x') solve(x**2-1, x) [-1, 1] 위 식은 계산 과정은 다음과 같습니다. $$\begin{aligned}x^2-1=0 \rightarrow (x+1)(x-1)=0 \\ x=1 \; \text{or}\; -1\end{aligned}$$ 예 $x^4=1$의 해를 결정합니다. solve() 함수의 인수 set=True를 지정하였으므로 결과는 집합(set)형으로 반환됩니다. eq=x**4-1 solve(eq, set=True) ([x], {(-1,), (-I,), (1,), (I,)}) 위의 경우 I는 복소수입니다.즉 위 결과의 과정은 다음과 같습니다. $$x^4-1=(x^2+1)(x+1)(x-1)=0 \rightarrow x=\pm \sqrt{-1}, \; \pm 1=\pm i,\; \pm1$$ 실수...