기본 콘텐츠로 건너뛰기

[matplotlib]quiver()함수

Numpy array control

1차원 배열의 인덱스, 슬라이스, 그리고 반복 등은
리스트나 연속열(sequence)와 같은 방식으로 실행된다.
파이썬에서 숫자의 시작은 0부터 시작한다.


import numpy as np
np.set_printoptions(precision=3)
#랜덤 추출할 경우 한번 시행에서 나온 숫자는 고정되어야 할 필요가 있다.
#이 경우 사용되는 문이 .seed()이다.
np.random.seed(1)
a=np.random.randn(10)
a
array([ 1.624, -0.612, -0.528, -1.073,  0.865, -2.302,  1.745, -0.761,
       0.319, -0.249])


a[2]#0부터 시작하므로 3번째 값을 호출
-0.5281717522634557


연속적인 인덱스의 값을 호출할 경우 '시작인덱스:마지막 인덱스'를 사용한다.
0번째 부터 호출할 경우 시작인덱스는 생략된다. 예를들어 1: 6이면 1번째부터 5번째값을 호출하는 것이다.
즉, 마지막인덱스 값은 호출에서 제외된다.
x[a:b] == a≤x<b
a[:4]
array([ 1.624, -0.612, -0.528, -1.073])
#호출시 콜론(:)을 두번 사용하는 경우 즉 '시작:끝:조건'
a[:6:2]#0~6 번째의 값들을 중에서 각 2단계의 값 즉, 0, 2, 4 번쨰 값 호출
array([ 1.624, -0.528,  0.865])


a[:6:2]=0 #호출된 값을 0으로 치환
a
array([ 0.   , -0.612,  0.   , -1.073,  0.   , -2.302,  1.745, -0.761,
       0.319, -0.249])


a[::-1] #처음부터 끝까지 역순으로 반환
array([-0.249,  0.319, -0.761,  1.745, -2.302,  0.   , -1.073,  0.   ,
      -0.612,  0.   ])


a[:-1]#-1은 객체의 마지막을 의미하는 것으로서 마지막을 제외하고 모두 반환
array([ 0.   , -0.612,  0.   , -1.073,  0.   , -2.302,  1.745, -0.761,
       0.319])
다차원 베열의 경우는 행과 열을 모두 지정하여 값을 호출한다.
다차원 배열의 경우 객체.reshape(행, 열) 함수를 사용하여 다차원 행렬을 생성
다차원 배열에서의 호출은 [행,열]의 인덱스를 모두 사용한다.
두 인자 모두 전달해야 하며 ":" 또는 "..."는 all의 의미를 갖는다.
즉, x[:,1]은 두번째 열의 모든 행이라는 의미이다.


np.random.seed(3)
a=np.random.randn(5*4).reshape(5,4)
a
array([[ 1.789,  0.437,  0.096, -1.863],
      [-0.277, -0.355, -0.083, -0.627],
      [-0.044, -0.477, -1.314,  0.885],
      [ 0.881,  1.71 ,  0.05 , -0.405],
      [-0.545, -1.546,  0.982, -1.101]])


a[:,2]
array([ 0.096, -0.083, -1.314,  0.05 ,  0.982])


a[...,2]
array([ 0.096, -0.083, -1.314,  0.05 ,  0.982])


#반복문 for에서 인자명을 row, 또는 column으로 할 경우 모든 배열의 값을 반환 한다.
for row in a:
   print(row)
[ 1.789  0.437  0.096 -1.863]
[-0.277 -0.355 -0.083 -0.627]
[-0.044 -0.477 -1.314  0.885]
[ 0.881  1.71   0.05  -0.405]
[-0.545 -1.546  0.982 -1.101]
for column in a:
   print(column)
[ 1.789  0.437  0.096 -1.863]
[-0.277 -0.355 -0.083 -0.627]
[-0.044 -0.477 -1.314  0.885]
[ 0.881  1.71   0.05  -0.405]
[-0.545 -1.546  0.982 -1.101]
reshape(): 배열이 차원을 다시 설정할 경우 사용한다.
resize(): reshape()와 같다.
그러나 reshape()에ㅔ 의한 변화는 원객체는 변화시키지 않는 반면
resize()는 원객체를 변화시킨다. ravel(): 배열의 모든 원소를 행단위로 구분하여 1차원으로 재배열 시킴


a.shape #객체 a의 차원을 반환
(5, 4)


b=a.reshape(4,5) #차원을 변경한 새로운 객체를 생성.그러나 원객체는 변경되지않음
print(b)
[[ 1.789  0.437  0.096 -1.863 -0.277]
[-0.355 -0.083 -0.627 -0.044 -0.477]
[-1.314  0.885  0.881  1.71   0.05 ]
[-0.405 -0.545 -1.546  0.982 -1.101]]

print(a)
[[ 1.789  0.437  0.096 -1.863]
[-0.277 -0.355 -0.083 -0.627]
[-0.044 -0.477 -1.314  0.885]
[ 0.881  1.71   0.05  -0.405]
[-0.545 -1.546  0.982 -1.101]]
c=b.resize(5,4)#resize는 전달된 객체자체가 변경된다.
#이러한 함수의 경우 새로운 객체의 생성은 허가되지 않는다. 즉, 객체 c는 생성되지 않음
print(c)
None
print(b)
[[ 1.789  0.437  0.096 -1.863]
[-0.277 -0.355 -0.083 -0.627]
[-0.044 -0.477 -1.314  0.885]
[ 0.881  1.71   0.05  -0.405]
[-0.545 -1.546  0.982 -1.101]]
#reshape() 함수중 행,열의 인수중 하나에 -1을 전달하면 나머지 차원은 자동으로 생성
b=a.reshape(2,-1)
b
array([[ 1.789,  0.437,  0.096, -1.863, -0.277, -0.355, -0.083, -0.627,
       -0.044, -0.477],
      [-1.314,  0.885,  0.881,  1.71 ,  0.05 , -0.405, -0.545, -1.546,
        0.982, -1.101]])


a.ravel()#5*4 차원의 행렬로 된 배열을 1차원 배열로 재배치
array([ 1.789,  0.437,  0.096, -1.863, -0.277, -0.355, -0.083, -0.627,
      -0.044, -0.477, -1.314,  0.885,  0.881,  1.71 ,  0.05 , -0.405,
      -0.545, -1.546,  0.982, -1.101])


배열 결합

배열들을 결합시키위해 vstack(), hstack() 함수를 사용한다. np.vstack([객체1, 객체2]): 각 객체를 수직 결합
즉, 동일한 위치의 원소를 수직(열방향)으로 결합
np.hstack([객체1, 객체2]): 각 객체를 수평 결합
즉, 동일한 위치의 원소를 수평(행방향)으로 결합
보다 직관적으로 np.r[], np.c[]함수를 사용할 수 있다.
각각 열결합, 행결합을 반환한다.


a=np.random.randn(6).reshape(2,3)
b=np.random.randn(6).reshape(2,3)
print(a)
[[-1.623  0.647 -0.356]
[-1.743 -0.597 -0.589]]
print(b)
[[-0.874  0.03  -2.248]
[-0.268  1.013  0.853]]
print(np.vstack([a, b]))
[[-1.623  0.647 -0.356]
[-1.743 -0.597 -0.589]
[-0.874  0.03  -2.248]
[-0.268  1.013  0.853]]
print(np.hstack([a,b]))
[[-1.623  0.647 -0.356 -0.874  0.03  -2.248]
[-1.743 -0.597 -0.589 -0.268  1.013  0.853]]
print(np.r_[a,b])
[[-1.623  0.647 -0.356]
[-1.743 -0.597 -0.589]
[-0.874  0.03  -2.248]
[-0.268  1.013  0.853]]

print(np.c_[a,b])
[[-1.623  0.647 -0.356 -0.874  0.03  -2.248]
[-1.743 -0.597 -0.589 -0.268  1.013  0.853]]

배열 분리

np.hsplit(객체, n): 객체의 각 행을 n개로 수평분리한다. np.vsplit(객체, n): 객체의 각 열을 n개로 수직분리한다.


a=np.floor(np.random.random(4)*10)
a
array([ 0.,  2.,  9.,  2.])


print(np.hsplit(a, 2))
[array([ 0.,  2.]), array([ 9.,  2.])]
print(np.hsplit(a, (2,3)))#2부분으로 분리하고 나머지를 다시 2 부분으로 분리
[array([ 0.,  2.]), array([ 9.]), array([ 2.])]

얕은 복사

다음의 경우는 a, b의 두 객체 모두 1을 할당되었다. a=1
b=1
즉, 1의 값이 할당된 주소(객체)를 객체 a와 b가 모두 참조한다는 것을 의미한다.
다시말하면 객체 a와 b의 주소에 각각 1이 할당되는 것이 아니라
1이 할당된 주소 값을 a,b 객체에 할당하는 것이다. 이것을 얕은 복사라 한다.
copy 모듈의 copy()는 얕은 복사를 수행


a=1
b=1
print (id(1))
print (id(a))
print (id(b))
print(a is b)
1517009360
1517009360
1517009360
True


b=2 #객체 b에 다른 주소가 할당되었다. 그러므로 a와 b는 다른 객체를 참조한다.
print(id(2))
print (id(a))
print (id(b))
print(a is b)
1517009392
1517009360
1517009392
False
위의 경우는 한개의 값을 할당받은 객체를 참조하는 경우이다.
그러나 리스트의 경우 리스트 내의 하나의 원소가 수정되더라도
그 리스트가 점유하고 있는 객체는 같으므로 위와 같은 변경은 일어나지 않는다.


깊은복사

얕은 복사와는 다른 개념으로 깊은복사는 원 객체의 값들만을 복사하여 완전히 새로운 객체를 생성한다. 그러므로 원 객체와는 다른 주소에 할당된다.
DataFrame.copy(deep=True) 데이터프레임을 복사한다. 디폴트는 깊은 복사
깊은 복사는 원 객체와 복사된 객체는 다른 객체이다.  
df2=df.copy()
df2



op
hp
lp
cp
Volume
Date





2016-01-04
1954.47
1954.52
1918.76
1918.76
359018000
2016-01-05
1911.93
1937.57
1911.93
1930.53
446548000
2016-01-06
1934.25
1934.25
1911.61
1925.43
594612000
2016-01-07
1915.71
1926.41
1901.24
1904.33
393042000
2016-01-08
1889.42
1918.25
1883.82
1917.62
430204000


[id(df2), id(df)]
[1399891204024, 1399891106224]

댓글

이 블로그의 인기 게시물

[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$$ 실수...