Repository: fengdu78/Data-Science-Notes Branch: master Commit: ad7356537d9b Files: 186 Total size: 24.5 MB Directory structure: gitextract_d5cmywkc/ ├── 0.math/ │ ├── 0.basic/ │ │ ├── README.md │ │ └── markdown/ │ │ └── README.md │ ├── 1.CS229/ │ │ ├── README.md │ │ └── markdown/ │ │ ├── 1.CS229-LinearAlgebra.md │ │ ├── 2.CS229-Prob.md │ │ └── README.md │ └── README.md ├── 1.python-basic/ │ ├── Python-100/ │ │ ├── README.md │ │ ├── Status/ │ │ │ ├── Day 1.md │ │ │ ├── Day 2.md │ │ │ ├── Day 3.md │ │ │ ├── Day 4.md │ │ │ ├── Day 5.md │ │ │ ├── Day 6.md │ │ │ ├── Day 7.md │ │ │ ├── Day 8.md │ │ │ ├── Day 9.md │ │ │ ├── Day_10.md │ │ │ ├── Day_11.md │ │ │ ├── Day_12.md │ │ │ ├── Day_13.md │ │ │ ├── Day_14.md │ │ │ ├── Day_15.md │ │ │ ├── Day_16.md │ │ │ ├── Day_17.md │ │ │ ├── Day_18.md │ │ │ ├── Day_19.md │ │ │ ├── Day_20.md │ │ │ ├── Day_21.md │ │ │ ├── Day_22.md │ │ │ ├── Day_23.md │ │ │ └── Day_24.md │ │ └── notebooks/ │ │ ├── Day_01.ipynb │ │ ├── Day_02.ipynb │ │ ├── Day_03.ipynb │ │ ├── Day_04.ipynb │ │ ├── Day_05.ipynb │ │ ├── Day_06.ipynb │ │ ├── Day_07.ipynb │ │ ├── Day_08.ipynb │ │ ├── Day_09.ipynb │ │ ├── Day_10.ipynb │ │ ├── Day_11.ipynb │ │ ├── Day_12.ipynb │ │ ├── Day_13.ipynb │ │ ├── Day_14.ipynb │ │ ├── Day_15.ipynb │ │ ├── Day_16.ipynb │ │ ├── Day_17.ipynb │ │ ├── Day_18.ipynb │ │ ├── Day_19.ipynb │ │ ├── Day_20.ipynb │ │ ├── Day_21.ipynb │ │ ├── Day_22.ipynb │ │ ├── Day_23.ipynb │ │ └── Day_24.ipynb │ ├── Python_Basic.ipynb │ ├── a.txt │ ├── ly.txt │ ├── ly2.txt │ ├── test │ ├── 两天入门python-第一天.ipynb │ └── 两天入门python-第二天.ipynb ├── 2.numpy/ │ ├── 1.numpy-beginner.ipynb │ ├── 2.numpy.ipynb │ ├── README.md │ ├── numpy-100/ │ │ ├── 100_Numpy_exercises.ipynb │ │ ├── 100_Numpy_exercises_no_solution.ipynb │ │ ├── 100_Numpy_exercises_with_hint.ipynb │ │ └── README.md │ └── numpy_exercises/ │ ├── 10_Random_sampling.ipynb │ ├── 10_Random_sampling_Solutions.ipynb │ ├── 11_Set_routines.ipynb │ ├── 11_Set_routines_Solutions.ipynb │ ├── 12_Sorting_searching_and_counting.ipynb │ ├── 12_Sorting_searching_and_counting_Solutions.ipynb │ ├── 13_Statistics.ipynb │ ├── 13_Statistics_solutions.ipynb │ ├── 1_Array_creation_routines.ipynb │ ├── 1_Array_creation_routines_Solution.ipynb │ ├── 2_Array_manipulation_routines.ipynb │ ├── 2_Array_manipulation_routines_Solutions.ipynb │ ├── 3_String_operations.ipynb │ ├── 3_String_operations_solutions.ipynb │ ├── 4_Numpy-specific_help_functions.ipynb │ ├── 4_Numpy-specific_help_functions_Solutions.ipynb │ ├── 5_Input_and_Output.ipynb │ ├── 5_Input_and_Output_Solutions.ipynb │ ├── 6_Linear_algebra.ipynb │ ├── 6_Linear_algebra_Solutions.ipynb │ ├── 7_Discrete_Fourier_Transform.ipynb │ ├── 7_Discrete_Fourier_Transform_solutions.ipynb │ ├── 8_Logic_functions.ipynb │ ├── 8_Logic_functions_Solutions.ipynb │ ├── 9_Mathematical_functions.ipynb │ ├── 9_Mathematical_functions_solutions.ipynb │ └── README.md ├── 3.pandas/ │ ├── 1.10-Minutes-to-pandas/ │ │ ├── 10 Minutes to pandas.ipynb │ │ ├── README.md │ │ └── data/ │ │ ├── foo.csv │ │ ├── foo.h5 │ │ └── foo.xlsx │ ├── 2.Pandas_Exercises/ │ │ └── README.md │ ├── 3.pandas_beginner/ │ │ ├── README.md │ │ ├── pandas_beginner.ipynb │ │ └── student.csv │ ├── 4.Pandas50/ │ │ ├── Pandas50.ipynb │ │ └── README.md │ └── README.md ├── 4.scipy/ │ ├── 1.scipy-intro.ipynb │ ├── 10.scipy-spatial.ipynb │ ├── 2.scipy-optimize.ipynb │ ├── 3.scipy-linalg.ipynb │ ├── 4.scipy-stats.ipynb │ ├── 5.scipy-integrate.ipynb │ ├── 6.scipy-signal.ipynb │ ├── 7.scipy-interpolate.ipynb │ ├── 8.scipy-sparse.ipynb │ ├── 9.scipy-ndimage.ipynb │ └── README.md ├── 5.data-visualization/ │ ├── 1.matplotlib/ │ │ ├── examples/ │ │ │ └── spx.csv │ │ ├── matplotlib-beginner.ipynb │ │ ├── matplotlib50/ │ │ │ ├── Pokemon.csv │ │ │ └── matplotlib50.ipynb │ │ └── plot_distribution/ │ │ ├── README.md │ │ └── plot_distribution.ipynb │ ├── 2.seaborn/ │ │ ├── README.md │ │ └── Searborn.ipynb │ └── README.md ├── 6.scikit-learn/ │ ├── .gitignore │ ├── LICENSE │ ├── README.md │ ├── check_environment.py │ ├── data/ │ │ ├── README.md │ │ ├── adult_openml.csv │ │ └── titanic_openml.csv │ ├── environment.yml │ ├── notebook.ipynb │ └── solutions/ │ ├── 01_1_solutions.py │ ├── 01_2_solutions.py │ ├── 01_3_solutions.py │ ├── 01_4_solutions.py │ ├── 01_5_solutions.py │ ├── 01_solutions.py │ ├── 02_solutions.py │ ├── 03_solutions.py │ ├── 04_solutions.py │ ├── 05_1_solutions.py │ ├── 05_2_solutions.py │ ├── 05_3_solutions.py │ ├── 05_4_solutions.py │ ├── 05_5_solutions.py │ ├── 05_6_solutions.py │ ├── 05_7_solutions.py │ └── 05_solutions.py ├── 7.machine-learning/ │ └── README.md ├── 8.deep-learning/ │ ├── Deep-Learning-Papers-Reading-Roadmap/ │ │ └── README.md │ ├── PyTorch_beginner/ │ │ ├── 1.Tensors.ipynb │ │ ├── 2.Autograd自动求导.ipynb │ │ ├── 3.神经网络.ipynb │ │ ├── 4.训练一个分类器.ipynb │ │ └── README.md │ ├── README.md │ └── word2vec/ │ ├── README.md │ └── Visualizing_embeddings.ipynb ├── 9.feature-engineering/ │ ├── 1.引言.ipynb │ ├── 2.简单数字的奇特技巧.ipynb │ ├── 3.文本数据.ipynb │ ├── 4.特征缩放的效果:从词袋到_TF-IDF.ipynb │ ├── 5.类别特征.ipynb │ ├── 6.降维:用_PCA_压缩数据集.ipynb │ ├── 7.非线性特征提取和模型堆叠.ipynb │ ├── 8.自动化特征提取器:图像特征提取和深度学习.ipynb │ ├── 9.回到特征:将它们放到一起.ipynb │ ├── FeatureSelectorUsage/ │ │ ├── FeatureSelectorUsage.ipynb │ │ ├── README.md │ │ ├── data/ │ │ │ ├── AirQualityUCI.csv │ │ │ ├── caravan-insurance-challenge.csv │ │ │ └── credit_example.csv │ │ └── feature_selector/ │ │ ├── __init__.py │ │ └── feature_selector.py │ ├── README.md │ ├── data/ │ │ └── README.md │ ├── images/ │ │ └── Appendix/ │ │ └── pic │ └── 附录.线性模型和线性代数基础.ipynb └── README.md ================================================ FILE CONTENTS ================================================ ================================================ FILE: 0.math/0.basic/README.md ================================================ 大学数学基础知识 ------------------ 数据科学需要一定的数学基础,但仅仅做应用的话,如果时间不多,不用学太深,了解基本公式即可,遇到问题再查吧。 以下是以前考研考博时候的数学笔记,难度应该在本科3年级左右。 markdown文件夹是文件的markdown代码,内容与pdf一致,是为了方便研究者写论文或者文章使用。 ================================================ FILE: 0.math/0.basic/markdown/README.md ================================================ 数学基础知识 ------------------ [TOC] 数据科学需要一定的数学基础,但仅仅做应用的话,如果时间不多,不用学太深,了解基本公式即可,遇到问题再查吧。 以下是以前考研考博时候的数学笔记,难度应该在本科3年级左右。 ### 高等数学 **1.导数定义:** 导数和微分的概念 $f'({{x}_{0}})=\underset{\Delta x\to 0}{\mathop{\lim }}\,\frac{f({{x}_{0}}+\Delta x)-f({{x}_{0}})}{\Delta x}$ (1) 或者: $f'({{x}_{0}})=\underset{x\to {{x}_{0}}}{\mathop{\lim }}\,\frac{f(x)-f({{x}_{0}})}{x-{{x}_{0}}}$ (2) **2.左右导数导数的几何意义和物理意义** 函数$f(x)$在$x_0$处的左、右导数分别定义为: 左导数:${{{f}'}_{-}}({{x}_{0}})=\underset{\Delta x\to {{0}^{-}}}{\mathop{\lim }}\,\frac{f({{x}_{0}}+\Delta x)-f({{x}_{0}})}{\Delta x}=\underset{x\to x_{0}^{-}}{\mathop{\lim }}\,\frac{f(x)-f({{x}_{0}})}{x-{{x}_{0}}},(x={{x}_{0}}+\Delta x)$ 右导数:${{{f}'}_{+}}({{x}_{0}})=\underset{\Delta x\to {{0}^{+}}}{\mathop{\lim }}\,\frac{f({{x}_{0}}+\Delta x)-f({{x}_{0}})}{\Delta x}=\underset{x\to x_{0}^{+}}{\mathop{\lim }}\,\frac{f(x)-f({{x}_{0}})}{x-{{x}_{0}}}$ **3.函数的可导性与连续性之间的关系** **Th1:** 函数$f(x)$在$x_0$处可微$\Leftrightarrow f(x)$在$x_0$处可导 **Th2:** 若函数在点$x_0$处可导,则$y=f(x)$在点$x_0$处连续,反之则不成立。即函数连续不一定可导。 **Th3:** ${f}'({{x}_{0}})$存在$\Leftrightarrow {{{f}'}_{-}}({{x}_{0}})={{{f}'}_{+}}({{x}_{0}})$ **4.平面曲线的切线和法线** 切线方程 : $y-{{y}_{0}}=f'({{x}_{0}})(x-{{x}_{0}})$ 法线方程:$y-{{y}_{0}}=-\frac{1}{f'({{x}_{0}})}(x-{{x}_{0}}),f'({{x}_{0}})\ne 0$ **5.四则运算法则** 设函数$u=u(x),v=v(x)$]在点$x$可导则 (1) $(u\pm v{)}'={u}'\pm {v}'$ $d(u\pm v)=du\pm dv$ (2)$(uv{)}'=u{v}'+v{u}'$ $d(uv)=udv+vdu$ (3) $(\frac{u}{v}{)}'=\frac{v{u}'-u{v}'}{{{v}^{2}}}(v\ne 0)$ $d(\frac{u}{v})=\frac{vdu-udv}{{{v}^{2}}}$ **6.基本导数与微分表** (1) $y=c$(常数) ${y}'=0$ $dy=0$ (2) $y={{x}^{\alpha }}$($\alpha $为实数) ${y}'=\alpha {{x}^{\alpha -1}}$ $dy=\alpha {{x}^{\alpha -1}}dx$ (3) $y={{a}^{x}}$ ${y}'={{a}^{x}}\ln a$ $dy={{a}^{x}}\ln adx$ 特例: $({{{e}}^{x}}{)}'={{{e}}^{x}}$ $d({{{e}}^{x}})={{{e}}^{x}}dx$ (4) $y={{\log }_{a}}x$ ${y}'=\frac{1}{x\ln a}$ $dy=\frac{1}{x\ln a}dx$ 特例:$y=\ln x$ $(\ln x{)}'=\frac{1}{x}$ $d(\ln x)=\frac{1}{x}dx$ (5) $y=\sin x$ ${y}'=\cos x$ $d(\sin x)=\cos xdx$ (6) $y=\cos x$ ${y}'=-\sin x$ $d(\cos x)=-\sin xdx$ (7) $y=\tan x$ ${y}'=\frac{1}{{{\cos }^{2}}x}={{\sec }^{2}}x$ $d(\tan x)={{\sec }^{2}}xdx$ (8) $y=\cot x$ ${y}'=-\frac{1}{{{\sin }^{2}}x}=-{{\csc }^{2}}x$ $d(\cot x)=-{{\csc }^{2}}xdx$ (9) $y=\sec x$ ${y}'=\sec x\tan x$ $d(\sec x)=\sec x\tan xdx$ (10) $y=\csc x$ ${y}'=-\csc x\cot x$ $d(\csc x)=-\csc x\cot xdx$ (11) $y=\arcsin x$ ${y}'=\frac{1}{\sqrt{1-{{x}^{2}}}}$ $d(\arcsin x)=\frac{1}{\sqrt{1-{{x}^{2}}}}dx$ (12) $y=\arccos x$ ${y}'=-\frac{1}{\sqrt{1-{{x}^{2}}}}$ $d(\arccos x)=-\frac{1}{\sqrt{1-{{x}^{2}}}}dx$ (13) $y=\arctan x$ ${y}'=\frac{1}{1+{{x}^{2}}}$ $d(\arctan x)=\frac{1}{1+{{x}^{2}}}dx$ (14) $y=\operatorname{arc}\cot x$ ${y}'=-\frac{1}{1+{{x}^{2}}}$ $d(\operatorname{arc}\cot x)=-\frac{1}{1+{{x}^{2}}}dx$ (15) $y=shx$ ${y}'=chx$ $d(shx)=chxdx$ (16) $y=chx$ ${y}'=shx$ $d(chx)=shxdx$ **7.复合函数,反函数,隐函数以及参数方程所确定的函数的微分法** (1) 反函数的运算法则: 设$y=f(x)$在点$x$的某邻域内单调连续,在点$x$处可导且${f}'(x)\ne 0$,则其反函数在点$x$所对应的$y$处可导,并且有$\frac{dy}{dx}=\frac{1}{\frac{dx}{dy}}$ (2) 复合函数的运算法则:若$\mu =\varphi (x)$在点$x$可导,而$y=f(\mu )$在对应点$\mu $($\mu =\varphi (x)$)可导,则复合函数$y=f(\varphi (x))$在点$x$可导,且${y}'={f}'(\mu )\cdot {\varphi }'(x)$ (3) 隐函数导数$\frac{dy}{dx}$的求法一般有三种方法: 1)方程两边对$x$求导,要记住$y$是$x$的函数,则$y$的函数是$x$的复合函数.例如$\frac{1}{y}$,${{y}^{2}}$,$ln y$,${{{e}}^{y}}$等均是$x$的复合函数. 对$x$求导应按复合函数连锁法则做. 2)公式法.由$F(x,y)=0$知 $\frac{dy}{dx}=-\frac{{{{{F}'}}_{x}}(x,y)}{{{{{F}'}}_{y}}(x,y)}$,其中,${{{F}'}_{x}}(x,y)$, ${{{F}'}_{y}}(x,y)$分别表示$F(x,y)$对$x$和$y$的偏导数 3)利用微分形式不变性 **8.常用高阶导数公式** (1)$({{a}^{x}}){{\,}^{(n)}}={{a}^{x}}{{\ln }^{n}}a\quad (a>{0})\quad \quad ({{{e}}^{x}}){{\,}^{(n)}}={e}{{\,}^{x}}$ (2)$(\sin kx{)}{{\,}^{(n)}}={{k}^{n}}\sin (kx+n\cdot \frac{\pi }{{2}})$ (3)$(\cos kx{)}{{\,}^{(n)}}={{k}^{n}}\cos (kx+n\cdot \frac{\pi }{{2}})$ (4)$({{x}^{m}}){{\,}^{(n)}}=m(m-1)\cdots (m-n+1){{x}^{m-n}}$ (5)$(\ln x){{\,}^{(n)}}={{(-{1})}^{(n-{1})}}\frac{(n-{1})!}{{{x}^{n}}}$ (6)莱布尼兹公式:若$u(x)\,,v(x)$均$n$阶可导,则 ${{(uv)}^{(n)}}=\sum\limits_{i={0}}^{n}{c_{n}^{i}{{u}^{(i)}}{{v}^{(n-i)}}}$,其中${{u}^{({0})}}=u$,${{v}^{({0})}}=v$ **9.微分中值定理,泰勒公式** **Th1:**(费马定理) 若函数$f(x)$满足条件: (1)函数$f(x)$在${{x}_{0}}$的某邻域内有定义,并且在此邻域内恒有 $f(x)\le f({{x}_{0}})$或$f(x)\ge f({{x}_{0}})$, (2) $f(x)$在${{x}_{0}}$处可导,则有 ${f}'({{x}_{0}})=0$ **Th2:**(罗尔定理) 设函数$f(x)$满足条件: (1)在闭区间$[a,b]$上连续; (2)在$(a,b)$内可导; (3)$f(a)=f(b)$; 则在$(a,b)$内一存在个$\xi $,使 ${f}'(\xi )=0$ **Th3:** (拉格朗日中值定理) 设函数$f(x)$满足条件: (1)在$[a,b]$上连续; (2)在$(a,b)$内可导; 则在$(a,b)$内一存在个$\xi $,使 $\frac{f(b)-f(a)}{b-a}={f}'(\xi )$ **Th4:** (柯西中值定理) 设函数$f(x)$,$g(x)$满足条件: (1) 在$[a,b]$上连续; (2) 在$(a,b)$内可导且${f}'(x)$,${g}'(x)$均存在,且${g}'(x)\ne 0$ 则在$(a,b)$内存在一个$\xi $,使 $\frac{f(b)-f(a)}{g(b)-g(a)}=\frac{{f}'(\xi )}{{g}'(\xi )}$ **10.洛必达法则** 法则Ⅰ ($\frac{0}{0}$型) 设函数$f\left( x \right),g\left( x \right)$满足条件: $\underset{x\to {{x}_{0}}}{\mathop{\lim }}\,f\left( x \right)=0,\underset{x\to {{x}_{0}}}{\mathop{\lim }}\,g\left( x \right)=0$; $f\left( x \right),g\left( x \right)$在${{x}_{0}}$的邻域内可导,(在${{x}_{0}}$处可除外)且${g}'\left( x \right)\ne 0$; $\underset{x\to {{x}_{0}}}{\mathop{\lim }}\,\frac{{f}'\left( x \right)}{{g}'\left( x \right)}$存在(或$\infty $)。 则: $\underset{x\to {{x}_{0}}}{\mathop{\lim }}\,\frac{f\left( x \right)}{g\left( x \right)}=\underset{x\to {{x}_{0}}}{\mathop{\lim }}\,\frac{{f}'\left( x \right)}{{g}'\left( x \right)}$。 法则${{I}'}$ ($\frac{0}{0}$型)设函数$f\left( x \right),g\left( x \right)$满足条件: $\underset{x\to \infty }{\mathop{\lim }}\,f\left( x \right)=0,\underset{x\to \infty }{\mathop{\lim }}\,g\left( x \right)=0$; 存在一个$X>0$,当$\left| x \right|>X$时,$f\left( x \right),g\left( x \right)$可导,且${g}'\left( x \right)\ne 0$;$\underset{x\to {{x}_{0}}}{\mathop{\lim }}\,\frac{{f}'\left( x \right)}{{g}'\left( x \right)}$存在(或$\infty $)。 则: $\underset{x\to {{x}_{0}}}{\mathop{\lim }}\,\frac{f\left( x \right)}{g\left( x \right)}=\underset{x\to {{x}_{0}}}{\mathop{\lim }}\,\frac{{f}'\left( x \right)}{{g}'\left( x \right)}$ 法则Ⅱ($\frac{\infty }{\infty }$型) 设函数$f\left( x \right),g\left( x \right)$满足条件: $\underset{x\to {{x}_{0}}}{\mathop{\lim }}\,f\left( x \right)=\infty ,\underset{x\to {{x}_{0}}}{\mathop{\lim }}\,g\left( x \right)=\infty $; $f\left( x \right),g\left( x \right)$在${{x}_{0}}$ 的邻域内可导(在${{x}_{0}}$处可除外)且${g}'\left( x \right)\ne 0$;$\underset{x\to {{x}_{0}}}{\mathop{\lim }}\,\frac{{f}'\left( x \right)}{{g}'\left( x \right)}$存在(或$\infty $)。则 $\underset{x\to {{x}_{0}}}{\mathop{\lim }}\,\frac{f\left( x \right)}{g\left( x \right)}=\underset{x\to {{x}_{0}}}{\mathop{\lim }}\,\frac{{f}'\left( x \right)}{{g}'\left( x \right)}.$同理法则${I{I}'}$($\frac{\infty }{\infty }$型)仿法则${{I}'}$可写出。 **11.泰勒公式** 设函数$f(x)$在点${{x}_{0}}$处的某邻域内具有$n+1$阶导数,则对该邻域内异于${{x}_{0}}$的任意点$x$,在${{x}_{0}}$与$x$之间至少存在 一个$\xi $,使得: $f(x)=f({{x}_{0}})+{f}'({{x}_{0}})(x-{{x}_{0}})+\frac{1}{2!}{f}''({{x}_{0}}){{(x-{{x}_{0}})}^{2}}+\cdots $ $+\frac{{{f}^{(n)}}({{x}_{0}})}{n!}{{(x-{{x}_{0}})}^{n}}+{{R}_{n}}(x)$ 其中 ${{R}_{n}}(x)=\frac{{{f}^{(n+1)}}(\xi )}{(n+1)!}{{(x-{{x}_{0}})}^{n+1}}$称为$f(x)$在点${{x}_{0}}$处的$n$阶泰勒余项。 令${{x}_{0}}=0$,则$n$阶泰勒公式 $f(x)=f(0)+{f}'(0)x+\frac{1}{2!}{f}''(0){{x}^{2}}+\cdots +\frac{{{f}^{(n)}}(0)}{n!}{{x}^{n}}+{{R}_{n}}(x)$……(1) 其中 ${{R}_{n}}(x)=\frac{{{f}^{(n+1)}}(\xi )}{(n+1)!}{{x}^{n+1}}$,$\xi $在0与$x$之间.(1)式称为麦克劳林公式 **常用五种函数在${{x}_{0}}=0$处的泰勒公式** (1) ${{{e}}^{x}}=1+x+\frac{1}{2!}{{x}^{2}}+\cdots +\frac{1}{n!}{{x}^{n}}+\frac{{{x}^{n+1}}}{(n+1)!}{{e}^{\xi }}$ 或 $=1+x+\frac{1}{2!}{{x}^{2}}+\cdots +\frac{1}{n!}{{x}^{n}}+o({{x}^{n}})$ (2) $\sin x=x-\frac{1}{3!}{{x}^{3}}+\cdots +\frac{{{x}^{n}}}{n!}\sin \frac{n\pi }{2}+\frac{{{x}^{n+1}}}{(n+1)!}\sin (\xi +\frac{n+1}{2}\pi )$ 或 $=x-\frac{1}{3!}{{x}^{3}}+\cdots +\frac{{{x}^{n}}}{n!}\sin \frac{n\pi }{2}+o({{x}^{n}})$ (3) $\cos x=1-\frac{1}{2!}{{x}^{2}}+\cdots +\frac{{{x}^{n}}}{n!}\cos \frac{n\pi }{2}+\frac{{{x}^{n+1}}}{(n+1)!}\cos (\xi +\frac{n+1}{2}\pi )$ 或 $=1-\frac{1}{2!}{{x}^{2}}+\cdots +\frac{{{x}^{n}}}{n!}\cos \frac{n\pi }{2}+o({{x}^{n}})$ (4) $\ln (1+x)=x-\frac{1}{2}{{x}^{2}}+\frac{1}{3}{{x}^{3}}-\cdots +{{(-1)}^{n-1}}\frac{{{x}^{n}}}{n}+\frac{{{(-1)}^{n}}{{x}^{n+1}}}{(n+1){{(1+\xi )}^{n+1}}}$ 或 $=x-\frac{1}{2}{{x}^{2}}+\frac{1}{3}{{x}^{3}}-\cdots +{{(-1)}^{n-1}}\frac{{{x}^{n}}}{n}+o({{x}^{n}})$ (5) ${{(1+x)}^{m}}=1+mx+\frac{m(m-1)}{2!}{{x}^{2}}+\cdots +\frac{m(m-1)\cdots (m-n+1)}{n!}{{x}^{n}}$ $+\frac{m(m-1)\cdots (m-n+1)}{(n+1)!}{{x}^{n+1}}{{(1+\xi )}^{m-n-1}}$ 或 ${{(1+x)}^{m}}=1+mx+\frac{m(m-1)}{2!}{{x}^{2}}+\cdots $ $+\frac{m(m-1)\cdots (m-n+1)}{n!}{{x}^{n}}+o({{x}^{n}})$ **12.函数单调性的判断** **Th1:** 设函数$f(x)$在$(a,b)$区间内可导,如果对$\forall x\in (a,b)$,都有$f\,'(x)>0$(或$f\,'(x)<0$),则函数$f(x)$在$(a,b)$内是单调增加的(或单调减少) **Th2:** (取极值的必要条件)设函数$f(x)$在${{x}_{0}}$处可导,且在${{x}_{0}}$处取极值,则$f\,'({{x}_{0}})=0$。 **Th3:** (取极值的第一充分条件)设函数$f(x)$在${{x}_{0}}$的某一邻域内可微,且$f\,'({{x}_{0}})=0$(或$f(x)$在${{x}_{0}}$处连续,但$f\,'({{x}_{0}})$不存在。) (1)若当$x$经过${{x}_{0}}$时,$f\,'(x)$由“+”变“-”,则$f({{x}_{0}})$为极大值; (2)若当$x$经过${{x}_{0}}$时,$f\,'(x)$由“-”变“+”,则$f({{x}_{0}})$为极小值; (3)若$f\,'(x)$经过$x={{x}_{0}}$的两侧不变号,则$f({{x}_{0}})$不是极值。 **Th4:** (取极值的第二充分条件)设$f(x)$在点${{x}_{0}}$处有$f''(x)\ne 0$,且$f\,'({{x}_{0}})=0$,则 当$f'\,'({{x}_{0}})<0$时,$f({{x}_{0}})$为极大值; 当$f'\,'({{x}_{0}})>0$时,$f({{x}_{0}})$为极小值。 注:如果$f'\,'({{x}_{0}})<0$,此方法失效。 **13.渐近线的求法** (1)水平渐近线 若$\underset{x\to +\infty }{\mathop{\lim }}\,f(x)=b$,或$\underset{x\to -\infty }{\mathop{\lim }}\,f(x)=b$,则 $y=b$称为函数$y=f(x)$的水平渐近线。 (2)铅直渐近线 若$\underset{x\to x_{0}^{-}}{\mathop{\lim }}\,f(x)=\infty $,或$\underset{x\to x_{0}^{+}}{\mathop{\lim }}\,f(x)=\infty $,则 $x={{x}_{0}}$称为$y=f(x)$的铅直渐近线。 (3)斜渐近线 若$a=\underset{x\to \infty }{\mathop{\lim }}\,\frac{f(x)}{x},\quad b=\underset{x\to \infty }{\mathop{\lim }}\,[f(x)-ax]$,则 $y=ax+b$称为$y=f(x)$的斜渐近线。 **14.函数凹凸性的判断** **Th1:** (凹凸性的判别定理)若在I上$f''(x)<0$(或$f''(x)>0$),则$f(x)$在I上是凸的(或凹的)。 **Th2:** (拐点的判别定理1)若在${{x}_{0}}$处$f''(x)=0$,(或$f''(x)$不存在),当$x$变动经过${{x}_{0}}$时,$f''(x)$变号,则$({{x}_{0}},f({{x}_{0}}))$为拐点。 **Th3:** (拐点的判别定理2)设$f(x)$在${{x}_{0}}$点的某邻域内有三阶导数,且$f''(x)=0$,$f'''(x)\ne 0$,则$({{x}_{0}},f({{x}_{0}}))$为拐点。 **15.弧微分** $dS=\sqrt{1+y{{'}^{2}}}dx$ **16.曲率** 曲线$y=f(x)$在点$(x,y)$处的曲率$k=\frac{\left| y'' \right|}{{{(1+y{{'}^{2}})}^{\tfrac{3}{2}}}}$。 对于参数方程$\left\{ \begin{align} & x=\varphi (t) \\ & y=\psi (t) \\ \end{align} \right.,$$k=\frac{\left| \varphi '(t)\psi ''(t)-\varphi ''(t)\psi '(t) \right|}{{{[\varphi {{'}^{2}}(t)+\psi {{'}^{2}}(t)]}^{\tfrac{3}{2}}}}$。 **17.曲率半径** 曲线在点$M$处的曲率$k(k\ne 0)$与曲线在点$M$处的曲率半径$\rho $有如下关系:$\rho =\frac{1}{k}$。 ### 线性代数 #### 行列式 **1.行列式按行(列)展开定理** (1) 设$A = ( a_{{ij}} )_{n \times n}$,则:$a_{i1}A_{j1} +a_{i2}A_{j2} + \cdots + a_{{in}}A_{{jn}} = \begin{cases}|A|,i=j\\ 0,i \neq j\end{cases}$ 或$a_{1i}A_{1j} + a_{2i}A_{2j} + \cdots + a_{{ni}}A_{{nj}} = \begin{cases}|A|,i=j\\ 0,i \neq j\end{cases}$即 $AA^{*} = A^{*}A = \left| A \right|E,$其中:$A^{*} = \begin{pmatrix} A_{11} & A_{12} & \ldots & A_{1n} \\ A_{21} & A_{22} & \ldots & A_{2n} \\ \ldots & \ldots & \ldots & \ldots \\ A_{n1} & A_{n2} & \ldots & A_{{nn}} \\ \end{pmatrix} = (A_{{ji}}) = {(A_{{ij}})}^{T}$ $D_{n} = \begin{vmatrix} 1 & 1 & \ldots & 1 \\ x_{1} & x_{2} & \ldots & x_{n} \\ \ldots & \ldots & \ldots & \ldots \\ x_{1}^{n - 1} & x_{2}^{n - 1} & \ldots & x_{n}^{n - 1} \\ \end{vmatrix} = \prod_{1 \leq j < i \leq n}^{}\,(x_{i} - x_{j})$ (2) 设$A,B$为$n$阶方阵,则$\left| {AB} \right| = \left| A \right|\left| B \right| = \left| B \right|\left| A \right| = \left| {BA} \right|$,但$\left| A \pm B \right| = \left| A \right| \pm \left| B \right|$不一定成立。 (3) $\left| {kA} \right| = k^{n}\left| A \right|$,$A$为$n$阶方阵。 (4) 设$A$为$n$阶方阵,$|A^{T}| = |A|;|A^{- 1}| = |A|^{- 1}$(若$A$可逆),$|A^{*}| = |A|^{n - 1}$ $n \geq 2$ (5) $\left| \begin{matrix} & {A\quad O} \\ & {O\quad B} \\ \end{matrix} \right| = \left| \begin{matrix} & {A\quad C} \\ & {O\quad B} \\ \end{matrix} \right| = \left| \begin{matrix} & {A\quad O} \\ & {C\quad B} \\ \end{matrix} \right| =| A||B|$ ,$A,B$为方阵,但$\left| \begin{matrix} {O} & A_{m \times m} \\ B_{n \times n} & { O} \\ \end{matrix} \right| = ({- 1)}^{{mn}}|A||B|$ 。 (6) 范德蒙行列式$D_{n} = \begin{vmatrix} 1 & 1 & \ldots & 1 \\ x_{1} & x_{2} & \ldots & x_{n} \\ \ldots & \ldots & \ldots & \ldots \\ x_{1}^{n - 1} & x_{2}^{n 1} & \ldots & x_{n}^{n - 1} \\ \end{vmatrix} = \prod_{1 \leq j < i \leq n}^{}\,(x_{i} - x_{j})$ 设$A$是$n$阶方阵,$\lambda_{i}(i = 1,2\cdots,n)$是$A$的$n$个特征值,则 $|A| = \prod_{i = 1}^{n}\lambda_{i}$ #### 矩阵 矩阵:$m \times n$个数$a_{{ij}}$排成$m$行$n$列的表格$\begin{bmatrix} a_{11}\quad a_{12}\quad\cdots\quad a_{1n} \\ a_{21}\quad a_{22}\quad\cdots\quad a_{2n} \\ \quad\cdots\cdots\cdots\cdots\cdots \\ a_{m1}\quad a_{m2}\quad\cdots\quad a_{{mn}} \\ \end{bmatrix}$ 称为矩阵,简记为$A$,或者$\left( a_{{ij}} \right)_{m \times n}$ 。若$m = n$,则称$A$是$n$阶矩阵或$n$阶方阵。 **矩阵的线性运算** **1.矩阵的加法** 设$A = (a_{{ij}}),B = (b_{{ij}})$是两个$m \times n$矩阵,则$m \times n$ 矩阵$C = c_{{ij}}) = a_{{ij}} + b_{{ij}}$称为矩阵$A$与$B$的和,记为$A + B = C$ 。 **2.矩阵的数乘** 设$A = (a_{{ij}})$是$m \times n$矩阵,$k$是一个常数,则$m \times n$矩阵$(ka_{{ij}})$称为数$k$与矩阵$A$的数乘,记为${kA}$。 **3.矩阵的乘法** 设$A = (a_{{ij}})$是$m \times n$矩阵,$B = (b_{{ij}})$是$n \times s$矩阵,那么$m \times s$矩阵$C = (c_{{ij}})$,其中$c_{{ij}} = a_{i1}b_{1j} + a_{i2}b_{2j} + \cdots + a_{{in}}b_{{nj}} = \sum_{k =1}^{n}{a_{{ik}}b_{{kj}}}$称为${AB}$的乘积,记为$C = AB$ 。 **4.** $\mathbf{A}^{\mathbf{T}}$**、**$\mathbf{A}^{\mathbf{-1}}$**、**$\mathbf{A}^{\mathbf{*}}$**三者之间的关系** (1) ${(A^{T})}^{T} = A,{(AB)}^{T} = B^{T}A^{T},{(kA)}^{T} = kA^{T},{(A \pm B)}^{T} = A^{T} \pm B^{T}$ (2) $\left( A^{- 1} \right)^{- 1} = A,\left( {AB} \right)^{- 1} = B^{- 1}A^{- 1},\left( {kA} \right)^{- 1} = \frac{1}{k}A^{- 1},$ 但 ${(A \pm B)}^{- 1} = A^{- 1} \pm B^{- 1}$不一定成立。 (3) $\left( A^{*} \right)^{*} = |A|^{n - 2}\ A\ \ (n \geq 3)$,$\left({AB} \right)^{*} = B^{*}A^{*},$ $\left( {kA} \right)^{*} = k^{n -1}A^{*}{\ \ }\left( n \geq 2 \right)$ 但$\left( A \pm B \right)^{*} = A^{*} \pm B^{*}$不一定成立。 (4) ${(A^{- 1})}^{T} = {(A^{T})}^{- 1},\ \left( A^{- 1} \right)^{*} ={(AA^{*})}^{- 1},{(A^{*})}^{T} = \left( A^{T} \right)^{*}$ **5.有关**$\mathbf{A}^{\mathbf{*}}$**的结论** (1) $AA^{*} = A^{*}A = |A|E$ (2) $|A^{*}| = |A|^{n - 1}\ (n \geq 2),\ \ \ \ {(kA)}^{*} = k^{n -1}A^{*},{{\ \ }\left( A^{*} \right)}^{*} = |A|^{n - 2}A(n \geq 3)$ (3) 若$A$可逆,则$A^{*} = |A|A^{- 1},{(A^{*})}^{*} = \frac{1}{|A|}A$ (4) 若$A$为$n$阶方阵,则: $r(A^*)=\begin{cases}n,\quad r(A)=n\\ 1,\quad r(A)=n-1\\ 0,\quad r(A) 0),A^{T},A^{- 1},A^{*}$正定;$|A| >0$,$A$可逆;$a_{{ii}} > 0$,且$|A_{{ii}}| > 0$ $A$,$B$正定$\Rightarrow A +B$正定,但${AB}$,${BA}$不一定正定 $A$正定$\Leftrightarrow f(x) = x^{T}{Ax} > 0,\forall x \neq 0$ $\Leftrightarrow A$的各阶顺序主子式全大于零 $\Leftrightarrow A$的所有特征值大于零 $\Leftrightarrow A$的正惯性指数为$n$ $\Leftrightarrow$存在可逆阵$P$使$A = P^{T}P$ $\Leftrightarrow$存在正交矩阵$Q$,使$Q^{T}{AQ} = Q^{- 1}{AQ} =\begin{pmatrix} \lambda_{1} & & \\ \begin{matrix} & \\ & \\ \end{matrix} &\ddots & \\ & & \lambda_{n} \\ \end{pmatrix},$ 其中$\lambda_{i} > 0,i = 1,2,\cdots,n.$正定$\Rightarrow {kA}(k >0),A^{T},A^{- 1},A^{*}$正定; $|A| > 0,A$可逆;$a_{{ii}} >0$,且$|A_{{ii}}| > 0$ 。 ### 概率论和数理统计 #### 随机事件和概率 **1.事件的关系与运算** (1) 子事件:$A \subset B$,若$A$发生,则$B$发生。 (2) 相等事件:$A = B$,即$A \subset B$,且$B \subset A$ 。 (3) 和事件:$A\bigcup B$(或$A + B$),$A$与$B$中至少有一个发生。 (4) 差事件:$A - B$,$A$发生但$B$不发生。 (5) 积事件:$A\bigcap B$(或${AB}$),$A$与$B$同时发生。 (6) 互斥事件(互不相容):$A\bigcap B$=$\varnothing$。 (7) 互逆事件(对立事件): $A\bigcap B=\varnothing ,A\bigcup B=\Omega ,A=\bar{B},B=\bar{A}$ **2.运算律** (1) 交换律:$A\bigcup B=B\bigcup A,A\bigcap B=B\bigcap A$ (2) 结合律:$(A\bigcup B)\bigcup C=A\bigcup (B\bigcup C)$ (3) 分配律:$(A\bigcap B)\bigcap C=A\bigcap (B\bigcap C)$ **3.德$\centerdot $摩根律** $\overline{A\bigcup B}=\bar{A}\bigcap \bar{B}$ $\overline{A\bigcap B}=\bar{A}\bigcup \bar{B}$ **4.完全事件组** ${{A}_{1}}{{A}_{2}}\cdots {{A}_{n}}$两两互斥,且和事件为必然事件,即${{A}_{i}}\bigcap {{A}_{j}}=\varnothing, i\ne j ,\underset{i=1}{\overset{n}{\mathop \bigcup }}\,=\Omega $ **5.概率的基本公式** (1)条件概率: $P(B|A)=\frac{P(AB)}{P(A)}$,表示$A$发生的条件下,$B$发生的概率。 (2)全概率公式: $P(A)=\sum\limits_{i=1}^{n}{P(A|{{B}_{i}})P({{B}_{i}}),{{B}_{i}}{{B}_{j}}}=\varnothing ,i\ne j,\underset{i=1}{\overset{n}{\mathop{\bigcup }}}\,{{B}_{i}}=\Omega $ (3) Bayes公式: $P({{B}_{j}}|A)=\frac{P(A|{{B}_{j}})P({{B}_{j}})}{\sum\limits_{i=1}^{n}{P(A|{{B}_{i}})P({{B}_{i}})}},j=1,2,\cdots ,n$ 注:上述公式中事件${{B}_{i}}$的个数可为可列个。 (4)乘法公式: $P({{A}_{1}}{{A}_{2}})=P({{A}_{1}})P({{A}_{2}}|{{A}_{1}})=P({{A}_{2}})P({{A}_{1}}|{{A}_{2}})$ $P({{A}_{1}}{{A}_{2}}\cdots {{A}_{n}})=P({{A}_{1}})P({{A}_{2}}|{{A}_{1}})P({{A}_{3}}|{{A}_{1}}{{A}_{2}})\cdots P({{A}_{n}}|{{A}_{1}}{{A}_{2}}\cdots {{A}_{n-1}})$ **6.事件的独立性** (1)$A$与$B$相互独立$\Leftrightarrow P(AB)=P(A)P(B)$ (2)$A$,$B$,$C$两两独立 $\Leftrightarrow P(AB)=P(A)P(B)$;$P(BC)=P(B)P(C)$ ;$P(AC)=P(A)P(C)$; (3)$A$,$B$,$C$相互独立 $\Leftrightarrow P(AB)=P(A)P(B)$; $P(BC)=P(B)P(C)$ ; $P(AC)=P(A)P(C)$ ; $P(ABC)=P(A)P(B)P(C)$ **7.独立重复试验** 将某试验独立重复$n$次,若每次实验中事件A发生的概率为$p$,则$n$次试验中$A$发生$k$次的概率为: $P(X=k)=C_{n}^{k}{{p}^{k}}{{(1-p)}^{n-k}}$ **8.重要公式与结论** $(1)P(\bar{A})=1-P(A)$ $(2)P(A\bigcup B)=P(A)+P(B)-P(AB)$ $P(A\bigcup B\bigcup C)=P(A)+P(B)+P(C)-P(AB)-P(BC)-P(AC)+P(ABC)$ $(3)P(A-B)=P(A)-P(AB)$ $(4)P(A\bar{B})=P(A)-P(AB),P(A)=P(AB)+P(A\bar{B}),$ $P(A\bigcup B)=P(A)+P(\bar{A}B)=P(AB)+P(A\bar{B})+P(\bar{A}B)$ (5)条件概率$P(\centerdot |B)$满足概率的所有性质, 例如:. $P({{\bar{A}}_{1}}|B)=1-P({{A}_{1}}|B)$ $P({{A}_{1}}\bigcup {{A}_{2}}|B)=P({{A}_{1}}|B)+P({{A}_{2}}|B)-P({{A}_{1}}{{A}_{2}}|B)$ $P({{A}_{1}}{{A}_{2}}|B)=P({{A}_{1}}|B)P({{A}_{2}}|{{A}_{1}}B)$ (6)若${{A}_{1}},{{A}_{2}},\cdots ,{{A}_{n}}$相互独立,则$P(\bigcap\limits_{i=1}^{n}{{{A}_{i}}})=\prod\limits_{i=1}^{n}{P({{A}_{i}})},$ $P(\bigcup\limits_{i=1}^{n}{{{A}_{i}}})=\prod\limits_{i=1}^{n}{(1-P({{A}_{i}}))}$ (7)互斥、互逆与独立性之间的关系: $A$与$B$互逆$\Rightarrow$ $A$与$B$互斥,但反之不成立,$A$与$B$互斥(或互逆)且均非零概率事件$\Rightarrow $$A$与$B$不独立. (8)若${{A}_{1}},{{A}_{2}},\cdots ,{{A}_{m}},{{B}_{1}},{{B}_{2}},\cdots ,{{B}_{n}}$相互独立,则$f({{A}_{1}},{{A}_{2}},\cdots ,{{A}_{m}})$与$g({{B}_{1}},{{B}_{2}},\cdots ,{{B}_{n}})$也相互独立,其中$f(\centerdot ),g(\centerdot )$分别表示对相应事件做任意事件运算后所得的事件,另外,概率为1(或0)的事件与任何事件相互独立. #### 随机变量及其概率分布 **1.随机变量及概率分布** 取值带有随机性的变量,严格地说是定义在样本空间上,取值于实数的函数称为随机变量,概率分布通常指分布函数或分布律 **2.分布函数的概念与性质** 定义: $F(x) = P(X \leq x), - \infty < x < + \infty$ 性质:(1)$0 \leq F(x) \leq 1$ (2) $F(x)$单调不减 (3) 右连续$F(x + 0) = F(x)$ (4) $F( - \infty) = 0,F( + \infty) = 1$ **3.离散型随机变量的概率分布** $P(X = x_{i}) = p_{i},i = 1,2,\cdots,n,\cdots\quad\quad p_{i} \geq 0,\sum_{i =1}^{\infty}p_{i} = 1$ **4.连续型随机变量的概率密度** 概率密度$f(x)$;非负可积,且: (1)$f(x) \geq 0,$ (2)$\int_{- \infty}^{+\infty}{f(x){dx} = 1}$ (3)$x$为$f(x)$的连续点,则: $f(x) = F'(x)$分布函数$F(x) = \int_{- \infty}^{x}{f(t){dt}}$ **5.常见分布** (1) 0-1分布:$P(X = k) = p^{k}{(1 - p)}^{1 - k},k = 0,1$ (2) 二项分布:$B(n,p)$: $P(X = k) = C_{n}^{k}p^{k}{(1 - p)}^{n - k},k =0,1,\cdots,n$ (3) **Poisson**分布:$p(\lambda)$: $P(X = k) = \frac{\lambda^{k}}{k!}e^{-\lambda},\lambda > 0,k = 0,1,2\cdots$ (4) 均匀分布$U(a,b)$:$f(x) = \{ \begin{matrix} & \frac{1}{b - a},a < x< b \\ & 0, \\ \end{matrix} $ (5) 正态分布:$N(\mu,\sigma^{2}):$ $\varphi(x) =\frac{1}{\sqrt{2\pi}\sigma}e^{- \frac{{(x - \mu)}^{2}}{2\sigma^{2}}},\sigma > 0,\infty < x < + \infty$ (6)指数分布:$E(\lambda):f(x) =\{ \begin{matrix} & \lambda e^{-{λx}},x > 0,\lambda > 0 \\ & 0, \\ \end{matrix} $ (7)几何分布:$G(p):P(X = k) = {(1 - p)}^{k - 1}p,0 < p < 1,k = 1,2,\cdots.$ (8)超几何分布: $H(N,M,n):P(X = k) = \frac{C_{M}^{k}C_{N - M}^{n -k}}{C_{N}^{n}},k =0,1,\cdots,min(n,M)$ **6.随机变量函数的概率分布** (1)离散型:$P(X = x_{1}) = p_{i},Y = g(X)$ 则: $P(Y = y_{j}) = \sum_{g(x_{i}) = y_{i}}^{}{P(X = x_{i})}$ (2)连续型:$X\tilde{\ }f_{X}(x),Y = g(x)$ 则:$F_{y}(y) = P(Y \leq y) = P(g(X) \leq y) = \int_{g(x) \leq y}^{}{f_{x}(x)dx}$, $f_{Y}(y) = F'_{Y}(y)$ **7.重要公式与结论** (1) $X\sim N(0,1) \Rightarrow \varphi(0) = \frac{1}{\sqrt{2\pi}},\Phi(0) =\frac{1}{2},$ $\Phi( - a) = P(X \leq - a) = 1 - \Phi(a)$ (2) $X\sim N\left( \mu,\sigma^{2} \right) \Rightarrow \frac{X -\mu}{\sigma}\sim N\left( 0,1 \right),P(X \leq a) = \Phi(\frac{a -\mu}{\sigma})$ (3) $X\sim E(\lambda) \Rightarrow P(X > s + t|X > s) = P(X > t)$ (4) $X\sim G(p) \Rightarrow P(X = m + k|X > m) = P(X = k)$ (5) 离散型随机变量的分布函数为阶梯间断函数;连续型随机变量的分布函数为连续函数,但不一定为处处可导函数。 (6) 存在既非离散也非连续型随机变量。 #### 多维随机变量及其分布 **1.二维随机变量及其联合分布** 由两个随机变量构成的随机向量$(X,Y)$, 联合分布为$F(x,y) = P(X \leq x,Y \leq y)$ **2.二维离散型随机变量的分布** (1) 联合概率分布律 $P\{ X = x_{i},Y = y_{j}\} = p_{{ij}};i,j =1,2,\cdots$ (2) 边缘分布律 $p_{i \cdot} = \sum_{j = 1}^{\infty}p_{{ij}},i =1,2,\cdots$ $p_{\cdot j} = \sum_{i}^{\infty}p_{{ij}},j = 1,2,\cdots$ (3) 条件分布律 $P\{ X = x_{i}|Y = y_{j}\} = \frac{p_{{ij}}}{p_{\cdot j}}$ $P\{ Y = y_{j}|X = x_{i}\} = \frac{p_{{ij}}}{p_{i \cdot}}$ **3. 二维连续性随机变量的密度** (1) 联合概率密度$f(x,y):$ 1) $f(x,y) \geq 0$ 2) $\int_{- \infty}^{+ \infty}{\int_{- \infty}^{+ \infty}{f(x,y)dxdy}} = 1$ (2) 分布函数:$F(x,y) = \int_{- \infty}^{x}{\int_{- \infty}^{y}{f(u,v)dudv}}$ (3) 边缘概率密度: $f_{X}\left( x \right) = \int_{- \infty}^{+ \infty}{f\left( x,y \right){dy}}$ $f_{Y}(y) = \int_{- \infty}^{+ \infty}{f(x,y)dx}$ (4) 条件概率密度:$f_{X|Y}\left( x \middle| y \right) = \frac{f\left( x,y \right)}{f_{Y}\left( y \right)}$ $f_{Y|X}(y|x) = \frac{f(x,y)}{f_{X}(x)}$ **4.常见二维随机变量的联合分布** (1) 二维均匀分布:$(x,y) \sim U(D)$ ,$f(x,y) = \begin{cases} \frac{1}{S(D)},(x,y) \in D \\ 0,其他 \end{cases}$ (2) 二维正态分布:$(X,Y)\sim N(\mu_{1},\mu_{2},\sigma_{1}^{2},\sigma_{2}^{2},\rho)$,$(X,Y)\sim N(\mu_{1},\mu_{2},\sigma_{1}^{2},\sigma_{2}^{2},\rho)$ $f(x,y) = \frac{1}{2\pi\sigma_{1}\sigma_{2}\sqrt{1 - \rho^{2}}}.\exp\left\{ \frac{- 1}{2(1 - \rho^{2})}\lbrack\frac{{(x - \mu_{1})}^{2}}{\sigma_{1}^{2}} - 2\rho\frac{(x - \mu_{1})(y - \mu_{2})}{\sigma_{1}\sigma_{2}} + \frac{{(y - \mu_{2})}^{2}}{\sigma_{2}^{2}}\rbrack \right\}$ **5.随机变量的独立性和相关性** $X$和$Y$的相互独立:$\Leftrightarrow F\left( x,y \right) = F_{X}\left( x \right)F_{Y}\left( y \right)$: $\Leftrightarrow p_{{ij}} = p_{i \cdot} \cdot p_{\cdot j}$(离散型) $\Leftrightarrow f\left( x,y \right) = f_{X}\left( x \right)f_{Y}\left( y \right)$(连续型) $X$和$Y$的相关性: 相关系数$\rho_{{XY}} = 0$时,称$X$和$Y$不相关, 否则称$X$和$Y$相关 **6.两个随机变量简单函数的概率分布** 离散型: $P\left( X = x_{i},Y = y_{i} \right) = p_{{ij}},Z = g\left( X,Y \right)$ 则: $P(Z = z_{k}) = P\left\{ g\left( X,Y \right) = z_{k} \right\} = \sum_{g\left( x_{i},y_{i} \right) = z_{k}}^{}{P\left( X = x_{i},Y = y_{j} \right)}$ 连续型: $\left( X,Y \right) \sim f\left( x,y \right),Z = g\left( X,Y \right)$ 则: $F_{z}\left( z \right) = P\left\{ g\left( X,Y \right) \leq z \right\} = \iint_{g(x,y) \leq z}^{}{f(x,y)dxdy}$,$f_{z}(z) = F'_{z}(z)$ **7.重要公式与结论** (1) 边缘密度公式: $f_{X}(x) = \int_{- \infty}^{+ \infty}{f(x,y)dy,}$ $f_{Y}(y) = \int_{- \infty}^{+ \infty}{f(x,y)dx}$ (2) $P\left\{ \left( X,Y \right) \in D \right\} = \iint_{D}^{}{f\left( x,y \right){dxdy}}$ (3) 若$(X,Y)$服从二维正态分布$N(\mu_{1},\mu_{2},\sigma_{1}^{2},\sigma_{2}^{2},\rho)$ 则有: 1) $X\sim N\left( \mu_{1},\sigma_{1}^{2} \right),Y\sim N(\mu_{2},\sigma_{2}^{2}).$ 2) $X$与$Y$相互独立$\Leftrightarrow \rho = 0$,即$X$与$Y$不相关。 3) $C_{1}X + C_{2}Y\sim N(C_{1}\mu_{1} + C_{2}\mu_{2},C_{1}^{2}\sigma_{1}^{2} + C_{2}^{2}\sigma_{2}^{2} + 2C_{1}C_{2}\sigma_{1}\sigma_{2}\rho)$ 4) ${\ X}$关于$Y=y$的条件分布为: $N(\mu_{1} + \rho\frac{\sigma_{1}}{\sigma_{2}}(y - \mu_{2}),\sigma_{1}^{2}(1 - \rho^{2}))$ 5) $Y$关于$X = x$的条件分布为: $N(\mu_{2} + \rho\frac{\sigma_{2}}{\sigma_{1}}(x - \mu_{1}),\sigma_{2}^{2}(1 - \rho^{2}))$ (4) 若$X$与$Y$独立,且分别服从$N(\mu_{1},\sigma_{1}^{2}),N(\mu_{1},\sigma_{2}^{2}),$ 则:$\left( X,Y \right)\sim N(\mu_{1},\mu_{2},\sigma_{1}^{2},\sigma_{2}^{2},0),$ $C_{1}X + C_{2}Y\tilde{\ }N(C_{1}\mu_{1} + C_{2}\mu_{2},C_{1}^{2}\sigma_{1}^{2} C_{2}^{2}\sigma_{2}^{2}).$ (5) 若$X$与$Y$相互独立,$f\left( x \right)$和$g\left( x \right)$为连续函数, 则$f\left( X \right)$和$g(Y)$也相互独立。 #### 随机变量的数字特征 **1.数学期望** 离散型:$P\left\{ X = x_{i} \right\} = p_{i},E(X) = \sum_{i}^{}{x_{i}p_{i}}$; 连续型: $X\sim f(x),E(X) = \int_{- \infty}^{+ \infty}{xf(x)dx}$ 性质: (1) $E(C) = C,E\lbrack E(X)\rbrack = E(X)$ (2) $E(C_{1}X + C_{2}Y) = C_{1}E(X) + C_{2}E(Y)$ (3) 若$X$和$Y$独立,则$E(XY) = E(X)E(Y)$ (4)$\left\lbrack E(XY) \right\rbrack^{2} \leq E(X^{2})E(Y^{2})$ **2.方差**:$D(X) = E\left\lbrack X - E(X) \right\rbrack^{2} = E(X^{2}) - \left\lbrack E(X) \right\rbrack^{2}$ **3.标准差**:$\sqrt{D(X)}$, **4.离散型:**$D(X) = \sum_{i}^{}{\left\lbrack x_{i} - E(X) \right\rbrack^{2}p_{i}}$ **5.连续型:**$D(X) = {\int_{- \infty}^{+ \infty}\left\lbrack x - E(X) \right\rbrack}^{2}f(x)dx$ 性质: (1)$\ D(C) = 0,D\lbrack E(X)\rbrack = 0,D\lbrack D(X)\rbrack = 0$ (2) $X$与$Y$相互独立,则$D(X \pm Y) = D(X) + D(Y)$ (3)$\ D\left( C_{1}X + C_{2} \right) = C_{1}^{2}D\left( X \right)$ (4) 一般有 $D(X \pm Y) = D(X) + D(Y) \pm 2Cov(X,Y) = D(X) + D(Y) \pm 2\rho\sqrt{D(X)}\sqrt{D(Y)}$ (5)$\ D\left( X \right) < E\left( X - C \right)^{2},C \neq E\left( X \right)$ (6)$\ D(X) = 0 \Leftrightarrow P\left\{ X = C \right\} = 1$ **6.随机变量函数的数学期望** (1) 对于函数$Y = g(x)$ $X$为离散型:$P\{ X = x_{i}\} = p_{i},E(Y) = \sum_{i}^{}{g(x_{i})p_{i}}$; $X$为连续型:$X\sim f(x),E(Y) = \int_{- \infty}^{+ \infty}{g(x)f(x)dx}$ (2) $Z = g(X,Y)$;$\left( X,Y \right)\sim P\{ X = x_{i},Y = y_{j}\} = p_{{ij}}$; $E(Z) = \sum_{i}^{}{\sum_{j}^{}{g(x_{i},y_{j})p_{{ij}}}}$ $\left( X,Y \right)\sim f(x,y)$;$E(Z) = \int_{- \infty}^{+ \infty}{\int_{- \infty}^{+ \infty}{g(x,y)f(x,y)dxdy}}$ **7.协方差** $Cov(X,Y) = E\left\lbrack (X - E(X)(Y - E(Y)) \right\rbrack$ **8.相关系数** $\rho_{{XY}} = \frac{Cov(X,Y)}{\sqrt{D(X)}\sqrt{D(Y)}}$,$k$阶原点矩 $E(X^{k})$; $k$阶中心矩 $E\left\{ {\lbrack X - E(X)\rbrack}^{k} \right\}$ 性质: (1)$\ Cov(X,Y) = Cov(Y,X)$ (2)$\ Cov(aX,bY) = abCov(Y,X)$ (3)$\ Cov(X_{1} + X_{2},Y) = Cov(X_{1},Y) + Cov(X_{2},Y)$ (4)$\ \left| \rho\left( X,Y \right) \right| \leq 1$ (5) $\ \rho\left( X,Y \right) = 1 \Leftrightarrow P\left( Y = aX + b \right) = 1$ ,其中$a > 0$ $\rho\left( X,Y \right) = - 1 \Leftrightarrow P\left( Y = aX + b \right) = 1$ ,其中$a < 0$ **9.重要公式与结论** (1)$\ D(X) = E(X^{2}) - E^{2}(X)$ (2)$\ Cov(X,Y) = E(XY) - E(X)E(Y)$ (3) $\left| \rho\left( X,Y \right) \right| \leq 1,$且 $\rho\left( X,Y \right) = 1 \Leftrightarrow P\left( Y = aX + b \right) = 1$,其中$a > 0$ $\rho\left( X,Y \right) = - 1 \Leftrightarrow P\left( Y = aX + b \right) = 1$,其中$a < 0$ (4) 下面5个条件互为充要条件: $\rho(X,Y) = 0$ $\Leftrightarrow Cov(X,Y) = 0$ $\Leftrightarrow E(X,Y) = E(X)E(Y)$ $\Leftrightarrow D(X + Y) = D(X) + D(Y)$ $\Leftrightarrow D(X - Y) = D(X) + D(Y)$ 注:$X$与$Y$独立为上述5个条件中任何一个成立的充分条件,但非必要条件。 #### 数理统计的基本概念 **1.基本概念** 总体:研究对象的全体,它是一个随机变量,用$X$表示。 个体:组成总体的每个基本元素。 简单随机样本:来自总体$X$的$n$个相互独立且与总体同分布的随机变量$X_{1},X_{2}\cdots,X_{n}$,称为容量为$n$的简单随机样本,简称样本。 统计量:设$X_{1},X_{2}\cdots,X_{n},$是来自总体$X$的一个样本,$g(X_{1},X_{2}\cdots,X_{n})$)是样本的连续函数,且$g()$中不含任何未知参数,则称$g(X_{1},X_{2}\cdots,X_{n})$为统计量。 样本均值:$\overline{X} = \frac{1}{n}\sum_{i = 1}^{n}X_{i}$ 样本方差:$S^{2} = \frac{1}{n - 1}\sum_{i = 1}^{n}{(X_{i} - \overline{X})}^{2}$ 样本矩:样本$k$阶原点矩:$A_{k} = \frac{1}{n}\sum_{i = 1}^{n}X_{i}^{k},k = 1,2,\cdots$ 样本$k$阶中心矩:$B_{k} = \frac{1}{n}\sum_{i = 1}^{n}{(X_{i} - \overline{X})}^{k},k = 1,2,\cdots$ **2.分布** $\chi^{2}$分布:$\chi^{2} = X_{1}^{2} + X_{2}^{2} + \cdots + X_{n}^{2}\sim\chi^{2}(n)$,其中$X_{1},X_{2}\cdots,X_{n},$相互独立,且同服从$N(0,1)$ $t$分布:$T = \frac{X}{\sqrt{Y/n}}\sim t(n)$ ,其中$X\sim N\left( 0,1 \right),Y\sim\chi^{2}(n),$且$X$,$Y$ 相互独立。 $F$分布:$F = \frac{X/n_{1}}{Y/n_{2}}\sim F(n_{1},n_{2})$,其中$X\sim\chi^{2}\left( n_{1} \right),Y\sim\chi^{2}(n_{2}),$且$X$,$Y$相互独立。 分位数:若$P(X \leq x_{\alpha}) = \alpha,$则称$x_{\alpha}$为$X$的$\alpha$分位数 **3.正态总体的常用样本分布** (1) 设$X_{1},X_{2}\cdots,X_{n}$为来自正态总体$N(\mu,\sigma^{2})$的样本, $\overline{X} = \frac{1}{n}\sum_{i = 1}^{n}X_{i},S^{2} = \frac{1}{n - 1}\sum_{i = 1}^{n}{{(X_{i} - \overline{X})}^{2},}$则: 1) $\overline{X}\sim N\left( \mu,\frac{\sigma^{2}}{n} \right){\ \ }$或者$\frac{\overline{X} - \mu}{\frac{\sigma}{\sqrt{n}}}\sim N(0,1)$ 2) $\frac{(n - 1)S^{2}}{\sigma^{2}} = \frac{1}{\sigma^{2}}\sum_{i = 1}^{n}{{(X_{i} - \overline{X})}^{2}\sim\chi^{2}(n - 1)}$ 3) $\frac{1}{\sigma^{2}}\sum_{i = 1}^{n}{{(X_{i} - \mu)}^{2}\sim\chi^{2}(n)}$ 4)${\ \ }\frac{\overline{X} - \mu}{S/\sqrt{n}}\sim t(n - 1)$ **4.重要公式与结论** (1) 对于$\chi^{2}\sim\chi^{2}(n)$,有$E(\chi^{2}(n)) = n,D(\chi^{2}(n)) = 2n;$ (2) 对于$T\sim t(n)$,有$E(T) = 0,D(T) = \frac{n}{n - 2}(n > 2)$; (3) 对于$F\tilde{\ }F(m,n)$,有 $\frac{1}{F}\sim F(n,m),F_{a/2}(m,n) = \frac{1}{F_{1 - a/2}(n,m)};$ (4) 对于任意总体$X$,有 $E(\overline{X}) = E(X),E(S^{2}) = D(X),D(\overline{X}) = \frac{D(X)}{n}$ ================================================ FILE: 0.math/1.CS229/README.md ================================================ # CS 229 机器学习课程复习材料 文件夹的材料斯坦福大学CS 229机器学习课程的基础材料的翻译版本,[原始文件下载](http://cs229.stanford.edu/summer2019/cs229-linalg.pdf) 翻译:[黄海广](https://github.com/fengdu78) 备注:请关注[github](https://github.com/fengdu78/Data-Science-Notes/tree/master/0.math)的更新,近期将更新完。 markdown文件夹是文件的markdown代码,内容与pdf一致,是为了方便研究者写论文或者文章使用。 github内容是方便用户学习研究使用,请勿用于商业目的。 如果需要引用这个Repo: 格式: `fengdu78, Data-Science-Notes, (2019), GitHub repository, https://github.com/fengdu78/Data-Science-Notes` ================================================ FILE: 0.math/1.CS229/markdown/1.CS229-LinearAlgebra.md ================================================ > 本文是斯坦福大学CS 229机器学习课程的基础材料,[原始文件下载](http://cs229.stanford.edu/summer2019/cs229-linalg.pdf) > 原文作者:Zico Kolter,修改:Chuong Do, Tengyu Ma > > 翻译:[黄海广](https://github.com/fengdu78) > 备注:请关注[github](https://github.com/fengdu78/Data-Science-Notes/tree/master/0.math)的更新,线性代数和概率论已经更新完毕。 # CS229 机器学习课程复习材料-线性代数 [TOC] ## 线性代数复习和参考 ### 1. 基础概念和符号 线性代数提供了一种紧凑地表示和操作线性方程组的方法。 例如,以下方程组: $$ 4x_1 − 5x_2 = −13 $$ $$ −2x_1 + 3x_2 = 9 $$ 这是两个方程和两个变量,正如你从高中代数中所知,你可以找到 $x_1$ 和 $x_2$ 的唯一解(除非方程以某种方式退化,例如,如果第二个方程只是第一个的倍数,但在上面的情况下,实际上只有一个唯一解)。 在矩阵表示法中,我们可以更紧凑地表达: $$ Ax= b $$ $$ \text { with } A=\left[\begin{array}{cc}{4} & {-5} \\ {-2} & {3}\end{array}\right], b=\left[\begin{array}{c}{-13} \\ {9}\end{array}\right] $$ 我们可以看到,这种形式的线性方程有许多优点(比如明显地节省空间)。 #### 1.1 基本符号 我们使用以下符号: - $A \in \mathbb{R}^{m \times n}$,表示 $A$ 为由实数组成具有$m$行和$n$列的矩阵。 - $x \in \mathbb{R}^{ n}$,表示具有$n$个元素的向量。 通常,向量$x$将表示列向量: 即,具有$n$行和$1$列的矩阵。 如果我们想要明确地表示行向量: 具有 $1$ 行和$n$列的矩阵 - 我们通常写$x^T$(这里$x^T$$x$的转置)。 - $x_i$表示向量$x$的第$i$个元素 $$ x=\left[\begin{array}{c}{x_{1}} \\ {x_{2}} \\ {\vdots} \\ {x_{n}}\end{array}\right] $$ - 我们使用符号 $a_{ij}$(或$A_{ij}$,$A_{i,j}$等)来表示第 $i$ 行和第$j$列中的 $A$ 的元素: $$ A=\left[\begin{array}{cccc}{a_{11}} & {a_{12}} & {\cdots} & {a_{1 n}} \\ {a_{21}} & {a_{22}} & {\cdots} & {a_{2 n}} \\ {\vdots} & {\vdots} & {\ddots} & {\vdots} \\ {a_{m 1}} & {a_{m 2}} & {\cdots} & {a_{m n}}\end{array}\right] $$ - 我们用$a^j$或者$A_{:,j}$表示矩阵$A$的第$j$列: $$ A=\left[\begin{array}{llll}{ |} & { |} & {} & { |} \\ {a^{1}} & {a^{2}} & {\cdots} & {a^{n}} \\ { |} & { |} & {} & { |}\end{array}\right] $$ - 我们用$a^T_i$或者$A_{i,:}$表示矩阵$A$的第$i$行: $$ A=\left[\begin{array}{c}{-a_{1}^{T}-} \\ {-a_{2}^{T}-} \\ {\vdots} \\ {-a_{m}^{T}-}\end{array}\right] $$ - 在许多情况下,将矩阵视为列向量或行向量的集合非常重要且方便。 通常,在向量而不是标量上操作在数学上(和概念上)更清晰。只要明确定义了符号,用于矩阵的列或行的表示方式并没有通用约定。 ### 2.矩阵乘法 两个矩阵相乘,其中 $A \in \mathbb{R}^{m \times n}$ and $B \in \mathbb{R}^{n \times p}$ ,则: $$ C = AB \in \mathbb{R}^{m \times p} $$ 其中: $$ C_{i j}=\sum_{k=1}^{n} A_{i k} B_{k j} $$ 请注意,为了使矩阵乘积存在,$A$中的列数必须等于$B$中的行数。有很多方法可以查看矩阵乘法,我们将从检查一些特殊情况开始。 #### 2.1 向量-向量乘法 给定两个向量$x, y \in \mathbb{R}^{n}$,$x^T y$通常称为**向量内积**或者**点积**,结果是个**实数**。 $$ x^{T} y \in \mathbb{R}=\left[\begin{array}{llll}{x_{1}} & {x_{2}} & {\cdots} & {x_{n}}\end{array}\right]\left[\begin{array}{c}{y_{1}} \\ {y_{2}} \\ {\vdots} \\ {y_{n}}\end{array}\right]=\sum_{i=1}^{n} x_{i} y_{i} $$ 注意:$x^T y = y^Tx$ 始终成立。 给定向量 $x \in \mathbb{R}^{m}$, $y \in \mathbb{R}^{n}$ (他们的维度是否相同都没关系),$xy^T \in \mathbb{R}^{m \times n}$叫做**向量外积 ** , 当 $(xy^T)_{ij} = x_iy_j$ 的时候,它是一个矩阵。 $$ x y^{T} \in \mathbb{R}^{m \times n}=\left[\begin{array}{c}{x_{1}} \\ {x_{2}} \\ {\vdots} \\ {x_{m}}\end{array}\right]\left[\begin{array}{llll}{y_{1}} & {y_{2}} & {\cdots} & {y_{n}}\end{array}\right]=\left[\begin{array}{cccc}{x_{1} y_{1}} & {x_{1} y_{2}} & {\cdots} & {x_{1} y_{n}} \\ {x_{2} y_{1}} & {x_{2} y_{2}} & {\cdots} & {x_{2} y_{n}} \\ {\vdots} & {\vdots} & {\ddots} & {\vdots} \\ {x_{m} y_{1}} & {x_{m} y_{2}} & {\cdots} & {x_{m} y_{n}}\end{array}\right] $$ 举一个外积如何使用的一个例子:让$1\in R^{n}$表示一个$n$维向量,其元素都等于1,此外,考虑矩阵$A \in R^{m \times n}$,其列全部等于某个向量 $x \in R^{m}$。 我们可以使用外积紧凑地表示矩阵 $A$: $$ A=\left[\begin{array}{llll}{ |} & { |} & {} & { |} \\ {x} & {x} & {\cdots} & {x} \\ { |} & { |} & {} & { |}\end{array}\right]=\left[\begin{array}{cccc}{x_{1}} & {x_{1}} & {\cdots} & {x_{1}} \\ {x_{2}} & {x_{2}} & {\cdots} & {x_{2}} \\ {\vdots} & {\vdots} & {\ddots} & {\vdots} \\ {x_{m}} & {x_{m}} & {\cdots} & {x_{m}}\end{array}\right]=\left[\begin{array}{c}{x_{1}} \\ {x_{2}} \\ {\vdots} \\ {x_{m}}\end{array}\right]\left[\begin{array}{lll}{1} & {1} & {\cdots} & {1}\end{array}\right]=x \mathbf{1}^{T} $$ #### 2.2 矩阵-向量乘法 给定矩阵 $A \in \mathbb{R}^{m \times n}$,向量 $x \in \mathbb{R}^{n}$ , 它们的积是一个向量 $y = Ax \in R^{m}$。 有几种方法可以查看矩阵向量乘法,我们将依次查看它们中的每一种。 如果我们按行写$A$,那么我们可以表示$Ax$为: $$ y=A x=\left[\begin{array}{ccc}{-} & {a_{1}^{T}} & {-} \\ {-} & {a_{2}^{T}} & {-} \\ {} & {\vdots} & {} \\ {-} & {a_{m}^{T}} & {-}\end{array}\right] x=\left[\begin{array}{c}{a_{1}^{T} x} \\ {a_{2}^{T} x} \\ {\vdots} \\ {a_{m}^{T} x}\end{array}\right] $$ 换句话说,第$i$个$y$是$A$的第$i$行和$x$的内积,即:$y_i = y_{i}=a_{i}^{T} x$。 同样的, 可以把 $A$ 写成列的方式,则公式如下: $$ y=A x=\left[\begin{array}{cccc}{ |} & { |} & {} & { |} \\ {a^{1}} & {a^{2}} & {\cdots} & {a^{n}} \\ { |} & { |} & {} & { |}\end{array}\right]\left[\begin{array}{c}{x_{1}} \\ {x_{2}} \\ {\vdots} \\ {x_{n}}\end{array}\right]=\left[\begin{array}{c}{ } \\ {a^{1}{ } \\ }\end{array}\right] x_{1}+\left[\begin{array}{c}{ } \\ {a^{2}{ } \\ }\end{array}\right] x_{2}+{\cdots} +\left[\begin{array}{c}{ } \\ {a^{n}{ } \\ }\end{array}\right] x_{n} $$ 换句话说,$y$是$A$的列的线性组合,其中线性组合的系数由$x$的元素给出。 到目前为止,我们一直在右侧乘以列向量,但也可以在左侧乘以行向量。 这是写的,$y^T = x^TA$ 表示$A \in \mathbb{R}^{m \times n}$,$x \in \mathbb{R}^{m}$,$y \in \mathbb{R}^{n}$。 和以前一样,我们可以用两种可行的方式表达$y^T$,这取决于我们是否根据行或列表达$A$. 第一种情况,我们把$A$用列表示: $$ y^{T}=x^{T} A=x^{T}\left[\begin{array}{cccc}{ |} & { |} & {} & { |} \\ {a^{1}} & {a^{2}} & {\cdots} & {a^{n}} \\ { |} & { |} & {} & { |}\end{array}\right]=\left[\begin{array}{cccc}{x^{T} a^{1}} & {x^{T} a^{2}} & {\dots} & {x^{T} a^{n}}\end{array}\right] $$ 这表明$y^T$的第$i$个元素等于$x$和$A$的第$i$列的内积。 最后,根据行表示$A$,我们得到了向量-矩阵乘积的最终表示: $$ y^T=x^TA =\left[\begin{array}{llll}{x_{1}} & {x_{2}} & {\cdots} & {x_{n}}\end{array}\right]\left[\begin{array}{c}{-a_{1}^{T}-} \\ {-a_{2}^{T}-} \\ {\vdots} \\ {-a_{m}^{T}-}\end{array}\right] =x_{1}\left[-a_{1}^{T}-\right]+x_{2}\left[-a_{2}^{T}-\right]+\ldots+x_{n}\left[-a_{n}^{T}-\right] $$ 所以我们看到$y^T$是$A$的行的线性组合,其中线性组合的系数由$x$的元素给出。 #### 2.3 矩阵-矩阵乘法 有了这些知识,我们现在可以看看四种不同的(形式不同,但结果是相同的)矩阵-矩阵乘法:也就是本节开头所定义的$C=AB$的乘法。 首先,我们可以将矩阵 - 矩阵乘法视为一组向量-向量乘积。 从定义中可以得出:最明显的观点是$C $的$( i,j )$元素等于$A$的第$i$行和$B$的的$j$列的内积。如下面的公式所示: $$ C=A B=\left[\begin{array}{cc}{-} & {a_{1}^{T}} &{-} \\ {-} & {a_{2}^{T}} &{-} \\ {} & {\vdots} \\ {-} & {a_{m}^{T}} &{-} \end{array}\right]\left[\begin{array}{cccc}{ |} & { |} & {} & { |} \\ {b_{1}} & {b_{2}} & {\cdots} & {b_{p}} \\ { |} & { |} & {} & { |}\end{array}\right]=\left[\begin{array}{cccc}{a_{1}^{T} b_{1}} & {a_{1}^{T} b_{2}} & {\cdots} & {a_{1}^{T} b_{p}} \\ {a_{2}^{T} b_{1}} & {a_{2}^{T} b_{2}} & {\cdots} & {a_{2}^{T} b_{p}} \\ {\vdots} & {\vdots} & {\ddots} & {\vdots} \\ {a_{m}^{T} b_{1}} & {a_{m}^{T} b_{2}} & {\cdots} & {a_{m}^{T} b_{p}}\end{array}\right] $$ 这里的$ A \in \mathbb{R}^{m\times n}$ ,$B \in \mathbb{R}^{n \times p}$, $a_i \in \mathbb{R}^n$ ,$b^j \in \mathbb{R}^{n \times p}$, 这里的$ A \in \mathbb{R}^ {m \times n},$ $B \in \mathbb{R}^ {n \times p} $, $a_i \in \mathbb{R} ^ n $,$ b ^ j \in \mathbb{R} ^ {n \times p} $,所以它们可以计算内积。 我们用通常用行表示$ A $而用列表示$B$。 或者,我们可以用列表示$ A$,用行表示$B $,这时$AB$是求外积的和。公式如下: $$ C=A B=\left[\begin{array}{cccc}{ |} & { |} & {} & { |} \\ {a_{1}} & {a_{2}} & {\cdots} & {a_{n}} \\ { |} & { |} & {} & { |}\end{array}\right]\left[\begin{array}{c}{-}& {b_{1}^{T}}&{-} \\ {-}& {b_{2}^{T}}&{-} \\ {\vdots} \\{-}& {b_{n}^{T}}&{-}\end{array}\right]=\sum_{i=1}^{n} a_{i} b_{i}^{T} $$ 换句话说,$AB$等于所有的$A$的第$i$列和$B$第$i$行的外积的和。因此,在这种情况下, $a_i \in \mathbb{R}^ m $和$b_i \in \mathbb{R}^p$, 外积$a^ib_i^T$的维度是$m×p$,与$C$的维度一致。 其次,我们还可以将矩阵 - 矩阵乘法视为一组矩阵向量积。如果我们把$B$用列表示,我们可以将$C$的列视为$A$和$B$的列的矩阵向量积。公式如下: $$ C=A B=A\left[\begin{array}{cccc}{ |} & { |} & {} & { |} \\ {b_{1}} & {b_{2}} & {\cdots} & {b_{p}} \\ { |} & { |} & {} & { |}\end{array}\right]=\left[\begin{array}{cccc}{ |} & { |} & {} & { |} \\ {A b_{1}} & {A b_{2}} & {\cdots} & {A b_{p}} \\ { |} & { |} & {} & { |}\end{array}\right] $$ 这里$C$的第$i$列由矩阵向量乘积给出,右边的向量为$c_i = Ab_i$。 这些矩阵向量乘积可以使用前一小节中给出的两个观点来解释。 最后,我们有类似的观点,我们用行表示$A$,$C$的行作为$A$和$C$行之间的矩阵向量积。公式如下: $$ C=A B=\left[\begin{array}{ccc}{-} & {a_{1}^{T}} & {-} \\ {-} & {a_{2}^{T}} & {-} \\ {} & {\vdots} & {} \\ {-} & {a_{m}^{T}} & {-}\end{array}\right] B=\left[\begin{array}{c} {-} & {a_{1}^{T} B} & {-}\\ {-} & {a_{2}^{T} B} & {-} \\ {\vdots} \\ {-} & {a_{m}^{T} B}& {-}\end{array}\right] $$ 这里第$i$行的$C$由左边的向量的矩阵向量乘积给出:$c_i^T = a_i^T B$ 将矩阵乘法剖析到如此大的程度似乎有点过分,特别是当所有这些观点都紧跟在我们在本节开头给出的初始定义(在一行数学中)之后。 这些不同方法的直接优势在于它们允许您**在向量的级别/单位而不是标量上进行操作**。 为了完全理解线性代数而不会迷失在复杂的索引操作中,关键是要用尽可能多的概念进行操作。 实际上所有的线性代数都处理某种矩阵乘法,花一些时间对这里提出的观点进行直观的理解是非常必要的。 除此之外,了解一些更高级别的矩阵乘法的基本属性是很有必要的: - 矩阵乘法结合律: $(AB)C = A(BC)$ - 矩阵乘法分配律: $A(B + C) = AB + AC$ - 矩阵乘法通常不是可交换的; 也就是说,通常$AB \ne BA$。 (例如,假设$ A \in \mathbb{R}^ {m \times n},$ $B \in \mathbb{R}^ {n \times p} $,如果$m$和$q$不相等,矩阵乘积$BA$甚至不存在!) 如果您不熟悉这些属性,请花点时间自己验证它们。 例如,为了检查矩阵乘法的相关性,假设$A \in \mathbb{R}^ {m \times n},$ $B \in \mathbb{R}^ {n \times p} $,$C \in \mathbb{R}^ {p \times q}$。 注意$AB \in \mathbb{R}^ {m \times p}$,所以$(AB)C \in \mathbb{R}^ {m \times q}$。 类似地,$BC \in \mathbb{R}^ {n \times q}$,所以$A(BC) \in \mathbb{R}^ {m \times q}$。 因此,所得矩阵的维度一致。 为了表明矩阵乘法是相关的,足以检查$(AB)C $的第$(i,j)$个元素是否等于$A(BC)$的第$(i,j)$个元素。 我们可以使用矩阵乘法的定义直接验证这一点: $$ \begin{aligned}((A B) C)_{i j} &=\sum_{k=1}^{p}(A B)_{i k} C_{k j}=\sum_{k=1}^{p}\left(\sum_{l=1}^{n} A_{i l} B_{l k}\right) C_{k j} \\ &=\sum_{k=1}^{p}\left(\sum_{l=1}^{n} A_{i l} B_{l k} C_{k j}\right)=\sum_{l=1}^{n}\left(\sum_{k=1}^{p} A_{i l} B_{l k} C_{k j}\right) \\ &=\sum_{l=1}^{n} A_{i l}\left(\sum_{k=1}^{p} B_{l k} C_{k j}\right)=\sum_{l=1}^{n} A_{i l}(B C)_{l j}=(A(B C))_{i j} \end{aligned} $$ ### 3 运算和属性 在本节中,我们介绍矩阵和向量的几种运算和属性。 希望能够为您复习大量此类内容,这些笔记可以作为这些主题的参考。 #### 3.1 单位矩阵和对角矩阵 **单位矩阵**,$I \in \mathbb{R}^{n \times n} $,它是一个方阵,对角线的元素是1,其余元素都是0: $$ I_{i j}=\left\{\begin{array}{ll}{1} & {i=j} \\ {0} & {i \neq j}\end{array}\right. $$ 对于所有$A \in \mathbb{R}^ {m \times n}$,有: $$ AI = A = IA $$ 注意,在某种意义上,单位矩阵的表示法是不明确的,因为它没有指定$I$的维数。通常,$I$的维数是从上下文推断出来的,以便使矩阵乘法成为可能。 例如,在上面的等式中,$AI = A$中的I是$n\times n$矩阵,而$A = IA$中的$I$是$m\times m$矩阵。 对角矩阵是一种这样的矩阵:对角线之外的元素全为0。对角阵通常表示为:$D= diag(d_1, d_2, . . . , d_n)$,其中: $$ D_{i j}=\left\{\begin{array}{ll}{d_{i}} & {i=j} \\ {0} & {i \neq j}\end{array}\right. $$ 很明显:单位矩阵$ I = diag(1, 1, . . . , 1)$。 #### 3.2 转置 矩阵的转置是指翻转矩阵的行和列。 给定一个矩阵: $A \in \mathbb{R}^ {m \times n}$, 它的转置为$n \times m$的矩阵$A^T \in \mathbb{R}^ {n \times m}$ ,其中的元素为: $$ (A^T)_{ij} = A_{ji} $$ 事实上,我们在描述行向量时已经使用了转置,因为列向量的转置自然是行向量。 转置的以下属性很容易验证: - $(A^T )^T = A$ - $ (AB)^T = B^T A^T$ - $(A + B)^T = A^T + B^T$ #### 3.3 对称矩阵 如果$A = A^T$,则矩阵$A \in \mathbb{R}^ {n \times n}$是对称矩阵。 如果$ A = - A^T$,它是反对称的。 很容易证明,对于任何矩阵$A \in \mathbb{R}^ {n \times n}$,矩阵$A + A^ T$是对称的,矩阵$A -A^T$是反对称的。 由此得出,任何方矩阵$A \in \mathbb{R}^ {n \times n}$可以表示为对称矩阵和反对称矩阵的和,所以: $$ A=\frac{1}{2}(A+A^T)+\frac{1}{2}(A-A^T) $$ 上面公式的右边的第一个矩阵是对称矩阵,而第二个矩阵是反对称矩阵。 事实证明,对称矩阵在实践中用到很多,它们有很多很好的属性,我们很快就会看到它们。 通常将大小为$n$的所有对称矩阵的集合表示为$\mathbb{S}^n$,因此$A \in \mathbb{S}^n$意味着$A$是对称的$n\times n$矩阵; #### 3.4 矩阵的迹 方矩阵$A \in \mathbb{R}^ {n \times n}$的迹,表示为$\operatorname{tr} (A)$(或者只是$\operatorname{tr} A$,如果括号显然是隐含的),是矩阵中对角元素的总和: $$ \operatorname{tr} A=\sum_{i=1}^{n} A_{i i} $$ 如**CS229**讲义中所述,迹具有以下属性(如下所示): - 对于矩阵$A \in \mathbb{R}^ {n \times n}$,则:$\operatorname{tr}A =\operatorname{tr}A^T$ - 对于矩阵$A,B \in \mathbb{R}^ {n \times n}$,则:$\operatorname{tr}(A + B) = \operatorname{tr}A + \operatorname{tr}B$ - 对于矩阵$A \in \mathbb{R}^ {n \times n}$,$ t \in \mathbb{R}$,则:$\operatorname{tr}(tA) = t\operatorname{tr}A$. - 对于矩阵 $A$, $B$,$AB$ 为方阵, 则:$\operatorname{tr}AB = \operatorname{tr}BA$ - 对于矩阵 $A$, $B$, $C$, $ABC$为方阵, 则:$\operatorname{tr}ABC = \operatorname{tr}BCA=\operatorname{tr}CAB$, 同理,更多矩阵的积也是有这个性质。 作为如何证明这些属性的示例,我们将考虑上面给出的第四个属性。 假设$A \in \mathbb{R}^ {m \times n}$和$B \in \mathbb{R}^ {n \times m}$(因此$AB \in \mathbb{R}^ {m \times m}$是方阵)。 观察到$BA \in \mathbb{R}^ {n \times n}$也是一个方阵,因此对它们进行迹的运算是有意义的。 要证明$\operatorname{tr}AB = \operatorname{tr}BA$,请注意: $$ \begin{aligned} \operatorname{tr} A B &=\sum_{i=1}^{m}(A B)_{i i}=\sum_{i=1}^{m}\left(\sum_{j=1}^{n} A_{i j} B_{j i}\right) \\ &=\sum_{i=1}^{m} \sum_{j=1}^{n} A_{i j} B_{j i}=\sum_{j=1}^{n} \sum_{i=1}^{m} B_{j i} A_{i j} \\ &=\sum_{j=1}^{n}\left(\sum_{i=1}^{m} B_{j i} A_{i j}\right)=\sum_{j=1}^{n}(B A)_{j j}=\operatorname{tr} B A \end{aligned} $$ 这里,第一个和最后两个等式使用迹运算符和矩阵乘法的定义,重点在第四个等式,使用标量乘法的可交换性来反转每个乘积中的项的顺序,以及标量加法的可交换性和相关性,以便重新排列求和的顺序。 #### 3.5 范数 向量的范数$\|x\|$是非正式度量的向量的“长度” 。 例如,我们有常用的欧几里德或$\ell_{2}$范数, $$ \|x\|_{2}=\sqrt{\sum_{i=1}^{n} x_{i}^{2}} $$ 注意:$\|x\|_{2}^{2}=x^{T} x$ 更正式地,范数是满足4个属性的函数($f : \mathbb{R}^{n} \rightarrow \mathbb{R}$): 1. 对于所有的 $x \in \mathbb{R}^ {n}$, $f(x) \geq 0 $(非负). 2. 当且仅当$x = 0$ 时,$f(x) = 0$ (明确性). 3. 对于所有$x \in \mathbb{R}^ {n}$,$t\in \mathbb{R}$,则 $f(tx) = \left| t \right|f(x)$ (正齐次性). 4. 对于所有 $x,y \in \mathbb{R}^ {n}$, $f(x + y) \leq f(x) + f(y)$ (三角不等式) 其他范数的例子是$\ell_1$范数: $$ \|x\|_{1}=\sum_{i=1}^{n}\left|x_{i}\right| $$ 和$\ell_{\infty }$范数: $$ \|x\|_{\infty}=\max _{i}\left|x_{i}\right| $$ 事实上,到目前为止所提出的所有三个范数都是$\ell_p$范数族的例子,它们由实数$p \geq 1$参数化,并定义为: $$ \|x\|_{p}=\left(\sum_{i=1}^{n}\left|x_{i}\right|^{p}\right)^{1 / p} $$ 也可以为矩阵定义范数,例如**Frobenius**范数: $$ \|A\|_{F}=\sqrt{\sum_{i=1}^{m} \sum_{j=1}^{n} A_{i j}^{2}}=\sqrt{\operatorname{tr}\left(A^{T} A\right)} $$ 许多其他更多的范数,但它们超出了这个复习材料的范围。 #### 3.6 线性相关性和秩 一组向量${x_1,x_2, \cdots x_n} \in \mathbb{R}$, 如果没有向量可以表示为其余向量的线性组合,则称称该向量是线性无相关的。 相反,如果属于该组的一个向量可以表示为其余向量的线性组合,则称该向量是线性相关的。 也就是说,如果: $$ x_{n}=\sum_{i=1}^{n-1} \alpha_{i} x_{i} $$ 对于某些标量值$\alpha_1,\cdots \alpha_n-1 \in \mathbb{R}$,要么向量$x_1,x_2, \cdots x_n$是线性相关的; 否则,向量是线性无关的。 例如,向量: $$ x_{1}=\left[\begin{array}{l}{1} \\ {2} \\ {3}\end{array}\right] \quad x_{2}=\left[\begin{array}{c}{4} \\ {1} \\ {5}\end{array}\right] \quad x_{3}=\left[\begin{array}{c}{2} \\ {-3} \\ {-1}\end{array}\right] $$ 是线性相关的,因为:$x_3=-2x_1+x_2$。 矩阵$A \in \mathbb{R}^{m \times n}$的**列秩**是构成线性无关集合的$A$的最大列子集的大小。 由于术语的多样性,这通常简称为$A$的线性无关列的数量。同样,行秩是构成线性无关集合的$A$的最大行数。 对于任何矩阵$A \in \mathbb{R}^{m \times n}$,事实证明$A$的列秩等于$A$的行秩(尽管我们不会证明这一点),因此两个量统称为$A$的**秩**,用 $\text{rank}(A)$表示。 以下是秩的一些基本属性: - 对于 $A \in \mathbb{R}^{m \times n}$,$\text{rank}(A) \leq min(m, n)$,如果$ \text(A) = \text{min} (m, n)$,则: $A$ 被称作**满秩**。 - 对于 $A \in \mathbb{R}^{m \times n}$, $\text{rank}(A) = \text{rank}(A^T)$ - 对于 $A \in \mathbb{R}^{m \times n}$,$B \in \mathbb{R}^{n \times p}$ ,$\text{rank}(AB) \leq \text{min} ( \text{rank}(A), \text{rank}(B))$ - 对于 $A,B \in \mathbb{R}^{m \times n}$,$\text{rank}(A + B) \leq \text{rank}(A) + \text{rank}(B)$ #### 3.7 方阵的逆 方阵$A \in \mathbb{R}^{n \times n}$的倒数表示为$A^{-1}$,并且是这样的独特矩阵: $$ A^{-1}A=I=AA^{-1} $$ 请注意,并非所有矩阵都具有逆。 例如,非方形矩阵根据定义没有逆。 然而,对于一些方形矩阵$A$,可能仍然存在$A^{-1}$可能不存在的情况。 特别是,如果$A^{-1}$存在,我们说$A$是**可逆**的或**非奇异**的,否则就是**不可逆**或**奇异**的。 为了使方阵A具有逆$A^{-1}$,则$A$必须是满秩。 我们很快就会发现,除了满秩之外,还有许多其它的充分必要条件。 以下是逆的属性; 假设$A,B \in \mathbb{R}^{n \times n}$,而且是非奇异的: - $(A^{-1})^{-1} = A$ - $(AB)^{-1} = B^{-1}A^{-1}$ - $(A^{-1})^{T} =(A^{T})^{-1} $因此,该矩阵通常表示为$A^{-T}$。 作为如何使用逆的示例,考虑线性方程组,$Ax = b$,其中$A \in \mathbb{R}^{n \times n}$,$x,b\in \mathbb{R}$, 如果$A$是非奇异的(即可逆的),那么$x = A^{-1}b$。 (如果$A \in \mathbb{R}^{m \times n}$不是方阵,这公式还有用吗?) #### 3.8 正交阵 如果 $x^Ty=0$,则两个向量$x,y\in \mathbb{R}^{n}$ 是**正交**的。如果$\|x\|_2=1$,则向量$x\in \mathbb{R}^{n}$ 被归一化。如果一个方阵$U\in \mathbb{R}^{n \times n}$的所有列彼此正交并被归一化(这些列然后被称为正交),则方阵$U$是正交阵(注意在讨论向量时的意义不一样)。 它可以从正交性和正态性的定义中得出: $$ U^ TU = I = U U^T $$ 换句话说,正交矩阵的逆是其转置。 注意,如果$U$不是方阵 :即,$U\in \mathbb{R}^{m \times n}$,$n 0$,对称阵$A \in \mathbb{S}^n$为**正定**(**positive definite,PD**)。这通常表示为$A\succ0$(或$A>0$),并且通常将所有正定矩阵的集合表示为$\mathbb{S}_{++}^n$。 - 对于所有向量$x^TAx\geq 0$,对称矩阵$A \in \mathbb{S}^n$是**半正定**(**positive semidefinite ,PSD**)。 这写为(或$A \succeq 0$仅$A≥0$),并且所有半正定矩阵的集合通常表示为$\mathbb{S}_+^n$。 - 同样,对称矩阵$A \in \mathbb{S}^n$是**负定**(**negative definite,ND**),如果对于所有非零$x \in \mathbb{R}^n$,则$x^TAx <0$表示为$A\prec0$(或$A <0$)。 - 类似地,对称矩阵$A \in \mathbb{S}^n$是**半负定**(**negative semidefinite,NSD**),如果对于所有$x \in \mathbb{R}^n$,则$x^TAx \leq 0$表示为$A\preceq 0$(或$A≤0$)。 - 最后,对称矩阵$A \in \mathbb{S}^n$是**不定**的,如果它既不是正半定也不是负半定,即,如果存在$x_1,x_2 \in \mathbb{R}^n$,那么$x_1^TAx_1>0$且$x_2^TAx_2<0$。 很明显,如果$A$是正定的,那么$−A$是负定的,反之亦然。同样,如果$A$是半正定的,那么$−A$是是半负定的,反之亦然。如果果$A$是不定的,那么$−A$是也是不定的。 正定矩阵和负定矩阵的一个重要性质是它们总是满秩,因此是可逆的。为了了解这是为什么,假设某个矩阵$A \in \mathbb{S}^n$不是满秩。然后,假设$A$的第$j$列可以表示为其他$n-1$列的线性组合: $$ a_{j}=\sum_{i \neq j} x_{i} a_{i} $$ 对于某些$x_1,\cdots x_{j-1},x_{j + 1} ,\cdots ,x_n\in \mathbb{R}$。设$x_j = -1$,则: $$ Ax=\sum_{i \neq j} x_{i} a_{i}=0 $$ 但这意味着对于某些非零向量$x$,$x^T Ax = 0$,因此$A$必须既不是正定也不是负定。如果$A$是正定或负定,则必须是满秩。 最后,有一种类型的正定矩阵经常出现,因此值得特别提及。 给定矩阵$A \in \mathbb{R}^{m \times n}$(不一定是对称或偶数平方),矩阵$G = A^T A$(有时称为**Gram矩阵**)总是半正定的。 此外,如果$m\geq n$(同时为了方便起见,我们假设$A$是满秩),则$G = A^T A$是正定的。 #### 3.12 特征值和特征向量 给定一个方阵$A \in\mathbb{R}^{n\times n}$,我们认为在以下条件下,$\lambda \in\mathbb{C}$是$A$的**特征值**,$x\in\mathbb{C}^n$是相应的**特征向量**: $$ Ax=\lambda x,x \ne 0 $$ 直观地说,这个定义意味着将$A$乘以向量$x$会得到一个新的向量,该向量指向与$x$相同的方向,但按系数$\lambda$缩放。值得注意的是,对于任何特征向量$x\in\mathbb{C}^n$和标量$t\in\mathbb{C}$,$A(cx)=cAx=c\lambda x=\lambda(cx)$,$cx$也是一个特征向量。因此,当我们讨论与$\lambda$相关的**特征向量**时,我们通常假设特征向量被标准化为长度为1(这仍然会造成一些歧义,因为$x$和$−x$都是特征向量,但我们必须接受这一点)。 我们可以重写上面的等式来说明$(\lambda,x)$是$A$的特征值和特征向量的组合: $$ (\lambda I-A)x=0,x \ne 0 $$ 但是$(\lambda I-A)x=0$只有当$(\lambda I-A)$有一个非空零空间时,同时$(\lambda I-A)$是奇异的,$x$才具有非零解,即: $$ |(\lambda I-A)|=0 $$ 现在,我们可以使用行列式的先前定义将表达式$|(\lambda I-A)|$扩展为$\lambda$中的(非常大的)多项式,其中,$\lambda$的度为$n$。它通常被称为矩阵$A$的特征多项式。 然后我们找到这个特征多项式的$n$(可能是复数)根,并用$\lambda_1,\cdots,\lambda_n$表示。这些都是矩阵$A$的特征值,但我们注意到它们可能不明显。为了找到特征值$\lambda_i$对应的特征向量,我们只需解线性方程$(\lambda I-A)x=0$,因为$(\lambda I-A)$是奇异的,所以保证有一个非零解(但也可能有多个或无穷多个解)。 应该注意的是,这不是实际用于数值计算特征值和特征向量的方法(记住行列式的完全展开式有$n!$项),这是一个数学上的争议。 以下是特征值和特征向量的属性(所有假设在$A \in\mathbb{R}^{n\times n}$具有特征值$\lambda_1,\cdots,\lambda_n$的前提下): - $A$的迹等于其特征值之和 $$ \operatorname{tr} A=\sum_{i=1}^{n} \lambda_{i} $$ - $A$的行列式等于其特征值的乘积 $$ |A|=\prod_{i=1}^{n} \lambda_{i} $$ - $A$的秩等于$A$的非零特征值的个数 - 假设$A$非奇异,其特征值为$\lambda$和特征向量为$x$。那么$1/\lambda$是具有相关特征向量$x$的$A^{-1}$的特征值,即$A^{-1}x=(1/\lambda)x$。(要证明这一点,取特征向量方程,$Ax=\lambda x$,两边都左乘$A^{-1}$) - 对角阵的特征值$d=diag(d_1,\cdots,d_n)$实际上就是对角元素$d_1,\cdots,d_n$ #### 3.13 对称矩阵的特征值和特征向量 通常情况下,一般的方阵的特征值和特征向量的结构可以很细微地表示出来。 值得庆幸的是,在机器学习的大多数场景下,处理对称实矩阵就足够了,其处理的对称实矩阵的特征值和特征向量具有显着的特性。 在本节中,我们假设$A$是实对称矩阵, 具有以下属性: 1. $A$的所有特征值都是实数。 我们用用$\lambda_1,\cdots,\lambda_n$表示。 2. 存在一组特征向量$u_1,\cdots u_n$,对于所有$i$,$u_i$是具有特征值$\lambda_{i}$和$b$的特征向量。$u_1,\cdots u_n$是单位向量并且彼此正交。 设$U$是包含$u_i$作为列的正交矩阵: $$ U=\left[\begin{array}{cccc}{ |} & { |} & {} & { |} \\ {u_{1}} & {u_{2}} & {\cdots} & {u_{n}} \\ { |} & { |} & {} & { |}\end{array}\right] $$ 设$\Lambda= diag(\lambda_1,\cdots,\lambda_n)$是包含$\lambda_1,\cdots,\lambda_n$作为对角线上的元素的对角矩阵。 使用2.3节的方程(2)中的矩阵 - 矩阵向量乘法的方法,我们可以验证: $$ A U=\left[\begin{array}{cccc}{ |} & { |} & {} & { |} \\ {A u_{1}} & {A u_{2}} & {\cdots} & {A u_{n}} \\ { |} & { |} & {} & { |}\end{array}\right]=\left[\begin{array}{ccc}{ |} & { |} & { |} & { |}\\ {\lambda_{1} u_{1}} & {\lambda_{2} u_{2}} & {\cdots} & {\lambda_{n} u_{n}} \\ { |} & { |} & {|} & { |}\end{array}\right]=U \operatorname{diag}\left(\lambda_{1}, \ldots, \lambda_{n}\right)=U \Lambda $$ 考虑到正交矩阵$U$满足$UU^T=I$,利用上面的方程,我们得到: $$ A=AUU^T=U\Lambda U^T $$ 这种$A$的新的表示形式为$U\Lambda U^T$,通常称为矩阵$A$的对角化。术语对角化是这样来的:通过这种表示,我们通常可以有效地将对称矩阵$A$视为对角矩阵 , 这更容易理解。关于由特征向量$U$定义的基础, 我们将通过几个例子详细说明。 **背景知识**:代表另一个基的向量。 任何正交矩阵$U=\left[\begin{array}{cccc}{ |} & { |} & {} & { |} \\ {u_{1}} & {u_{2}} & {\cdots} & {u_{n}} \\ { |} & { |} & {} & { |}\end{array}\right]$定义了一个新的属于$\mathbb {R}^{n}$的基(坐标系),意义如下:对于任何向量$x \in\mathbb{R}^{n}$都可以表示为$u_1,\cdots u_n$的线性组合,其系数为$x_1,\cdots x_n$: $$ x=\hat x_1u_1+\cdots +\cdots \hat x_nu_n=U\hat x $$ 在第二个等式中,我们使用矩阵和向量相乘的方法。 实际上,这种$\hat x$是唯一存在的: $$ x=U \hat{x} \Leftrightarrow U^{T} x=\hat{x} $$ 换句话说,向量$\hat x=U^Tx$可以作为向量$x$的另一种表示,与$U$定义的基有关。 **“对角化”矩阵向量乘法**。 通过上面的设置,我们将看到左乘矩阵$A$可以被视为左乘以对角矩阵关于特征向量的基。 假设$x$是一个向量,$\hat x$表示$U$的基。设$z=Ax$为矩阵向量积。现在让我们计算关于$U$的基$z$: 然后,再利用$UU^T=U^T=I$和方程$A=AUU^T=U\Lambda U^T$,我们得到: $$ \hat{z}=U^{T} z=U^{T} A x=U^{T} U \Lambda U^{T} x=\Lambda \hat{x}=\left[\begin{array}{c}{\lambda_{1} \hat{x}_{1}} \\ {\lambda_{2} \hat{x}_{2}} \\ {\vdots} \\ {\lambda_{n} \hat{x}_{n}}\end{array}\right] $$ 我们可以看到,原始空间中的左乘矩阵$A$等于左乘对角矩阵$\Lambda$相对于新的基,即仅将每个坐标缩放相应的特征值。 在新的基上,矩阵多次相乘也变得简单多了。例如,假设$q=AAAx$。根据$A$的元素导出$q$的分析形式,使用原始的基可能是一场噩梦,但使用新的基就容易多了: $$ \hat{q}=U^{T} q=U^{T} AAA x=U^{T} U \Lambda U^{T} U \Lambda U^{T} U \Lambda U^{T} x=\Lambda^{3} \hat{x}=\left[\begin{array}{c}{\lambda_{1}^{3} \hat{x}_{1}} \\ {\lambda_{2}^{3} \hat{x}_{2}} \\ {\vdots} \\ {\lambda_{n}^{3} \hat{x}_{n}}\end{array}\right] $$ **“对角化”二次型**。作为直接的推论,二次型$x^TAx$也可以在新的基上简化。 $$ x^{T} A x=x^{T} U \Lambda U^{T} x=\hat{x} \Lambda \hat{x}=\sum_{i=1}^{n} \lambda_{i} \hat{x}_{i}^{2} $$ (回想一下,在旧的表示法中,$x^{T} A x=\sum_{i=1, j=1}^{n} x_{i} x_{j} A_{i j}$涉及一个$n^2$项的和,而不是上面等式中的$n$项。)利用这个观点,我们还可以证明矩阵$A$的正定性完全取决于其特征值的符号: 1. 如果所有的$\lambda_i>0$,则矩阵$A$正定的,因为对于任意的$\hat x \ne 0$,$x^{T} A x=\sum_{i=1}^{n} \lambda_{i} \hat{x}_{i}^{2}>0$ 2. 如果所有的$\lambda_i\geq 0$,则矩阵$A$是为正半定,因为对于任意的$\hat x $,$x^{T} A x=\sum_{i=1}^{n} \lambda_{i} \hat{x}_{i}^{2} \geq 0$ 3. 同样,如果所有$\lambda_i<0$或$\lambda_i\leq 0$,则矩阵$A$分别为负定或半负定。 4. 最后,如果$A$同时具有正特征值和负特征值,比如λ$\lambda_i>0$和$\lambda_j<0$,那么它是不定的。这是因为如果我们让$\hat x$满足$\hat x_i=1$和$\hat x_k=0$,同时所有的$k\ne i$,那么$x^{T} A x=\sum_{i=1}^{n} \lambda_{i} \hat{x}_{i}^{2}>0$ ,我们让$\hat x$满足$\hat x_i=1$和$\hat x_k=0$,同时所有的$k\ne i$,那么$x^{T} A x=\sum_{i=1}^{n} \lambda_{i} \hat{x}_{i}^{2}<0$ 特征值和特征向量经常出现的应用是最大化矩阵的某些函数。特别是对于矩阵$A \in \mathbb{S}^{n}$,考虑以下最大化问题: $$ \max _{x \in \mathbb{R}^{n}} \ x^{T} A x=\sum_{i=1}^{n} \lambda_{i} \hat{x}_{i}^{2} \quad \text { subject to }\|x\|_{2}^{2}=1 $$ 也就是说,我们要找到(范数1)的向量,它使二次型最大化。假设特征值的阶数为$\lambda_1 \geq \lambda _2 \geq \cdots \lambda_n$,此优化问题的最优值为$\lambda_1$,且与$\lambda_1$对应的任何特征向量$u_1$都是最大值之一。(如果$\lambda_1 > \lambda_2$,那么有一个与特征值$\lambda_1$对应的唯一特征向量,它是上面那个优化问题的唯一最大值。) 我们可以通过使用对角化技术来证明这一点:注意,通过公式$\|U x\|_{2}=\|x\|_{2}$推出$\|x\|_{2}=\|\hat{x}\|_{2}$,并利用公式: $x^{T} A x=x^{T} U \Lambda U^{T} x=\hat{x} \Lambda \hat{x}=\sum_{i=1}^{n} \lambda_{i} \hat{x}_{i}^{2}$,我们可以将上面那个优化问题改写为: $$ \max _{\hat{x} \in \mathbb{R}^{n}}\ \hat{x}^{T} \Lambda \hat{x}=\sum_{i=1}^{n} \lambda_{i} \hat{x}_{i}^{2} \quad \text { subject to }\|\hat{x}\|_{2}^{2}=1 $$ 然后,我们得到目标的上界为$\lambda_1$: $$ \hat{x}^{T} \Lambda \hat{x}=\sum_{i=1}^{n} \lambda_{i} \hat{x}_{i}^{2} \leq \sum_{i=1}^{n} \lambda_{1} \hat{x}_{i}^{2}=\lambda_{1} $$ 此外,设置$\hat{x}=\left[\begin{array}{c}{1} \\ {0} \\ {\vdots} \\ {0}\end{array}\right]$可让上述等式成立,这与设置$x=u_1$相对应。 ### 4.矩阵微积分 虽然前面章节中的主题通常包含在线性代数的标准课程中,但似乎很少涉及(我们将广泛使用)的一个主题是微积分扩展到向量设置展。尽管我们使用的所有实际微积分都是相对微不足道的,但是符号通常会使事情看起来比实际困难得多。 在本节中,我们将介绍矩阵微积分的一些基本定义,并提供一些示例。 #### 4.1 梯度 假设$f: \mathbb{R}^{m \times n} \rightarrow \mathbb{R}$是将维度为$m \times n$的矩阵$A\in \mathbb{R}^{m \times n}$作为输入并返回实数值的函数。 然后$f$的梯度(相对于$A\in \mathbb{R}^{m \times n}$)是偏导数矩阵,定义如下: $$ \nabla_{A} f(A) \in \mathbb{R}^{m \times n}=\left[\begin{array}{cccc}{\frac{\partial f(A)}{\partial A_{11}}} & {\frac{\partial f(A)}{\partial A_{12}}} & {\cdots} & {\frac{\partial f(A)}{\partial A_{1n}}} \\ {\frac{\partial f(A)}{\partial A_{21}}} & {\frac{\partial f(A)}{\partial A_{22}}} & {\cdots} & {\frac{\partial f(A)}{\partial A_{2 n}}} \\ {\vdots} & {\vdots} & {\ddots} & {\vdots} \\ {\frac{\partial f(A)}{\partial A_{m 1}}} & {\frac{\partial f(A)}{\partial A_{m 2}}} & {\cdots} & {\frac{\partial f(A)}{\partial A_{m n}}}\end{array}\right] $$ 即,$m \times n$矩阵: $$ \left(\nabla_{A} f(A)\right)_{i j}=\frac{\partial f(A)}{\partial A_{i j}} $$ 请注意,$\nabla_{A} f(A) $的维度始终与$A$的维度相同。特殊情况,如果$A$只是向量$A\in \mathbb{R}^{n}$,则 $$ \nabla_{x} f(x)=\left[\begin{array}{c}{\frac{\partial f(x)}{\partial x_{1}}} \\ {\frac{\partial f(x)}{\partial x_{2}}} \\ {\vdots} \\ {\frac{\partial f(x)}{\partial x_{n}}}\end{array}\right] $$ 重要的是要记住,只有当函数是实值时,即如果函数返回标量值,才定义函数的梯度。例如,$A\in \mathbb{R}^{m \times n}$相对于$x$,我们不能取$Ax$的梯度,因为这个量是向量值。 它直接从偏导数的等价性质得出: - $\nabla_{x}(f(x)+g(x))=\nabla_{x} f(x)+\nabla_{x} g(x)$ - 对于$t \in \mathbb{R}$ ,$\nabla_{x}(t f(x))=t \nabla_{x} f(x)$ 原则上,梯度是偏导数对多变量函数的自然延伸。然而,在实践中,由于符号的原因,使用梯度有时是很困难的。例如,假设$A\in \mathbb{R}^{m \times n}$是一个固定系数矩阵,假设$b\in \mathbb{R}^{m}$是一个固定系数向量。设$f: \mathbb{R}^{m \times n} \rightarrow \mathbb{R}$为$f(z)=z^Tz$定义的函数,因此$\nabla_{z}f(z)=2z$。但现在考虑表达式, $$ \nabla f(Ax) $$ 该表达式应该如何解释? 至少有两种可能性: 1.在第一个解释中,回想起$\nabla_{z}f(z)=2z$。 在这里,我们将$\nabla f(Ax)$解释为评估点$Ax$处的梯度,因此: $$ \nabla f(A x)=2(A x)=2 A x \in \mathbb{R}^{m} $$ 2.在第二种解释中,我们将数量$f(Ax)$视为输入变量$x$的函数。 更正式地说,设$g(x) =f(Ax)$。 然后在这个解释中: $$ \nabla f(A x)=\nabla_{x} g(x) \in \mathbb{R}^{n} $$ 在这里,我们可以看到这两种解释确实不同。 一种解释产生$m$维向量作为结果,而另一种解释产生$n$维向量作为结果! 我们怎么解决这个问题? 这里,关键是要明确我们要区分的变量。 在第一种情况下,我们将函数$f$与其参数$z$进行区分,然后替换参数$Ax$。 在第二种情况下,我们将复合函数$g(x)=f(Ax)$直接与$x$进行微分。 我们将第一种情况表示为$\nabla zf(Ax)$,第二种情况表示为$\nabla xf(Ax)$。 保持符号清晰是非常重要的,以后完成课程作业时候你就会发现。 #### 4.2 黑塞矩阵 假设$f: \mathbb{R}^{n} \rightarrow \mathbb{R}$是一个函数,它接受$\mathbb{R}^{n}$中的向量并返回实数。那么关于$x$的**黑塞矩阵**(也有翻译作海森矩阵),写做:$\nabla_x ^2 f(A x)$,或者简单地说,$H$是$n \times n$矩阵的偏导数: $$ \nabla_{x}^{2} f(x) \in \mathbb{R}^{n \times n}=\left[\begin{array}{cccc}{\frac{\partial^{2} f(x)}{\partial x_{1}^{2}}} & {\frac{\partial^{2} f(x)}{\partial x_{1} \partial x_{2}}} & {\cdots} & {\frac{\partial^{2} f(x)}{\partial x_{1} \partial x_{n}}} \\ {\frac{\partial^{2} f(x)}{\partial x_{2} \partial x_{1}}} & {\frac{\partial^{2} f(x)}{\partial x_{2}^{2}}} & {\cdots} & {\frac{\partial^{2} f(x)}{\partial x_{2} \partial x_{n}}} \\ {\vdots} & {\vdots} & {\ddots} & {\vdots} \\ {\frac{\partial^{2} f(x)}{\partial x_{n} \partial x_{1}}} & {\frac{\partial^{2} f(x)}{\partial x_{n} \partial x_{2}}} & {\cdots} & {\frac{\partial^{2} f(x)}{\partial x_{n}^{2}}}\end{array}\right] $$ 换句话说,$\nabla_{x}^{2} f(x) \in \mathbb{R}^{n \times n}$,其: $$ \left(\nabla_{x}^{2} f(x)\right)_{i j}=\frac{\partial^{2} f(x)}{\partial x_{i} \partial x_{j}} $$ 注意:黑塞矩阵通常是对称阵: $$ \frac{\partial^{2} f(x)}{\partial x_{i} \partial x_{j}}=\frac{\partial^{2} f(x)}{\partial x_{j} \partial x_{i}} $$ 与梯度相似,只有当$f(x)$为实值时才定义黑塞矩阵。 很自然地认为梯度与向量函数的一阶导数的相似,而黑塞矩阵与二阶导数的相似(我们使用的符号也暗示了这种关系)。 这种直觉通常是正确的,但需要记住以下几个注意事项。 首先,对于一个变量$f: \mathbb{R} \rightarrow \mathbb{R}$的实值函数,它的基本定义:二阶导数是一阶导数的导数,即: $$ \frac{\partial^{2} f(x)}{\partial x^{2}}=\frac{\partial}{\partial x} \frac{\partial}{\partial x} f(x) $$ 然而,对于向量的函数,函数的梯度是一个向量,我们不能取向量的梯度,即: $$ \nabla_{x} \nabla_{x} f(x)=\nabla_{x}\left[\begin{array}{c}{\frac{\partial f(x)}{\partial x_{1}}} \\ {\frac{\partial f(x)}{\partial x_{2}}} \\ {\vdots} \\ {\frac{\partial f(x)}{\partial x_{n}}}\end{array}\right] $$ 上面这个表达式没有意义。 因此,黑塞矩阵不是梯度的梯度。 然而,下面这种情况却这几乎是正确的:如果我们看一下梯度$\left(\nabla_{x} f(x)\right)_{i}=\partial f(x) / \partial x_{i}$的第$i$个元素,并取关于于$x$的梯度我们得到: $$ \nabla_{x} \frac{\partial f(x)}{\partial x_{i}}=\left[\begin{array}{c}{\frac{\partial^{2} f(x)}{\partial x_{i} \partial x_{1}}} \\ {\frac{\partial^{2} f(x)}{\partial x_{2} \partial x_{2}}} \\ {\vdots} \\ {\frac{\partial f(x)}{\partial x_{i} \partial x_{n}}}\end{array}\right] $$ 这是黑塞矩阵第$i$行(列),所以: $$ \nabla_{x}^{2} f(x)=\left[\nabla_{x}\left(\nabla_{x} f(x)\right)_{1} \quad \nabla_{x}\left(\nabla_{x} f(x)\right)_{2} \quad \cdots \quad \nabla_{x}\left(\nabla_{x} f(x)\right)_{n}\right] $$ 简单地说:我们可以说由于:$\nabla_{x}^{2} f(x)=\nabla_{x}\left(\nabla_{x} f(x)\right)^{T}$,只要我们理解,这实际上是取$\nabla_{x} f(x)$的每个元素的梯度,而不是整个向量的梯度。 最后,请注意,虽然我们可以对矩阵$A\in \mathbb{R}^{n}$取梯度,但对于这门课,我们只考虑对向量$x \in \mathbb{R}^{n}$取黑塞矩阵。 这会方便很多(事实上,我们所做的任何计算都不要求我们找到关于矩阵的黑森方程),因为关于矩阵的黑塞方程就必须对矩阵所有元素求偏导数$\partial^{2} f(A) /\left(\partial A_{i j} \partial A_{k \ell}\right)$,将其表示为矩阵相当麻烦。 #### 4.3 二次函数和线性函数的梯度和黑塞矩阵 现在让我们尝试确定几个简单函数的梯度和黑塞矩阵。 应该注意的是,这里给出的所有梯度都是**CS229**讲义中给出的梯度的特殊情况。 对于$x \in \mathbb{R}^{n}$, 设$f(x)=b^Tx$ 的某些已知向量$b \in \mathbb{R}^{n}$ ,则: $$ f(x)=\sum_{i=1}^{n} b_{i} x_{i} $$ 所以: $$ \frac{\partial f(x)}{\partial x_{k}}=\frac{\partial}{\partial x_{k}} \sum_{i=1}^{n} b_{i} x_{i}=b_{k} $$ 由此我们可以很容易地看出$\nabla_{x} b^{T} x=b$。 这应该与单变量微积分中的类似情况进行比较,其中$\partial /(\partial x) a x=a$。 现在考虑$A\in \mathbb{S}^{n}$的二次函数$f(x)=x^TAx$。 记住这一点: $$ f(x)=\sum_{i=1}^{n} \sum_{j=1}^{n} A_{i j} x_{i} x_{j} $$ 为了取偏导数,我们将分别考虑包括$x_k$和$x_2^k$因子的项: $$ \begin{aligned} \frac{\partial f(x)}{\partial x_{k}} &=\frac{\partial}{\partial x_{k}} \sum_{i=1}^{n} \sum_{j=1}^{n} A_{i j} x_{i} x_{j} \\ &=\frac{\partial}{\partial x_{k}}\left[\sum_{i \neq k} \sum_{j \neq k} A_{i j} x_{i} x_{j}+\sum_{i \neq k} A_{i k} x_{i} x_{k}+\sum_{j \neq k} A_{k j} x_{k} x_{j}+A_{k k} x_{k}^{2}\right] \\ &=\sum_{i \neq k} A_{i k} x_{i}+\sum_{j \neq k} A_{k j} x_{j}+2 A_{k k} x_{k} \\ &=\sum_{i=1}^{n} A_{i k} x_{i}+\sum_{j=1}^{n} A_{k j} x_{j}=2 \sum_{i=1}^{n} A_{k i} x_{i} \end{aligned} $$ 最后一个等式,是因为$A$是对称的(我们可以安全地假设,因为它以二次形式出现)。 注意,$\nabla_{x} f(x)$的第$k$个元素是$A$和$x$的第$k$行的内积。 因此,$\nabla_{x} x^{T} A x=2 A x$。 同样,这应该提醒你单变量微积分中的类似事实,即$\partial /(\partial x) a x^{2}=2 a x$。 最后,让我们来看看二次函数$f(x)=x^TAx$黑塞矩阵(显然,线性函数$b^Tx$的黑塞矩阵为零)。在这种情况下: $$ \frac{\partial^{2} f(x)}{\partial x_{k} \partial x_{\ell}}=\frac{\partial}{\partial x_{k}}\left[\frac{\partial f(x)}{\partial x_{\ell}}\right]=\frac{\partial}{\partial x_{k}}\left[2 \sum_{i=1}^{n} A_{\ell i} x_{i}\right]=2 A_{\ell k}=2 A_{k \ell} $$ 因此,应该很清楚$\nabla_{x}^2 x^{T} A x=2 A$,这应该是完全可以理解的(同样类似于$\partial^2 /(\partial x^2) a x^{2}=2a$的单变量事实)。 简要概括起来: - $\nabla_{x} b^{T} x=b$ - $\nabla_{x} x^{T} A x=2 A x$ (如果$A$是对称阵) - $\nabla_{x}^2 x^{T} A x=2 A $ (如果$A$是对称阵) #### 4.4 最小二乘法 让我们应用上一节中得到的方程来推导最小二乘方程。假设我们得到矩阵$A\in \mathbb{R}^{m \times n}$(为了简单起见,我们假设$A$是满秩)和向量$b\in \mathbb{R}^{m}$,从而使$b \notin \mathcal{R}(A)$。在这种情况下,我们将无法找到向量$x\in \mathbb{R}^{n}$,由于$Ax = b$,因此我们想要找到一个向量$x$,使得$Ax$尽可能接近 $b$,用欧几里德范数的平方$\|A x-b\|_{2}^{2} $来衡量。 使用公式$\|x\|^{2}=x^Tx$,我们可以得到: $$ \begin{aligned}\|A x-b\|_{2}^{2} &=(A x-b)^{T}(A x-b) \\ &=x^{T} A^{T} A x-2 b^{T} A x+b^{T} b \end{aligned} $$ 根据$x$的梯度,并利用上一节中推导的性质: $$ \begin{aligned} \nabla_{x}\left(x^{T} A^{T} A x-2 b^{T} A x+b^{T} b\right) &=\nabla_{x} x^{T} A^{T} A x-\nabla_{x} 2 b^{T} A x+\nabla_{x} b^{T} b \\ &=2 A^{T} A x-2 A^{T} b \end{aligned} $$ 将最后一个表达式设置为零,然后解出$x$,得到了正规方程: $$ x = (A^TA)^{-1}A^Tb $$ 这和我们在课堂上得到的相同。 #### 4.5 行列式的梯度 现在让我们考虑一种情况,我们找到一个函数相对于矩阵的梯度,也就是说,对于$A\in \mathbb{R}^{n \times n}$,我们要找到$\nabla_{A}|A|$。回想一下我们对行列式的讨论: $$ |A|=\sum_{i=1}^{n}(-1)^{i+j} A_{i j}\left|A_{\backslash i, \backslash j}\right| \quad(\text { for any } j \in 1, \ldots, n) $$ 所以: $$ \frac{\partial}{\partial A_{k \ell}}|A|=\frac{\partial}{\partial A_{k \ell}} \sum_{i=1}^{n}(-1)^{i+j} A_{i j}\left|A_{\backslash i, \backslash j}\right|=(-1)^{k+\ell}\left|A_{\backslash k,\backslash \ell}\right|=(\operatorname{adj}(A))_{\ell k} $$ 从这里可以知道,它直接从伴随矩阵的性质得出: $$ \nabla_{A}|A|=(\operatorname{adj}(A))^{T}=|A| A^{-T} $$ 现在我们来考虑函数$f : \mathbb{S}_{++}^{n} \rightarrow \mathbb{R}$,$f(A)=\log |A|$。注意,我们必须将$f$的域限制为正定矩阵,因为这确保了$|A|>0$,因此$|A|$的对数是实数。在这种情况下,我们可以使用链式法则(没什么奇怪的,只是单变量演算中的普通链式法则)来看看: $$ \frac{\partial \log |A|}{\partial A_{i j}}=\frac{\partial \log |A|}{\partial|A|} \frac{\partial|A|}{\partial A_{i j}}=\frac{1}{|A|} \frac{\partial|A|}{\partial A_{i j}} $$ 从这一点可以明显看出: $$ \nabla_{A} \log |A|=\frac{1}{|A|} \nabla_{A}|A|=A^{-1} $$ 我们可以在最后一个表达式中删除转置,因为$A$是对称的。注意与单值情况的相似性,其中$\partial /(\partial x) \log x=1 / x$。 #### 4.6 特征值优化 最后,我们使用矩阵演算以直接导致特征值/特征向量分析的方式求解优化问题。 考虑以下等式约束优化问题: $$ \max _{x \in \mathbb{R}^{n}} x^{T} A x \quad \text { subject to }\|x\|_{2}^{2}=1 $$ 对于对称矩阵$A\in \mathbb{S}^{n}$。求解等式约束优化问题的标准方法是采用**拉格朗日**形式,一种包含等式约束的目标函数,在这种情况下,拉格朗日函数可由以下公式给出: $$ \mathcal{L}(x, \lambda)=x^{T} A x-\lambda x^{T} x $$ 其中,$\lambda $被称为与等式约束关联的拉格朗日乘子。可以确定,要使$x^*$成为问题的最佳点,拉格朗日的梯度必须在$x^*$处为零(这不是唯一的条件,但它是必需的)。也就是说, $$ \nabla_{x} \mathcal{L}(x, \lambda)=\nabla_{x}\left(x^{T} A x-\lambda x^{T} x\right)=2 A^{T} x-2 \lambda x=0 $$ 请注意,这只是线性方程$Ax =\lambda x$。 这表明假设$x^T x = 1$,可能最大化(或最小化)$x^T Ax$的唯一点是$A$的特征向量。 **线性代数和概率论都已经翻译完毕,请关注[github](https://github.com/fengdu78/Data-Science-Notes/tree/master/0.math)的更新,若有修改将在github上更新** 欢迎大家提交PR,对语言进行润色。 翻译:[黄海广](https://github.com/fengdu78) ================================================ FILE: 0.math/1.CS229/markdown/2.CS229-Prob.md ================================================ > 本文是斯坦福大学CS229机器学习课程的基础材料,[原始文件下载](http://cs229.stanford.edu/summer2019/cs229-prob.pdf) > 原文作者:Arian Maleki , Tom Do > > 翻译:[石振宇](https://github.com/szy2120109) > > 审核和修改制作:[黄海广](https://github.com/fengdu78) > > 备注:请关注[github](https://github.com/fengdu78/Data-Science-Notes/tree/master/0.math)的更新。 # CS229 机器学习课程复习材料-概率论 [TOC] ## 概率论复习和参考 概率论是对不确定性的研究。通过这门课,我们将依靠概率论中的概念来推导机器学习算法。这篇笔记试图涵盖适用于**CS229**的概率论基础。概率论的数学理论非常复杂,并且涉及到“分析”的一个分支:测度论。在这篇笔记中,我们提供了概率的一些基本处理方法,但是不会涉及到这些更复杂的细节。 ### 1. 概率的基本要素 为了定义集合上的概率,我们需要一些基本元素, - 样本空间$\Omega $:随机实验的所有结果的集合。在这里,每个结果 $w \in \Omega $ 可以被认为是实验结束时现实世界状态的完整描述。 - 事件集(事件空间)$\mathcal{F}$:元素 $A \in \mathcal{F}$ 的集合(称为事件)是 $\Omega $ 的子集(即每个 $A \subseteq \Omega$ 是一个实验可能结果的集合)。 备注:$\mathcal{F}$需要满足以下三个条件: (1) $\emptyset \in \mathcal{F}$ (2) $A \in \mathcal{F} \Longrightarrow \Omega \backslash A \in \mathcal{F}$ (3) $A_1,A_2,\cdots A_{i} \in \mathcal{F}\Longrightarrow\cup_{i} A_{i} \in \mathcal{F}$ - 概率度量$P$:函数$P$是一个$ \mathcal{F} \rightarrow \mathbb{R}$的映射,满足以下性质: - 对于每个 $A \in \mathcal{F}$,$P(A) \geq 0$, - $P(\Omega) = 1$ - 如果$A_1 ,A_2 ,\cdots$ 是互不相交的事件 (即 当$ i \neq j$时,$A_{i} \cap A_{j}=\emptyset$ ), 那么: $$ P\left(\cup_{i} A_{i}\right)=\sum_{i} P\left(A_{i}\right) $$ 以上三条性质被称为**概率公理**。 **举例**: 考虑投掷六面骰子的事件。样本空间为$\Omega= \{1,2,3,4,5,6\}$。最简单的事件空间是平凡事件空间$\mathcal{F} = \{\emptyset,\Omega\}$.另一个事件空间是$\Omega$的所有子集的集合。对于第一个事件空间,满足上述要求的唯一概率度量由$P(\emptyset) = 0$,$p(\Omega)= 1$给出。对于第二个事件空间,一个有效的概率度量是将事件空间中每个事件的概率分配为$i/6$,这里$i$ 是这个事件集合中元素的数量;例如$P(\{1,2,3,4\}) =4/6$,$P(\{1,2,3\}) =3/6$。 **性质:** - 如果$A \subseteq B$,则:$ P(A) \leq P(B)$ - $P(A \cap B) \leq min(P(A),P(B) )$ - (布尔不等式):$P(A \cup B) \leq P(A)+P(B)$ - $P(\Omega |A ) =1-P(A)$ - (全概率定律):如果$A_1,\cdots,A_k$是一些互不相交的事件并且它们的并集是$\Omega$,那么它们的概率之和是1 #### 1.1 条件概率和独立性 假设$B$是一个概率非0的事件,我们定义在给定$B$的条件下$A$ 的条件概率为: $$ P(A | B) \triangleq \frac{P(A \cap B)}{P(B)} $$ 换句话说,$P(A|B$)是度量已经观测到$B$事件发生的情况下$A$事件发生的概率,两个事件被称为独立事件当且仅当$P(A \cap B) = P(A)P(B)$(或等价地,$P(A|B) = P(A)$)。因此,独立性相当于是说观察到事件$B$对于事件$A$的概率没有任何影响。 ### 2. 随机变量 考虑一个实验,我们翻转10枚硬币,我们想知道正面硬币的数量。这里,样本空间$\Omega$的元素是长度为10的序列。例如,我们可能有$w_0 = \{H,H,T,H,T,H,H,T,T,T\}\in\Omega$。然而,在实践中,我们通常不关心获得任何特定正反序列的概率。相反,我们通常关心结果的实值函数,比如我们10次投掷中出现的正面数,或者最长的背面长度。在某些技术条件下,这些函数被称为**随机变量**。 更正式地说,随机变量$X$是一个的$\Omega \longrightarrow \mathbb{R}$函数。通常,我们将使用大写字母$X(\omega)$或更简单的$X$(其中隐含对随机结果$\omega$的依赖)来表示随机变量。我们将使用小写字母$x$来表示随机变量的值。 **举例:** 在我们上面的实验中,假设$X(\omega)$是在投掷序列$\omega$中出现的正面的数量。假设投掷的硬币只有10枚,那么$X(\omega)$只能取有限数量的值,因此它被称为**离散随机变量**。这里,与随机变量$X$相关联的集合取某个特定值$k$的概率为: $$ P(X=k) :=P(\{\omega : X(\omega) =k\}) $$ **举例:** 假设$X(\omega)$是一个随机变量,表示放射性粒子衰变所需的时间。在这种情况下,$X(\omega)$具有无限多的可能值,因此它被称为**连续随机变量**。我们将$X$在两个实常数$a$和$b$之间取值的概率(其中$a < b$)表示为: $$ P(a \leq X \leq b) :=P(\{\omega : a \leq X(\omega) \leq b\}) $$ #### 2.1 累积分布函数 为了指定处理随机变量时使用的概率度量,通常可以方便地指定替代函数(**CDF**、**PDF**和**PMF**),在本节和接下来的两节中,我们将依次描述这些类型的函数。 **累积分布函数(CDF)**是函数$F_{X} : \mathbb{R} \rightarrow[0,1]$,它将概率度量指定为: $$ F_{X}(x) \triangleq P(X \leq x) $$ 通过使用这个函数,我们可以计算任意事件发生的概率。图1显示了一个样本**CDF**函数。 ![](images/c89fd93c5d6dccce89762d57fcd66dac.png)
图1:一个累计分布函数(CDF)
**性质:** - $0 \leq F_{X}(x)\leq 1$ - $\lim _{x \rightarrow-\infty} F_{X}(x)=0$ - $\lim _{x \rightarrow\infty} F_{X}(x)=1$ - $x \leq y \Longrightarrow F_{X}(x)\leq F_{X}(y)$ #### 2.2 概率质量函数 当随机变量$X$取有限种可能值(即,$X$是离散随机变量)时,表示与随机变量相关联的概率度量的更简单的方法是直接指定随机变量可以假设的每个值的概率。特别地,概率质量函数(**PMF**)是函数 $p_{X} : \Omega \rightarrow \mathbb{R}$,这样: $$ p_{X}(x) \triangleq P(X=x) $$ 在离散随机变量的情况下,我们使用符号$Val(X)$表示随机变量$X$可能假设的一组可能值。例如,如果$X(\omega)$是一个随机变量,表示十次投掷硬币中的正面数,那么$Val(X) =\{0,1,2,...,10\}$。 **性质:** - $0 \leq p_{X}(x)\leq 1$ - $\sum_{x \in V \text { al }(X)} p_{X}(x)=1$ - $\sum_{x \in A} p_{X}(x)=P(X \in A)$ #### 2.3 概率密度函数 对于一些连续随机变量,累积分布函数$F_X (x)$处可微。在这些情况下,我们将**概率密度函数(PDF)**定义为累积分布函数的导数,即: $$ f_{X}(x) \triangleq \frac{d F_{X}(x)}{d x} $$ 请注意,连续随机变量的概率密度函数可能并不总是存在的(即,如果它不是处处可微)。 根据微分的性质,对于很小的$\Delta x$, $$ P(x \leq X \leq x+\Delta x) \approx f_{X}(x) \Delta x $$ **CDF**和**PDF(**当它们存在时!)都可用于计算不同事件的概率。但是应该强调的是,任意给定点的**概率密度函数(PDF)**的值不是该事件的概率,即$f _X (x) \not = P(X = x)$。例如,$f _X (x)$可以取大于1的值(但是$f _X (x)$在$\mathbb{R}$的任何子集上的积分最多为1)。 **性质:** - $f_X(x)\geq 0$ - $\int_{-\infty}^{\infty} f_{X}(x)=1$ - $\int_{x \in A} f_{X}(x) d x=P(X \in A)$ #### 2.4 期望 假设$X$是一个离散随机变量,其**PMF**为 $p_X (x)$,$g : \mathbb{R} \longrightarrow \mathbb{R}$是一个任意函数。在这种情况下,$g(X)$可以被视为随机变量,我们将$g(X)$的期望值定义为: $$ E[g(X)] \triangleq \sum_{x \in V a l(X)} g(x) p_{X}(x) $$ 如果$X$是一个连续的随机变量,其**PDF** 为$f _X (x)$,那么$g(X)$的期望值被定义为: $$ E[g(X)] \triangleq \int_{-\infty}^{\infty} g(x) f_{X}(x) d x $$ 直觉上,$g(X)$的期望值可以被认为是$g(x)$对于不同的$x$值可以取的值的“加权平均值”,其中权重由$p_X(x)$或$f_X(x)$给出。作为上述情况的特例,请注意,随机变量本身的期望值,是通过令$g(x) = x$得到的,这也被称为随机变量的平均值。 **性质:** - 对于任意常数 $a \in \mathbb{R}$,$E[a]=a$ - 对于任意常数 $a \in \mathbb{R}$,$E[af(X)]=aE[f(X)]$ - (线性期望):$E[f(X)+g(X)]=E[f(X)]+E[g(X)]$ - 对于一个离散随机变量$X$,$E[1\{X=k\}]=P(X=k)$ #### 2.5 方差 随机变量$X$的**方差**是随机变量$X$的分布围绕其平均值集中程度的度量。形式上,随机变量$X$的方差定义为: $$ \operatorname{Var}[X] \triangleq E\left[(X-E(X))^{2}\right] $$ 使用上一节中的性质,我们可以导出方差的替代表达式: $$ \begin{aligned} E\left[(X-E[X])^{2}\right] &=E\left[X^{2}-2 E[X] X+E[X]^{2}\right] \\ &=E\left[X^{2}\right]-2 E[X] E[X]+E[X]^{2} \\ &=E\left[X^{2}\right]-E[X]^{2} \end{aligned} $$ 其中第二个等式来自期望的线性,以及$E[X]$相对于外层期望实际上是常数的事实。 **性质:** - 对于任意常数 $a \in \mathbb{R}$,$Val[a]=0$ - 对于任意常数 $a \in \mathbb{R}$,$Var[af(X)]=a^2Var[f(X)]$ **举例:** 计算均匀随机变量$X$的平均值和方差,任意$x \in [0,1]$,其**PDF**为 $p_X(x)= 1$,其他地方为0。 $$ E[X]=\int_{-\infty}^{\infty} x f_{X}(x) d x=\int_{0}^{1} x d x=\frac{1}{2} $$ $$ E\left[X^{2}\right]=\int_{-\infty}^{\infty} x^{2} f_{X}(x) d x=\int_{0}^{1} x^{2} d x=\frac{1}{3} $$ $$ Var[X]=E[X^2]-E[X]^2=\frac{1}{3}-\frac{1}{4}=\frac{1}{12} $$ **举例:** 假设对于一些子集$A \subseteq \Omega$,有$g(x) = 1\{x \in A\}$,计算$E[g(X)]$? **离散情况:** $$ E[g(X)]=\sum_{x \in V a l(X)} 1\{x \in A\} P_{X}(x) d x=\sum_{x \in A} P_{X}(x) d x=P(x \in A) $$ **连续情况:** $$ E[g(X)]=\int_{-\infty}^{\infty} 1\{x \in A\} f_{X}(x) d x=\int_{x \in A} f_{X}(x) d x=P(x \in A) $$ #### 2.6 一些常见的随机变量 **离散随机变量** - 伯努利分布:硬币掷出正面的概率为$p$(其中:$0 \leq p \leq 1$),如果正面发生,则为1,否则为0。 $$ p(x)=\left\{\begin{array}{ll}{p} & {\text { if } p=1} \\ {1-p} & {\text { if } p=0}\end{array}\right. $$ - 二项式分布:掷出正面概率为$p$(其中:$0 \leq p \leq 1$)的硬币$n$次独立投掷中正面的数量。 $$ p(x)=\left(\begin{array}{l}{n} \\ {x}\end{array}\right) p^{x}(1-p)^{n-x} $$ - 几何分布:掷出正面概率为$p$(其中:$p >0$)的硬币第一次掷出正面所需要的次数。 - 泊松分布:用于模拟罕见事件频率的非负整数的概率分布(其中:$\lambda >0$)。 $$ p(x)=e^{-\lambda} \frac{\lambda^{x}}{x !} $$ **连续随机变量** - 均匀分布:在$a$和$b$之间每个点概率密度相等的分布(其中:$a0$)。 $$ f(x)=\left\{\begin{array}{ll}{\lambda e^{-\lambda x}} & {\text { if } x \geq 0} \\ {0} & {\text { otherwise }}\end{array}\right. $$ - 正态分布:又被称为高斯分布。 $$ f(x)=\frac{1}{\sqrt{2 \pi} \sigma} e^{-\frac{1}{2 \sigma^{2}}(x-\mu)^{2}} $$ 一些随机变量的概率密度函数和累积分布函数的形状如图2所示。 ![](images/b958c16cfdce9e6bd2b810b10d71416e.png)
图2:一些随机变量的概率密度函数(PDF)和累积分布函数(CDF)
下表总结了这些分布的一些特性: | 分布 | 概率密度函数(PDF)或者概率质量函数(**PMF**) | 均值 | 方差 | | :--------------------------------: | :----------------------------------------------------------: | :-----------------: | :-------------------: | | $Bernoulli(p)$(伯努利分布) | $\left\{\begin{array}{ll}{p} & {\text { if } x=1} \\ {1-p} & {\text { if } x=0}\end{array}\right.$ | $p$ | $p(1-p)$ | | $Binomial(n,p)$(二项式分布) | $\left(\begin{array}{l}{n} \\ {k}\end{array}\right) p^{k}(1-p)^{n-k}$ 其中:$0 \leq k \leq n$ | $np$ | $npq$ | | $Geometric(p)$(几何分布) | $p(1-p)^{k-1}$ 其中:$k=1,2,\cdots$ | $\frac{1}{p}$ | $\frac {1-p}{p^2}$ | | $Poisson(\lambda)$(泊松分布) | $e^{-\lambda} \lambda^{x} / x !$ 其中:$k=1,2,\cdots$ | $\lambda$ | $\lambda$ | | $Uniform(a,b)$(均匀分布) | $\frac{1}{b-a}$ 存在$x \in (a,b)$ | $\frac{a+b}{2}$ | $\frac{(b-a)^2}{12}$ | | $Gaussian(\mu,\sigma^2)$(高斯分布) | $\frac{1}{\sqrt{2 \pi} \sigma} e^{-\frac{1}{2 \sigma^{2}}(x-\mu)^{2}}$ | $\mu$ | $\sigma^2$ | | $Exponential(\lambda)$(指数分布) | $\lambda e^{-\lambda x}$ $x\geq0,\lambda>0$ | $\frac{1}{\lambda}$ | $\frac{1}{\lambda^2}$ | ### 3. 两个随机变量 到目前为止,我们已经考虑了单个随机变量。然而,在许多情况下,在随机实验中,我们可能有不止一个感兴趣的量。例如,在一个我们掷硬币十次的实验中,我们可能既关心$X(\omega) =$出现的正面数量,也关心$Y (\omega) =$连续最长出现正面的长度。在本节中,我们考虑两个随机变量的设置。 #### 3.1 联合分布和边缘分布 假设我们有两个随机变量,一个方法是分别考虑它们。如果我们这样做,我们只需要$F_X (x)$和$F_Y (y)$。但是如果我们想知道在随机实验的结果中,$X$和$Y$同时假设的值,我们需要一个更复杂的结构,称为$X$和$Y$的**联合累积分布函数**,定义如下: $$ F_{XY}(x,y)=P(X \leq x,Y \leq y) $$ 可以证明,通过了解联合累积分布函数,可以计算出任何涉及到$X$和$Y$的事件的概率。 联合**CDF**: $F_{XY }(x,y)$和每个变量的联合分布函数$F_X(x)$和$F_Y (y)$分别由下式关联: $$ F_{X}(x)=\lim _{y \rightarrow \infty} F_{X Y}(x, y) d y $$ $$ F_{Y}(y)=\lim _{y \rightarrow \infty} F_{X Y}(x, y) dx $$ 这里我们称$F_X(x)$和$F_Y (y)$为 $F_{XY }(x,y)$的**边缘累积概率分布函数**。 **性质:** - $0 \leq F_{XY }(x,y) \leq 1$ - $\lim _{x, y \rightarrow \infty} F_{X Y}(x, y)=1$ - $\lim _{x, y \rightarrow -\infty} F_{X Y}(x, y)=0$ - $F_{X}(x)=\lim _{y \rightarrow \infty} F_{X Y}(x, y)$ #### 3.2 联合概率和边缘概率质量函数 如果$X$和$Y$是离散随机变量,那么**联合概率质量函数** $p_{X Y} : \mathbb{R} \times \mathbb{R} \rightarrow [0,1]$由下式定义: $$ p_{X Y}(x,y)=P(X=x,Y=y) $$ 这里, 对于任意$x$,$y$,$0 \leq P_{XY} (x,y) \leq 1$, 并且 $\sum_{x \in V a l(X)} \sum_{y \in V a l(Y)} P_{X Y}(x, y)=1$ 两个变量上的**联合PMF**分别与每个变量的概率质量函数有什么关系?事实上: $$ p_{X}(x)=\sum_{y} p_{X Y}(x, y) $$ 对于$p_Y (y)$类似。在这种情况下,我们称$p_X(x)$为$X$的边际概率质量函数。在统计学中,将一个变量相加形成另一个变量的边缘分布的过程通常称为“边缘化”。 #### 3.3 联合概率和边缘概率密度函数 假设$X$和$Y$是两个连续的随机变量,具有联合分布函数$F_{XY}$。在$F_{XY}(x,y)$在$x$和$y$中处处可微的情况下,我们可以定义**联合概率密度函数**: $$ f_{X Y}(x, y)=\frac{\partial^{2} F_{X Y}(x, y)}{\partial x \partial y} $$ 如同在一维情况下,$f_{XY}(x,y)\not= P(X = x,Y = y)$,而是: $$ \iint_{x \in A} f_{X Y}(x, y) d x d y=P((X, Y) \in A) $$ 请注意,概率密度函数$f_{XY}(x,y)$的值总是非负的,但它们可能大于1。尽管如此,可以肯定的是 $\int_{-\infty}^{\infty} \int_{-\infty}^{\infty} f_{X Y}(x, y)=1$ 与离散情况相似,我们定义: $$ f_{X}(x)=\int_{-\infty}^{\infty} f_{X Y}(x, y) d y $$ 作为$X$的**边际概率密度函数**(或**边际密度**),对于$f_Y (y)$也类似。 #### 3.4 条件概率分布 条件分布试图回答这样一个问题,当我们知道$X$必须取某个值$x$时,$Y$上的概率分布是什么?在离散情况下,给定$Y$的条件概率质量函数是简单的: $$ p_{Y | X}(y | x)=\frac{p_{X Y}(x, y)}{p_{X}(x)} $$ 假设分母不等于0。 在连续的情况下,在技术上要复杂一点,因为连续随机变量的概率等于零。忽略这一技术点,我们通过类比离散情况,简单地定义给定$X = x$的条件概率密度为: $$ f_{Y | X}(y | x)=\frac{f_{X Y}(x, y)}{f_{X}(x)} $$ 假设分母不等于0。 #### 3.5 贝叶斯定理 当试图推导一个变量给定另一个变量的条件概率表达式时,经常出现的一个有用公式是**贝叶斯定理**。 对于离散随机变量$X$和$Y$: $$ P_{Y | X}(y | x)=\frac{{P_{XY}}(x, y)}{P_{X}(x)}=\frac{P_{X | Y}(x | y) P_{Y}(y)}{\sum_{y^{\prime} \in V a l(Y)} P_{X | Y}\left(x | y^{\prime}\right) P_{Y}\left(y^{\prime}\right)} $$ 对于连续随机变量$X$和$Y$: $$ f_{Y | X}(y | x)=\frac{f_{X Y}(x, y)}{f_{X}(x)}=\frac{f_{X | Y}(x | y) f_{Y}(y)}{\int_{-\infty}^{\infty} f_{X | Y}\left(x | y^{\prime}\right) f_{Y}\left(y^{\prime}\right) d y^{\prime}} $$ #### 3.6 独立性 如果对于$X$和$Y$的所有值,$F_{XY}(x,y) = F_X(x)F_Y(y)$,则两个随机变量$X$和$Y$是独立的。等价地, - 对于离散随机变量, 对于任意$x \in Val(X)$, $y \in Val(Y)$ ,$p_{XY}(x,y) = p_X (x)p_Y (y)$。 - 对于离散随机变量, $p_Y |X (y|x) = p_Y (y)$当对于任意$y \in Val(Y)$且$p_X (x) \not= 0$。 - 对于连续随机变量, $f_{XY}(x,y) = f_X (x)f_Y(y)$ 对于任意 $x,y \in \mathbb{R}$。 - 对于连续随机变量, $f_{Y |X} (y|x) = f_Y (y)$ ,当$f_X (x)\not = 0$对于任意$y \in \mathbb{R}$。 非正式地说,如果“知道”一个变量的值永远不会对另一个变量的条件概率分布有任何影响,那么两个随机变量$X$和$Y$是独立的,也就是说,你只要知道$f(x)$和$f(y)$就知道关于这对变量$(X,Y)$的所有信息。以下引理将这一观察形式化: **引理3.1** 如果$X$和$Y$是独立的,那么对于任何$A,B⊆ \mathbb{R}$,我们有: $$ P(X \in A, Y \in B)=P(X \in A) P(Y \in B) $$ 利用上述引理,我们可以证明如果$X$与$Y$无关,那么$X$的任何函数都与$Y$的任何函数无关。 #### 3.7 期望和协方差 假设我们有两个离散的随机变量$X$,$Y$并且$g : \mathbf{R}^{2} \longrightarrow \mathbf{R}$是这两个随机变量的函数。那么$g$的期望值以如下方式定义: $$ E[g(X, Y)] \triangleq \sum_{x \in V a l(X)} \sum_{y \in V a l(Y)} g(x, y) p_{X Y}(x, y) $$ 对于连续随机变量$X$,$Y$,类似的表达式是: $$ E[g(X, Y)]=\int_{-\infty}^{\infty} \int_{-\infty}^{\infty} g(x, y) f_{X Y}(x, y) d x d y $$ 我们可以用期望的概念来研究两个随机变量之间的关系。特别地,两个随机变量的**协方差**定义为: $$ {Cov}[X, Y] \triangleq E[(X-E[X])(Y-E[Y])] $$ 使用类似于方差的推导,我们可以将它重写为: $$ \begin{aligned} {Cov}[X, Y] &=E[(X-E[X])(Y-E[Y])] \\ &=E[X Y-X E[Y]-Y E[X]+E[X] E[Y]] \\ &=E[X Y]-E[X] E[Y]-E[Y] E[X]+E[X] E[Y]] \\ &=E[X Y]-E[X] E[Y] \end{aligned} $$ 在这里,说明两种协方差形式相等的关键步骤是第三个等号,在这里我们使用了这样一个事实,即$E[X]$和$E[Y]$实际上是常数,可以被提出来。当$cov[X,Y] = 0$时,我们说$X$和$Y$不相关。 **性质:** - (期望线性) $E[f(X,Y ) + g(X,Y)] = E[f(X,Y )] + E[g(X,Y)]$ - $V ar[X + Y ] = V ar[X] + V ar[Y ] + 2Cov[X,Y]$ - 如果$X$和$Y$相互独立, 那么 $Cov[X,Y ] = 0$ - 如果$X$和$Y$相互独立, 那么 $E[f(X)g(Y )] = E[f(X)]E[g(Y)]$. ### 4. 多个随机变量 上一节介绍的概念和想法可以推广到两个以上的随机变量。特别是,假设我们有$n$个连续随机变量,$X _1 (\omega),X_2 (\omega),\cdots X_n (\omega)$。在本节中,为了表示简单,我们只关注连续的情况,对离散随机变量的推广工作类似。 #### 4.1 基本性质 我们可以定义$X_1,X_2,\cdots,X_n$的**联合累积分布函数**、**联合概率密度函数**,以及给定$X_2,\cdots,X_n$时$X_1$的**边缘概率密度函数**为: $$ F_{X_{1}, X_{2}, \ldots, X_{n}}\left(x_{1}, x_{2}, \ldots x_{n}\right)=P\left(X_{1} \leq x_{1}, X_{2} \leq x_{2}, \ldots, X_{n} \leq x_{n}\right) $$ $$ f_{X_{1}, X_{2}, \ldots, X_{n}}\left(x_{1}, x_{2}, \ldots x_{n}\right)=\frac{\partial^{n} F_{X_{1}, X_{2}, \ldots, X_{n}}\left(x_{1}, x_{2}, \ldots x_{n}\right)}{\partial x_{1} \ldots \partial x_{n}} $$ $$ f_{X_{1}}\left(X_{1}\right)=\int_{-\infty}^{\infty} \cdots \int_{-\infty}^{\infty} f_{X_{1}, X_{2}, \ldots, X_{n}}\left(x_{1}, x_{2}, \ldots x_{n}\right) d x_{2} \ldots d x_{n} $$ $$ f_{X_{1} | X_{2}, \ldots, X_{n}}\left(x_{1} | x_{2}, \dots x_{n}\right)=\frac{f_{X_{1}, X_{2}, \ldots, X_{n}}\left(x_{1}, x_{2}, \dots x_{n}\right)}{f_{X_{2}, \ldots, X_{n}}\left(x_{1}, x_{2}, \ldots x_{n}\right)} $$ 为了计算事件$A \subseteq \mathbb{R}^{n}$的概率,我们有: $$ P\left(\left(x_{1}, x_{2}, \ldots x_{n}\right) \in A\right)=\int_{\left(x_{1}, x_{2}, \ldots x_{n}\right) \in A} f_{X_{1}, X_{2}, \ldots, X_{n}}\left(x_{1}, x_{2}, \ldots x_{n}\right) d x_{1} d x_{2} \ldots d x_{n} $$ **链式法则:** 从多个随机变量的条件概率的定义中,可以看出: $$ \begin{aligned} f\left(x_{1}, x_{2}, \ldots, x_{n}\right) &=f\left(x_{n} | x_{1}, x_{2} \ldots, x_{n-1}\right) f\left(x_{1}, x_{2} \ldots, x_{n-1}\right) \\ &=f\left(x_{n} | x_{1}, x_{2} \ldots, x_{n-1}\right) f\left(x_{n-1} | x_{1}, x_{2} \ldots, x_{n-2}\right) f\left(x_{1}, x_{2} \ldots, x_{n-2}\right) \\ &=\cdots=f\left(x_{1}\right) \prod_{i=2}^{n} f\left(x_{i} | x_{1}, \ldots, x_{i-1}\right) \end{aligned} $$ 独立性:对于多个事件,$A_1,\cdots ,A_k$,我们说$A_1,\cdots ,A_k$ 是相互独立的,当对于任何子集$S \subseteq \{1,2,\cdots,k\}$,我们有: $$ P\left(\cap_{i \in S} A_{i}\right)=\prod_{i \in S} P\left(A_{i}\right) $$ 同样,我们说随机变量$X_1,X_2,\cdots,X_n$是独立的,如果: $$ f(x_1,\cdots,x_n)=f(x_1)f(x_2)\cdots f(x_n) $$ 这里,相互独立性的定义只是两个随机变量独立性到多个随机变量的自然推广。 独立随机变量经常出现在机器学习算法中,其中我们假设属于训练集的训练样本代表来自某个未知概率分布的独立样本。为了明确独立性的重要性,考虑一个“坏的”训练集,我们首先从某个未知分布中抽取一个训练样本$(x^{ (1)},y^{(1)})$,然后将完全相同的训练样本的$m-1$个副本添加到训练集中。在这种情况下,我们有: $$ P\left(\left(x^{(1)}, y^{(1)}\right), \ldots .\left(x^{(m)}, y^{(m)}\right)\right) \neq \prod_{i=1}^{m} P\left(x^{(i)}, y^{(i)}\right) $$ 尽管训练集的大小为$m$,但这些例子并不独立!虽然这里描述的过程显然不是为机器学习算法建立训练集的明智方法,但是事实证明,在实践中,样本的不独立性确实经常出现,并且它具有减小训练集的“有效大小”的效果。 #### 4.2 随机向量 假设我们有n个随机变量。当把所有这些随机变量放在一起工作时,我们经常会发现把它们放在一个向量中是很方便的...我们称结果向量为随机向量(更正式地说,随机向量是从$\Omega$到$\mathbb{R}^n$的映射)。应该清楚的是,随机向量只是处理$n$个随机变量的一种替代符号,因此联合概率密度函数和综合密度函数的概念也将适用于随机向量。 **期望:** 考虑$g : \mathbb{R}^n \rightarrow \mathbb{R}$中的任意函数。这个函数的期望值 被定义为 $$ E[g(X)]=\int_{\mathbb{R}^{n}} g\left(x_{1}, x_{2}, \ldots, x_{n}\right) f_{X_{1}, X_{2}, \ldots, X_{n}}\left(x_{1}, x_{2}, \ldots x_{n}\right) d x_{1} d x_{2} \ldots d x_{n}E[g(X)]\\=\int_{\mathbb{R}^{n}} g\left(x_{1}, x_{2}, \ldots, x_{n}\right) f_{X_{1}, X_{2}, \ldots, X_{n}}\left(x_{1}, x_{2}, \ldots x_{n}\right) d x_{1} d x_{2} \ldots d x_{n} $$ 其中,$\int_{\mathbb{R}^{n}}$是从$-\infty$到$\infty$的$n$个连续积分。如果$g$是从$\mathbb{R}^n$到$\mathbb{R}^m$的函数,那么$g$的期望值是输出向量的元素期望值,即,如果$g$是: $$ g(x)=\left[\begin{array}{c}{g_{1}(x)} \\ {g_{2}(x)} \\ {\vdots} \\ {g_{m}(x)}\end{array}\right] $$ 那么, $$ E[g(X)]=\left[\begin{array}{c}{E\left[g_{1}(X)\right]} \\ {E\left[g_{2}(X)\right]} \\ {\vdots} \\ {E\left[g_{m}(X)\right]}\end{array}\right] $$ 协方差矩阵:对于给定的随机向量$X:\Omega\rightarrow \mathbb{R}^n$,其协方差矩阵$\Sigma$是$n \times n$平方矩阵,其输入由$\Sigma_{i j}={Cov}\left[X_{i}, X_{j}\right]$给出。从协方差的定义来看,我们有: $$ \begin{aligned} \begin{equation} \Sigma=\left[\begin{array}{ccc}{{Cov}\left[X_{1}, X_{1}\right]} & {\cdots} & {{Cov}\left[X_{1}, X_{n}\right]} \\ {\vdots} & {\ddots} & {\vdots} \\ {{Cov}\left[X_{n}, X_{1}\right]} & {\cdots} & {{Cov}\left[X_{n}, X_{n}\right]}\end{array}\right]\\ =\left[\begin{array}{ccc}{E\left[X_{1}^{2}\right]-E\left[X_{1}\right] E\left[X_{1}\right]} & {\cdots} & {E\left[X_{1} X_{n}\right]-E\left[X_{1}\right] E\left[X_{n}\right]} \\ {\vdots} & {\ddots} & {\vdots} \\ {E\left[X_{n} X_{1}\right]-E\left[X_{n}\right] E\left[X_{1}\right]} & {\cdots} & {E\left[X_{n}^{2}\right]-E\left[X_{n}\right] E\left[X_{n}\right]}\end{array}\right]\\ =\left[\begin{array}{ccc}{E\left[X_{1}^{2}\right]} & {\cdots} & {E\left[X_{1} X_{n}\right]} \\ {\vdots} & {\ddots} & {\vdots} \\ {E\left[X_{n} X_{1}\right]} & {\cdots} & {E\left[X_{n}^{2}\right]}\end{array}\right]-\left[\begin{array}{ccc}{E\left[X_{1}\right] E\left[X_{1}\right]} & {\cdots} & {E\left[X_{1}\right] E\left[X_{n}\right]} \\ {\vdots} & {\ddots} & {\vdots} \\ {E\left[X_{n}\right] E\left[X_{1}\right]} & {\cdots} & {E\left[X_{n}\right] E\left[X_{n}\right]}\end{array}\right]\\ =E\left[X X^{T}\right]-E[X] E[X]^{T}=\ldots=E\left[(X-E[X])(X-E[X])^{T}\right] \end{equation} \end{aligned} $$ 其中矩阵期望以明显的方式定义。 协方差矩阵有许多有用的属性: - $\Sigma \succeq 0$;也就是说,$\Sigma$是正半定的。 - $\Sigma=\Sigma^T$;也就是说,$\Sigma$是对称的。 #### 4.3 多元高斯分布 随机向量上概率分布的一个特别重要的例子叫做多元高斯或多元正态分布。随机向量$X\in \mathbb{R}^n$被认为具有多元正态(或高斯)分布,当其具有均值$\mu \in \mathbb{R}^n$和协方差矩阵$\Sigma \in \mathbb{S}_{++}^{n}$(其中$ \mathbb{S}_{++}^{n}$指对称正定$n \times n$矩阵的空间) $f_{X_{1}, X_{2}, \ldots, X_{n}}\left(x_{1}, x_{2}, \ldots, x_{n} ; \mu, \Sigma\right)=\frac{1}{(2 \pi)^{n / 2}|\Sigma|^{1 / 2}} \exp \left(-\frac{1}{2}(x-\mu)^{T} \Sigma^{-1}(x-\mu)\right)$ 我们把它写成$X \sim \mathcal{N}(\mu, \Sigma)$。请注意,在$n = 1$的情况下,它降维成普通正态分布,其中均值参数为$\mu_1$,方差为$\Sigma_{11}$。 一般来说,高斯随机变量在机器学习和统计中非常有用,主要有两个原因: 首先,在统计算法中对“噪声”建模时,它们非常常见。通常,噪声可以被认为是影响测量过程的大量小的独立随机扰动的累积;根据中心极限定理,独立随机变量的总和将趋向于“看起来像高斯”。 其次,高斯随机变量便于许多分析操作,因为实际中出现的许多涉及高斯分布的积分都有简单的封闭形式解。我们将在本课程稍后遇到这种情况。 ### 5. 其他资源 一本关于**CS229**所需概率水平的好教科书是谢尔顿·罗斯的《概率第一课》(*A First Course on Probability* by Sheldon Ross)。 ================================================ FILE: 0.math/1.CS229/markdown/README.md ================================================ 本文是斯坦福大学CS 229机器学习课程的基础材料,[原始文件下载](http://cs229.stanford.edu/summer2019/cs229-linalg.pdf) 翻译:[黄海广](https://github.com/fengdu78) 备注:请关注[github](https://github.com/fengdu78/Data-Science-Notes/tree/master/0.math)的更新,近期将更新完。 markdown文件夹是文件的markdown代码,内容与pdf一致,是为了方便研究者写论文或者文章使用。 github内容是方便用户学习研究使用,请勿用于商业目的。 ================================================ FILE: 0.math/README.md ================================================ # 机器学习的数学基础材料 ## 一、机器学习的数学基础 [0.basic](0.basic),这个是从大学教材里搜集的机器学习数学基础资料,分为高等数学,线性代数、概率论与数理统计三部分。主要内容是以前考研考博时候的数学笔记,难度应该在本科3年级左右。 **数据科学需要一定的数学基础,但仅仅做应用的话,如果时间不多,不用学太深,了解基本公式即可,遇到问题再查吧。** ## 二、斯坦福大学CS229机器学习课程复习材料 [1.CS229](1.CS229)文件夹的材料斯坦福大学CS 229机器学习课程的基础材料的翻译版本,[原始文件下载](http://cs229.stanford.edu/summer2019/cs229-linalg.pdf) 翻译:[黄海广](https://github.com/fengdu78) 备注:请关注[github](https://github.com/fengdu78/Data-Science-Notes/tree/master/0.math)的更新,近期将更新完。 文件介绍: [1.CS229线性代数(翻译完毕)](1.CS229-LinearAlgebra.pdf) github内容是方便用户学习研究使用,请勿用于商业目的。 如果需要引用这个Repo: 格式: `fengdu78, Data-Science-Notes, (2019), GitHub repository, https://github.com/fengdu78/Data-Science-Notes` ================================================ FILE: 1.python-basic/Python-100/README.md ================================================ # Python练习题100题-带你轻松入门Python > 近日发现一个Python入门的练习仓库,作者收集100多道Python的常见练习题,几乎概括了Python初学要掌握的基本问题。 如果您是python的初学者,那么这100多个练习可以帮助您轻松地使用Python。仓库给定的问题非常简单和容易理解。初学者每天可以尝试3-5个问题,需要一点时间来解决,但肯定会学到一些新的东西(不管你有多懒),经过一个月的常规练习,把练习做完看懂,只要能独立解决100多个问题,基本上Python就入门了。练习题作者地址: https://github.com/darkprinx/100-plus-Python-programming-exercises-extended ## 仓库内容 这个仓库一共有24个Jupyter notebook文件(每天一个),每个文件有3-5个练习,一共104题。问题模板格式 - 提问 - 提示 - 解答 在这个仓库是用Python3 语言。作者修正一些随机错误和变量命名,符合PEP8规范,仓库分为Jupyter notebook格式(文件夹名称:notebooks)和Markdown格式(文件夹名称:Status)两个文件夹,两者内容一致。 ================================================ FILE: 1.python-basic/Python-100/Status/Day 1.md ================================================ # Question 1 ### **Question:** > **_Write a program which will find all such numbers which are divisible by 7 but are not a multiple of 5, > between 2000 and 3200 (both included).The numbers obtained should be printed in a comma-separated sequence on a single line._** --- ### Hints: > **_Consider use range(#begin, #end) method._** --- **Main author's Solution: Python 2** ```python l=[] for i in range(2000, 3201): if (i%7==0) and (i%5!=0): l.append(str(i)) print ','.join(l) ``` --- **My Solution: Python 3** - **Using for loops** ```python for i in range(2000,3201): if i%7 == 0 and i%5!=0: print(i,end=',') print("\b") ``` --- - **Using generators and list comprehension** ```python print(*(i for i in range(2000, 3201) if i%7 == 0 and i%5 != 0), sep=",") ``` # Question 2 ### **Question:** > **_Write a program which can compute the factorial of a given numbers.The results should be printed in a comma-separated sequence on a single line.Suppose the following input is supplied to the program: 8 > Then, the output should be:40320_** --- ### Hints: > **_In case of input data being supplied to the question, it should be assumed to be a console input._** --- **Main author's Solution: Python 2** ```python def fact(x): if x == 0: return 1 return x * fact(x - 1) x = int(raw_input()) print fact(x) ``` --- **My Solution: Python 3** - **Using While Loop** ```python n = int(input()) #input() function takes input as string type #int() converts it to integer type fact = 1 i = 1 while i <= n: fact = fact * i; i = i + 1 print(fact) ``` - **Using For Loop** ```python n = int(input()) #input() function takes input as string type #int() converts it to integer type fact = 1 for i in range(1,n+1): fact = fact * i print(fact) ``` - **Using Lambda Function** ```python # Solution by: harshraj22 n = int(input()) def shortFact(x): return 1 if x <= 1 else x*shortFact(x-1) print(shortFact(n)) ``` --- ```python '''Solution by: minnielahoti ''' while True: try: num = int(input("Enter a number: ")) break except ValueError as err: print(err) org = num fact = 1 while num: fact = num * fact num = num - 1 print(f'the factorial of {org} is {fact}') ``` --- ```python '''Soltuion by: KruthikaSR ''' from functools import reduce def fun(acc, item): return acc*item num = int(input()) print(reduce(fun,range(1, num+1), 1)) ``` --- # Question 3 ### **Question:** > **_With a given integral number n, write a program to generate a dictionary that contains (i, i x i) such that is an integral number between 1 and n (both included). and then the program should print the dictionary.Suppose the following input is supplied to the program: 8_** > **_Then, the output should be:_** ``` {1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64} ``` --- ### Hints: > **_In case of input data being supplied to the question, it should be assumed to be a console input.Consider use dict()_** --- **Main author's Solution: Python 2** ```python n = int(raw_input()) d = dict() for i in range(1,n+1): d[i] = i * i print d ``` **My Solution: Python 3:** - **Using for loop** ```python n = int(input()) ans = {} for i in range (1,n+1): ans[i] = i * i print(ans) ``` - **Using dictionary comprehension** ```python n = int(input()) ans={i : i*i for i in range(1,n+1)} print(ans) ``` --- ```python '''Solution by: minnielahoti Corrected by: TheNobleKnight ''' try: num = int(input("Enter a number: ")) except ValueError as err: print(err) dictio = dict() for item in range(num+1): if item == 0: continue else: dictio[item] = item * item print(dictio) ``` --- ```python '''Solution by: yurbika ''' num = int(input("Number: ")) print(dict(list(enumerate((i * i for i in range(num+1)))))) ``` --- ## Conclusion **_These was the solved problems of day 1. The above problems are very easy for the basic syntex learners.I have shown some easy ways of coding in my solutions. Lets see how to face and attack new problems in the next day._** [**_go to next day_**](https://github.com/darkprinx/100-plus-Python-programming-exercises-extended/blob/master/Status/Day%202.md "Next Day") [**_Discussion_**](https://github.com/darkprinx/100-plus-Python-programming-exercises-extended/issues/3) ================================================ FILE: 1.python-basic/Python-100/Status/Day 2.md ================================================ # Question 4 ### **Question:** > **_Write a program which accepts a sequence of comma-separated numbers from console and generate a list and a tuple which contains every number.Suppose the following input is supplied to the program:_** ``` 34,67,55,33,12,98 ``` > **_Then, the output should be:_** ``` ['34', '67', '55', '33', '12', '98'] ('34', '67', '55', '33', '12', '98') ``` ### Hints: > **_In case of input data being supplied to the question, it should be assumed to be a console input.tuple() method can convert list to tuple_** --- **Main author's Solution: Python 2** ```python values = raw_input() l = values.split(",") t = tuple(l) print l print t ``` --- **My Solution: Python 3** ```python lst = input().split(',') # the input is being taken as string and as it is string it has a built in # method name split. ',' inside split function does split where it finds any ',' # and save the input as list in lst variable tpl = tuple(lst) # tuple method converts list to tuple print(lst) print(tpl) ``` --- ```python '''solution by: minnielahoti ''' print(tuple(input("Enter a series of numbers separated by a comma :").split(','))) ``` --- # Question 5 ### **Question:** > **_Define a class which has at least two methods:_** > > - **_getString: to get a string from console input_** > - **_printString: to print the string in upper case._** > **_Also please include simple test function to test the class methods._** ### Hints: > **_Use **init** method to construct some parameters_** --- **Main author's Solution: Python 2** ```python class InputOutString(object): def __init__(self): self.s = "" def get_string(self): self.s = raw_input() def print_string(self): print self.s.upper() str_obj = InputOutString() str_obj.get_string() str_obj.print_string() ``` --- **My Solution: Python 3** ```python class IOstring(): def get_string(self): self.s = input() def print_string(self): print(self.s.upper()) xx = IOstring() xx.get_string() xx.print_string() ``` --- # Question 6 ### **Question:** > **_Write a program that calculates and prints the value according to the given formula:_** > **_Q = Square root of [(2 _ C _ D)/H]_** > **_Following are the fixed values of C and H:_** > **_C is 50. H is 30._** > **_D is the variable whose values should be input to your program in a comma-separated sequence.For example > Let us assume the following comma separated input sequence is given to the program:_** ``` 100,150,180 ``` > **_The output of the program should be:_** ``` 18,22,24 ``` --- ### Hints: > **_If the output received is in decimal form, it should be rounded off to its nearest value (for example, if the output received is 26.0, it should be printed as 26).In case of input data being supplied to the question, it should be assumed to be a console input._** --- **Main author's Solution: Python 2** ```python import math c = 50 h = 30 value = [] items = [x for x in raw_input().split(',')] for d in items: value.append(str(int(round(math.sqrt(2*c*float(d)/h))))) print ','.join(value) ``` --- **My Solution: Python 3** ```python from math import sqrt # import specific functions as importing all using * # is bad practice C,H = 50,30 def calc(D): return sqrt((2*C*D)/H) D = [int(i) for i in input().split(',')] # splits in comma position and set up in list D = [int(i) for i in D] # converts string to integer D = [calc(i) for i in D] # returns floating value by calc method for every item in D D = [round(i) for i in D] # All the floating values are rounded D = [str(i) for i in D] # All the integers are converted to string to be able to apply join operation print(",".join(D)) ``` **OR** ```python from math import sqrt C,H = 50,30 def calc(D): return sqrt((2*C*D)/H) D = input().split(',') # splits in comma position and set up in list D = [str(round(calc(int(i)))) for i in D] # using comprehension method. It works in order of the previous code print(",".join(D)) ``` **OR** ```python from math import sqrt C,H = 50,30 def calc(D): return sqrt((2*C*D)/H) print(",".join([str(int(calc(int(i)))) for i in input().split(',')])) ``` **OR** ```python from math import * # importing all math functions C,H = 50,30 def calc(D): D = int(D) return str(int(sqrt((2*C*D)/H))) D = input().split(',') D = list(map(calc,D)) # applying calc function on D and storing as a list print(",".join(D)) ``` --- ```python '''Solution by: parian5 ''' from math import sqrt C, H = 50, 30 mylist = input().split(',') print(*(round(sqrt(2*C*int(D)/H)) for D in mylist), sep=",") ``` --- # Question 7 ### **Question:** > **_Write a program which takes 2 digits, X,Y as input and generates a 2-dimensional array. The element value in the i-th row and j-th column of the array should be i _ j.\*** > **_Note: i=0,1.., X-1; j=0,1,¡­Y-1. Suppose the following inputs are given to the program: 3,5_** > **_Then, the output of the program should be:_** ``` [[0, 0, 0, 0, 0], [0, 1, 2, 3, 4], [0, 2, 4, 6, 8]] ``` --- ### Hints: > **_Note: In case of input data being supplied to the question, it should be assumed to be a console input in a comma-separated form._** --- **Main author's Solution: Python 2** ```python input_str = raw_input() dimensions = [int(x) for x in input_str.split(',')] row_num = dimensions[0] col_num = dimensions[1] multilist = [[0 for col in range(col_num)] for row in range(row_num)] for row in range(row_num): for col in range(col_num): multilist[row][col] = row * col print multilist ``` --- **My Solution: Python 3** ```python x,y = map(int,input().split(',')) lst = [] for i in range(x): tmp = [] for j in range(y): tmp.append(i*j) lst.append(tmp) print(lst) ``` **OR** ```python x,y = map(int,input().split(',')) lst = [[i*j for j in range(y)] for i in range(x)] print(lst) ``` --- # Question 8 ### **Question:** > **_Write a program that accepts a comma separated sequence of words as input and prints the words in a comma-separated sequence after sorting them alphabetically._** > **_Suppose the following input is supplied to the program:_** ``` without,hello,bag,world ``` > **_Then, the output should be:_** ``` bag,hello,without,world ``` --- ### Hints: > **_In case of input data being supplied to the question, it should be assumed to be a console input._** --- **Main author's Solution: Python 2** ```python items = [x for x in raw_input().split(',')] items.sort() print ','.join(items) ``` --- **My Solution: Python 3** ```python lst = input().split(',') lst.sort() print(",".join(lst)) ``` --- # Question 9 ### **Question:** > **_Write a program that accepts sequence of lines as input and prints the lines after making all characters in the sentence capitalized._** > **_Suppose the following input is supplied to the program:_** ``` Hello world Practice makes perfect ``` > **_Then, the output should be:_** ``` HELLO WORLD PRACTICE MAKES PERFECT ``` --- ### Hints: > **_In case of input data being supplied to the question, it should be assumed to be a console input._** --- **Main author's Solution: Python 2** ```python lines = [] while True: s = raw_input() if s: lines.append(s.upper()) else: break for sentence in lines: print sentence ``` --- **My Solution: Python 3** ```python lst = [] while True: x = input() if len(x)==0: break lst.append(x.upper()) for line in lst: print(line) ``` **OR** ```python def user_input(): while True: s = input() if not s: return yield s for line in map(str.upper, user_input()): print(line) ``` --- [**_go to previous day_**](https://github.com/darkprinx/100-plus-Python-programming-exercises-extended/blob/master/Status/Day%201.md "Day 1") [**_go to next day_**](https://github.com/darkprinx/100-plus-Python-programming-exercises-extended/blob/master/Status/Day%203.md "Day 3") [**_Discussion_**](https://github.com/darkprinx/100-plus-Python-programming-exercises-extended/issues/3) ================================================ FILE: 1.python-basic/Python-100/Status/Day 3.md ================================================ # Question 10 ### **Question** > **_Write a program that accepts a sequence of whitespace separated words as input and prints the words after removing all duplicate words and sorting them alphanumerically._** > **_Suppose the following input is supplied to the program:_** ``` hello world and practice makes perfect and hello world again ``` > **_Then, the output should be:_** ``` again and hello makes perfect practice world ``` --- ### Hints: > **_In case of input data being supplied to the question, it should be assumed to be a console input.We use set container to remove duplicated data automatically and then use sorted() to sort the data._** --- **Main author's Solution: Python 2** ```python s = raw_input() words = [word for word in s.split(" ")] print " ".join(sorted(list(set(words)))) ``` --- **My Solution: Python 3** ```python word = input().split() for i in word: if word.count(i) > 1: #count function returns total repeatation of an element that is send as argument word.remove(i) # removes exactly one element per call word.sort() print(" ".join(word)) ``` **OR** ```python word = input().split() [word.remove(i) for i in word if word.count(i) > 1 ] # removal operation with comprehension method word.sort() print(" ".join(word)) ``` **OR** ```python word = sorted(list(set(input().split()))) # input string splits -> converting into set() to store unique # element -> converting into list to be able to apply sort print(" ".join(word)) ``` --- ```python '''Solution by: Sukanya-Mahapatra ''' inp_string = input("Enter string: ").split() out_string = [] for words in inp_string: if words not in out_string: out_string.append(words) print(" ".join(sorted(out_string))) ``` --- # Question 11 ### **Question** > **_Write a program which accepts a sequence of comma separated 4 digit binary numbers as its input and then check whether they are divisible by 5 or not. The numbers that are divisible by 5 are to be printed in a comma separated sequence._** > **_Example:_** ``` 0100,0011,1010,1001 ``` > **_Then the output should be:_** ``` 1010 ``` > **_Notes: Assume the data is input by console._** --- ### Hints: > **_In case of input data being supplied to the question, it should be assumed to be a console input._** --- **Main author's Solution: Python 2** ```python value = [] items=[x for x in raw_input().split(',')] for p in items: intp = int(p,2) if not intp % 5: value.append(p) print ','.join(value) ``` --- **My Solution: Python 3** ```python def check(x): # converts binary to integer & returns zero if divisible by 5 total,pw = 0,1 reversed(x) for i in x: total+=pw * (ord(i) - 48) # ord() function returns ASCII value pw*=2 return total % 5 data = input().split(",") # inputs taken here and splited in ',' position lst = [] for i in data: if check(i) == 0: # if zero found it means divisible by zero and added to the list lst.append(i) print(",".join(lst)) ``` **OR** ```python def check(x): # check function returns true if divisible by 5 return int(x,2)%5 == 0 # int(x,b) takes x as string and b as base from which # it will be converted to decimal data = input().split(',') data = list(filter(check,data)) # in filter(func,object) function, elements are picked from 'data' if found True by 'check' function print(",".join(data)) ``` **OR** ```python data = input().split(',') data = list(filter(lambda i:int(i,2)%5==0,data)) # lambda is an operator that helps to write function of one line print(",".join(data)) ``` --- ```python '''Solution by: nikitaMogilev ''' data = input().split(',') data = [num for num in data if int(num, 2) % 5 == 0] print(','.join(data)) ``` --- # Question 12 ### **Question:** > **_Write a program, which will find all such numbers between 1000 and 3000 (both included) such that each digit of the number is an even number.The numbers obtained should be printed in a comma-separated sequence on a single line._** --- ### Hints: > **_In case of input data being supplied to the question, it should be assumed to be a console input._** --- **Main author's Solution: Python 2** ```python values = [] for i in range(1000, 3001): s = str(i) if (int(s[0])%2 == 0) and (int(s[1])%2 == 0) and (int(s[2])%2 == 0) and (int(s[3])%2 == 0): values.append(s) print ",".join(values) ``` --- **My Solution: Python 3** ```python lst = [] for i in range(1000,3001): flag = 1 for j in str(i): # every integer number i is converted into string if ord(j)%2 != 0: # ord returns ASCII value and j is every digit of i flag = 0 # flag becomes zero if any odd digit found if flag == 1: lst.append(str(i)) # i is stored in list as string print(",".join(lst)) ``` **OR** ```python def check(element): return all(ord(i)%2 == 0 for i in element) # all returns True if all digits i is even in element lst = [str(i) for i in range(1000,3001)] # creates list of all given numbers with string data type lst = list(filter(check,lst)) # filter removes element from list if check condition fails print(",".join(lst)) ``` **OR** ```python lst = [str(i) for i in range(1000,3001)] lst = list(filter(lambda i:all(ord(j)%2 == 0 for j in i), lst)) # using lambda to define function inside filter function print(",".join(lst)) ``` --- ```python '''Solution by: nikitaMogilev ''' # map() digits of each number with lambda function and check if all() of them even # str(num) gives us opportunity to iterate through number by map() and join() print(','.join([str(num) for num in range(1000, 3001) if all(map(lambda num: int(num) % 2 == 0, str(num)))])) ``` --- # Question 13 ### **Question:** > **_Write a program that accepts a sentence and calculate the number of letters and digits._** > **_Suppose the following input is supplied to the program:_** ``` hello world! 123 ``` > **_Then, the output should be:_** ``` LETTERS 10 DIGITS 3 ``` --- ### Hints: > **_In case of input data being supplied to the question, it should be assumed to be a console input._** --- **Main author's Solution: Python 2** ```python s = raw_input() d = {"DIGITS":0, "LETTERS":0} for c in s: if c.isdigit(): d["DIGITS"]+=1 elif c.isalpha(): d["LETTERS"]+=1 else: pass print "LETTERS", d["LETTERS"] print "DIGITS", d["DIGITS"] ``` --- **My Solution: Python 3** ```python word = input() letter,digit = 0,0 for i in word: if ('a'<=i and i<='z') or ('A'<=i and i<='Z'): letter+=1 if '0'<=i and i<='9': digit+=1 print("LETTERS {0}\nDIGITS {1}".format(letter,digit)) ``` **OR** ```python word = input() letter, digit = 0,0 for i in word: if i.isalpha(): # returns True if alphabet letter += 1 elif i.isnumeric(): # returns True if numeric digit += 1 print(f"LETTERS {letter}\n{digits}") # two different types of formating method is shown in both solution ``` --- ```python ''' Solution by: popomaticbubble ''' import re input_string = input('> ') print() counter = {"LETTERS":len(re.findall("[a-zA-Z]", input_string)), "NUMBERS":len(re.findall("[0-9]", input_string))} print(counter) ``` --- ## Conclusion **_All the above problems are mostly string related problems. Major parts of the solution includes string releted functions and comprehension method to write down the code in more shorter form._** [**_go to previous day_**](https://github.com/darkprinx/100-plus-Python-programming-exercises-extended/blob/master/Status/Day%202.md "Day 2") [**_go to next day_**](https://github.com/darkprinx/100-plus-Python-programming-exercises-extended/blob/master/Status/Day%204.md "Day 4") [**_Discussion_**](https://github.com/darkprinx/100-plus-Python-programming-exercises-extended/issues/3) ================================================ FILE: 1.python-basic/Python-100/Status/Day 4.md ================================================ # Question 14 ### **Question:** > **_Write a program that accepts a sentence and calculate the number of upper case letters and lower case letters._** > **_Suppose the following input is supplied to the program:_** ``` Hello world! ``` > **_Then, the output should be:_** ``` UPPER CASE 1 LOWER CASE 9 ``` --- ### Hints: > **_In case of input data being supplied to the question, it should be assumed to be a console input._** --- **Main author's Solution: Python 2** ```python s = raw_input() d = {"UPPER CASE":0, "LOWER CASE":0} for c in s: if c.isupper(): d["UPPER CASE"]+=1 elif c.islower(): d["LOWER CASE"]+=1 else: pass print "UPPER CASE", d["UPPER CASE"] print "LOWER CASE", d["LOWER CASE"] ``` --- **My Solution: Python 3** ```python word = input() upper,lower = 0,0 for i in word: if 'a'<=i and i<='z' : lower+=1 if 'A'<=i and i<='Z': upper+=1 print("UPPER CASE {0}\nLOWER CASE {1}".format(upper,lower)) ``` **OR** ```python word = input() upper,lower = 0,0 for i in word: lower+=i.islower() upper+=i.isupper() print("UPPER CASE {0}\nLOWER CASE {1}".format(upper,lower)) ``` **OR** ```python word = input() upper = sum(1 for i in word if i.isupper()) # sum function cumulatively sum up 1's if the condition is True lower = sum(1 for i in word if i.islower()) print("UPPER CASE {0}\nLOWER CASE {1}".format(upper,lower)) ``` **OR** ```python # solution by Amitewu string = input("Enter the sentense") upper = 0 lower = 0 for x in string: if x.isupper() == True: upper += 1 if x.islower() == True: lower += 1 print("UPPER CASE: ", upper) print("LOWER CASE: ", lower) ``` --- # Question 15 ### **Question:** > **_Write a program that computes the value of a+aa+aaa+aaaa with a given digit as the value of a._** > **_Suppose the following input is supplied to the program:_** ``` 9 ``` > **_Then, the output should be:_** ``` 11106 ``` --- ### Hints: > **_In case of input data being supplied to the question, it should be assumed to be a console input._** --- **Main author's Solution: Python 2** ```python a = raw_input() n1 = int( "%s" % a ) n2 = int( "%s%s" % (a,a) ) n3 = int( "%s%s%s" % (a,a,a) ) n4 = int( "%s%s%s%s" % (a,a,a,a) ) print n1+n2+n3+n4 ``` --- **My Solution: Python 3** ```python a = input() total,tmp = 0,str() # initialing an integer and empty string for i in range(4): tmp+=a # concatenating 'a' to 'tmp' total+=int(tmp) # converting string type to integer type print(total) ``` **OR** ```python a = input() total = int(a) + int(2*a) + int(3*a) + int(4*a) # N*a=Na, for example a="23", 2*a="2323",3*a="232323" print(total) ``` --- ```python '''Solution by: ChichiLovesDonkeys ''' from functools import reduce x = input('please enter a digit:') reduce(lambda x, y: int(x) + int(y), [x*i for i in range(1,5)]) ``` --- ```python '''Solution by: lcastrooliveira ''' def question_15(string_digit): return sum(int(string_digit * n) for n in range(1, 5)) inp = input() print(question_15(inp)) ``` --- [**_go to previous day_**](https://github.com/darkprinx/100-plus-Python-programming-exercises-extended/blob/master/Status/Day%203.md "Day 3") [**_go to next day_**](https://github.com/darkprinx/100-plus-Python-programming-exercises-extended/blob/master/Status/Day%205.md "Day 5") [**_Discussion_**](https://github.com/darkprinx/100-plus-Python-programming-exercises-extended/issues/3) ================================================ FILE: 1.python-basic/Python-100/Status/Day 5.md ================================================ # Question 16 ### **Question:** > **_Use a list comprehension to square each odd number in a list. The list is input by a sequence of comma-separated numbers._** >**_Suppose the following input is supplied to the program:_** ``` 1,2,3,4,5,6,7,8,9 ``` > **_Then, the output should be:_** ``` 1,9,25,49,81 ``` --- ### Hints: > **_In case of input data being supplied to the question, it should be assumed to be a console input._** --- **Main author's Solution: Python 2** ```python ## The solution by the author is incorrect.Thus it's not included here. ``` --- **My Solution: Python 3** ```python lst = [str(int(i)**2) for i in input().split(',') if int(i) % 2] print(",".join(lst)) ``` --- ```python '''Solution by: shagun''' square odd no lst = input().split(',') # splits in comma position and set up in list seq = [] lst = [int(i) for i in lst] # converts string to integer for i in lst: if i%2 != 0: i = i*i seq.append(i) seq = [str(i) for i in seq] # All the integers are converted to string to be able to apply join operation print(",".join(seq)) ``` --- **_There were a mistake in the the test case and the solution's whice were notified and fixed with the help of @dwedigital. My warm thanks to him._** # Question 17 ### **Question:** > **_Write a program that computes the net amount of a bank account based a transaction log from console input. The transaction log format is shown as following:_** ``` D 100 W 200 ``` - D means deposit while W means withdrawal. > **_Suppose the following input is supplied to the program:_** ``` D 300 D 300 W 200 D 100 ``` > **_Then, the output should be:_** ``` 500 ``` --- ### Hints: > **_In case of input data being supplied to the question, it should be assumed to be a console input._** --- **Main author's Solution: Python 2** ```python import sys netAmount = 0 while True: s = raw_input() if not s: break values = s.split(" ") operation = values[0] amount = int(values[1]) if operation=="D": netAmount+=amount elif operation=="W": netAmount-=amount else: pass print netAmount ``` --- **My Solution: Python 3** ```python total = 0 while True: s = input().split() if not s: # break if the string is empty break cm,num = map(str,s) # two inputs are distributed in cm and num in string data type if cm=='D': total+=int(num) if cm=='W': total-=int(num) print(total) ``` --- ```python '''Solution by: leonedott''' lst = [] while True: x = input() if len(x)==0: break lst.append(x) balance = 0 for item in lst: if 'D' in item: balance += int(item.strip('D ')) if 'W' in item: balance -= int(item.strip('W ')) print(balance) ``` --- ```python '''Solution by: AlexanderSro''' account = 0 while True: action = input("Deposit/Whitdrow/Balance/Quit? D/W/B/Q: ").lower() if action == "d": deposit = input("How much would you like to deposit? ") account = account + int(deposit) elif action == "w": withdrow = input("How much would you like to withdrow? ") account = account - int(withdrow) elif action == "b": print(account) else: quit() ``` --- ```python '''Solution by: ShalomPrinz ''' lines = [] while True: loopInput = input() if loopInput == "done": break else: lines.append(loopInput) lst = list(int(i[2:]) if i[0] == 'D' else -int(i[2:]) for i in lines) print(sum(lst)) ``` --- ```python '''Solution by: popomaticbubble ''' transactions = [] while True: text = input("> ") if text: text = text.strip('D ') text = text.replace('W ', '-') transactions.append(text) else: break transactions = (int(i) for i in transactions) balance = sum(transactions) print(f"Balance is {balance}") ``` --- ```python '''Solution by: ChichiLovesDonkeys ''' money = 0 while 1: trans = input().split(' ') if trans[0] == 'D': money = money + int(trans[1]) elif trans[0] == 'W': money = money - int(trans[1]) elif input() == '': break print(f'Your current balance is: {money}') ``` --- [**_go to previous day_**](https://github.com/darkprinx/100-plus-Python-programming-exercises-extended/blob/master/Status/Day%204.md "Day 4") [**_go to next day_**](https://github.com/darkprinx/100-plus-Python-programming-exercises-extended/blob/master/Status/Day%206.md "Day 6") [**_Discussion_**](https://github.com/darkprinx/100-plus-Python-programming-exercises-extended/issues/3) ================================================ FILE: 1.python-basic/Python-100/Status/Day 6.md ================================================ # Question 18 ### **Question:** > **_A website requires the users to input username and password to register. Write a program to check the validity of password input by users._** > **_Following are the criteria for checking the password:_** - **_At least 1 letter between [a-z]_** - **_At least 1 number between [0-9]_** - **_At least 1 letter between [A-Z]_** - **_At least 1 character from [$#@]_** - **_Minimum length of transaction password: 6_** - **_Maximum length of transaction password: 12_** > **_Your program should accept a sequence of comma separated passwords and will check them according to the above criteria. Passwords that match the criteria are to be printed, each separated by a comma._** > **_Example_** > **_If the following passwords are given as input to the program:_** ``` ABd1234@1,a F1#,2w3E*,2We3345 ``` > **_Then, the output of the program should be:_** ``` ABd1234@1 ``` --- ### Hints: > **_In case of input data being supplied to the question, it should be assumed to be a console input._** --- **Main author's Solution: Python 2** ```python import re value = [] items = [x for x in raw_input().split(',')] for p in items: if len(p) < 6 or len(p) > 12: continue else: pass if not re.search("[a-z]",p): continue elif not re.search("[0-9]",p): continue elif not re.search("[A-Z]",p): continue elif not re.search("[$#@]",p): continue elif re.search("\s",p): continue else: pass value.append(p) print ",".join(value) ``` --- **My Solution: Python 3** ```python def is_low(x): # Returns True if the string has a lowercase for i in x: if 'a'<=i and i<='z': return True return False def is_up(x): # Returns True if the string has a uppercase for i in x: if 'A'<= i and i<='Z': return True return False def is_num(x): # Returns True if the string has a numeric digit for i in x: if '0'<=i and i<='9': return True return False def is_other(x): # Returns True if the string has any "$#@" for i in x: if i=='$' or i=='#' or i=='@': return True return False s = input().split(',') lst = [] for i in s: length = len(i) if 6 <= length and length <= 12 and is_low(i) and is_up(i) and is_num(i) and is_other(i): #Checks if all the requirments are fulfilled lst.append(i) print(",".join(lst)) ``` **OR** ```python def check(x): cnt = (6<=len(x) and len(x)<=12) for i in x: if i.isupper(): cnt+=1 break for i in x: if i.islower(): cnt+=1 break for i in x: if i.isnumeric(): cnt+=1 break for i in x: if i=='@' or i=='#'or i=='$': cnt+=1 break return cnt == 5 # counting if total 5 all conditions are fulfilled then returns True s = input().split(',') lst = filter(check,s) # Filter function pick the words from s, those returns True by check() function print(",".join(lst)) ``` **OR** ```python import re s = input().split(',') lst = [] for i in s: cnt = 0 cnt+=(6<=len(i) and len(i)<=12) cnt+=bool(re.search("[a-z]",i)) # here re module includes a function re.search() which returns the object information cnt+=bool(re.search("[A-Z]",i)) # of where the pattern string i is matched with any of the [a-z]/[A-z]/[0=9]/[@#$] characters cnt+=bool(re.search("[0-9]",i)) # if not a single match found then returns NONE which converts to False in boolean cnt+=bool(re.search("[@#$]",i)) # expression otherwise True if found any. if cnt == 5: lst.append(i) print(",".join(lst)) ``` --- ```python '''Solution by: pratikb0501 ''' import re a = input('Enter passwords: ').split(',') pass_pattern = re.compile(r"^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[$#@]).{6,12}$") for i in a: if pass_pattern.fullmatch(i): print(i) ``` --- # Question 19 ### **Question:** > **_You are required to write a program to sort the (name, age, score) tuples by ascending order where name is string, age and score are numbers. The tuples are input by console. The sort criteria is:_** - **_1: Sort based on name_** - **_2: Then sort based on age_** - **_3: Then sort by score_** > **_The priority is that name > age > score._** > **_If the following tuples are given as input to the program:_** ``` Tom,19,80 John,20,90 Jony,17,91 Jony,17,93 Json,21,85 ``` > **_Then, the output of the program should be:_** ``` [('John', '20', '90'), ('Jony', '17', '91'), ('Jony', '17', '93'), ('Json', '21', '85'), ('Tom', '19', '80')] ``` --- ### Hints: > **_In case of input data being supplied to the question, it should be assumed to be a console input.We use itemgetter to enable multiple sort keys._** --- **Main author's Solution: Python 2** ```python from operator import itemgetter, attrgetter l = [] while True: s = raw_input() if not s: break l.append(tuple(s.split(","))) print sorted(l, key=itemgetter(0,1,2)) ``` --- **My Solution: Python 3** ```python lst = [] while True: s = input().split(',') if not s[0]: # breaks for blank input break lst.append(tuple(s)) lst.sort(key= lambda x:(x[0],x[1],x[2])) # here key is defined by lambda and the data is sorted by element priority 0>1>2 in accending order print(lst) ``` --- ## Conclusion **_Before the above problems, I didn't even know about re(regular expression) module and its use. I didn't even know how to sort by multiple keys. To solve those problems in different ways I had to explore and learn those syntax.There are a lots of interesting stuffs in re module though I faced quite a bit hardship to understand many of them._** [**_go to previous day_**](https://github.com/darkprinx/100-plus-Python-programming-exercises-extended/blob/master/Status/Day%205.md "Day 5") [**_go to next day_**](https://github.com/darkprinx/100-plus-Python-programming-exercises-extended/blob/master/Status/Day%207.md "Day 7") [**_Discussion_**](https://github.com/darkprinx/100-plus-Python-programming-exercises-extended/issues/3) ================================================ FILE: 1.python-basic/Python-100/Status/Day 7.md ================================================ # Question 20 ### **Question:** > **_Define a class with a generator which can iterate the numbers, which are divisible by 7, between a given range 0 and n._** --- ### Hints: > **_Consider use class, function and comprehension._** --- **Main author's Solution: Python 2** #### **_The solution code for this problem was not as reltive to as the problem mentioned and there was a typing mistake while calling the function._** --- **Solution: Python 3** ```python '''Solution by: ShalomPrinz ''' class MyGen(): def by_seven(self, n): for i in range(0, int(n/7) + 1): yield i * 7 for i in MyGen().by_seven( int(input('Please enter a number... ')) ): print(i) ``` --- ```python '''Solution by: Seawolf159 ''' class Divisible: def by_seven(self, n): for number in range(1,n + 1): if number % 7 == 0: yield number divisible = Divisible() generator = divisible.by_seven(int(input("Please insert a number. --> "))) for number in generator: print(number) ``` --- # Question 21 ### **Question:** > **_A robot moves in a plane starting from the original point (0,0). The robot can move toward UP, DOWN, LEFT and RIGHT with a given steps. The trace of robot movement is shown as the following:_** ``` UP 5 DOWN 3 LEFT 3 RIGHT 2 ``` > **_The numbers after the direction are steps. Please write a program to compute the distance from current position after a sequence of movement and original point. If the distance is a float, then just print the nearest integer._** > **_Example:_** > **_If the following tuples are given as input to the program:_** ``` UP 5 DOWN 3 LEFT 3 RIGHT 2 ``` > **_Then, the output of the program should be:_** ``` 2 ``` --- ### Hints: > **_In case of input data being supplied to the question, it should be assumed to be a console input.Here distance indicates to euclidean distance.Import math module to use sqrt function._** --- **Main author's Solution: Python 2** ```python import math pos = [0,0] while True: s = raw_input() if not s: break movement = s.split(" ") direction = movement[0] steps = int(movement[1]) if direction=="UP": pos[0]+=steps elif direction=="DOWN": pos[0]-=steps elif direction=="LEFT": pos[1]-=steps elif direction=="RIGHT": pos[1]+=steps else: pass print int(round(math.sqrt(pos[1]**2+pos[0]**2))) ``` --- **My Solution: Python 3** ```python import math x,y = 0,0 while True: s = input().split() if not s: break if s[0]=='UP': # s[0] indicates command x-=int(s[1]) # s[1] indicates unit of move if s[0]=='DOWN': x+=int(s[1]) if s[0]=='LEFT': y-=int(s[1]) if s[0]=='RIGHT': y+=int(s[1]) # N**P means N^P dist = round(math.sqrt(x**2 + y**2)) # euclidean distance = square root of (x^2+y^2) and rounding it to nearest integer print(dist) ``` --- ```python '''Solution by: pratikb0501 ''' from math import sqrt lst = [] position = [0,0] while True: a = input() if not a: break lst.append(a) for i in lst: if 'UP' in i: position[0] -= int(i.strip('UP ')) if 'DOWN' in i: position[0] += int(i.strip('DOWN ')) if 'LEFT' in i: position[1] -= int(i.strip('LEFT ')) if 'RIGHT' in i: position[1] += int(i.strip('RIGHT ')) print(round(sqrt(position[1] ** 2 + position[0] ** 2))) ``` --- [**_go to previous day_**](https://github.com/darkprinx/100-plus-Python-programming-exercises-extended/blob/master/Status/Day%206.md "Day 6") [**_go to next day_**](https://github.com/darkprinx/100-plus-Python-programming-exercises-extended/blob/master/Status/Day%208.md "Day 8") [**_Discussion_**](https://github.com/darkprinx/100-plus-Python-programming-exercises-extended/issues/3) ================================================ FILE: 1.python-basic/Python-100/Status/Day 8.md ================================================ # Question 22 ### **Question:** > **_Write a program to compute the frequency of the words from the input. The output should output after sorting the key alphanumerically._** > **_Suppose the following input is supplied to the program:_** ``` New to Python or choosing between Python 2 and Python 3? Read Python 2 or Python 3. ``` > **_Then, the output should be:_** ``` 2:2 3.:1 3?:1 New:1 Python:5 Read:1 and:1 between:1 choosing:1 or:2 to:1 ``` --- ### Hints > **_In case of input data being supplied to the question, it should be assumed to be a console input._** --- **Main author's Solution: Python 2** ```python freq = {} # frequency of words in text line = raw_input() for word in line.split(): freq[word] = freq.get(word,0)+1 words = freq.keys() words.sort() for w in words: print "%s:%d" % (w,freq[w]) ``` --- **My Solution: Python 3** ```python ss = input().split() word = sorted(set(ss)) # split words are stored and sorted as a set for i in word: print("{0}:{1}".format(i,ss.count(i))) ``` **OR** ```python ss = input().split() dict = {} for i in ss: i = dict.setdefault(i,ss.count(i)) # setdefault() function takes key & value to set it as dictionary. dict = sorted(dict.items()) # items() function returns both key & value of dictionary as a list # and then sorted. The sort by default occurs in order of 1st -> 2nd key for i in dict: print("%s:%d"%(i[0],i[1])) ``` **OR** ```python ss = input().split() dict = {i:ss.count(i) for i in ss} # sets dictionary as i-> split word & ss.count(i) -> total occurrence of i in ss dict = sorted(dict.items()) # items() function returns both key & value of dictionary as a list # and then sorted. The sort by default occurs in order of 1st -> 2nd key for i in dict: print("%s:%d"%(i[0],i[1])) ``` **OR** ```python from collections import Counter ss = input().split() ss = Counter(ss) # returns key & frequency as a dictionary ss = sorted(ss.items()) # returns as a tuple list for i in ss: print("%s:%d"%(i[0],i[1])) ``` **Solution by: AnjanKumarG** ```python from pprint import pprint p=input().split() pprint({i:p.count(i) for i in p}) ``` --- # Question 23 ### **Question:** > **_Write a method which can calculate square value of number_** --- ### Hints: ``` Using the ** operator which can be written as n**p where means n^p ``` --- **Main author's Solution: Python 2** ```python def square(num): return num ** 2 print square(2) print square(3) ``` --- **My Solution: Python 3** ```python n=int(input()) print(n**2) ``` --- # Question 24 ### **Question:** > **_Python has many built-in functions, and if you do not know how to use it, you can read document online or find some books. But Python has a built-in document function for every built-in functions._** > **_Please write a program to print some Python built-in functions documents, such as abs(), int(), raw_input()_** > **_And add document for your own function_** ### Hints: ``` The built-in document method is __doc__ ``` --- **Main author's Solution: Python 2** ```python print abs.__doc__ print int.__doc__ print raw_input.__doc__ def square(num): '''Return the square value of the input number. The input number must be integer. ''' return num ** 2 print square(2) print square.__doc__ ``` --- **My Solution: Python 3** ```python print(str.__doc__) print(sorted.__doc__) def pow(n,p): ''' param n: This is any integer number param p: This is power over n return: n to the power p = n^p ''' return n**p print(pow(3,4)) print(pow.__doc__) ``` --- # Question 25 ### **Question:** > **_Define a class, which have a class parameter and have a same instance parameter._** --- ### Hints: ``` Define an instance parameter, need add it in __init__ method.You can init an object with construct parameter or set the value later ``` --- **Main author's Solution: Python 2** ```python class Person: # Define the class parameter "name" name = "Person" def __init__(self, name = None): # self.name is the instance parameter self.name = name jeffrey = Person("Jeffrey") print "%s name is %s" % (Person.name, jeffrey.name) nico = Person() nico.name = "Nico" print "%s name is %s" % (Person.name, nico.name) ``` --- **My Solution: Python 3** ```python class Car: name = "Car" def __init__(self,name = None): self.name = name honda=Car("Honda") print("%s name is %s"%(Car.name,honda.name)) toyota=Car() toyota.name="Toyota" print("%s name is %s"%(Car.name,toyota.name)) ``` --- [**_go to previous day_**](https://github.com/darkprinx/100-plus-Python-programming-exercises-extended/blob/master/Status/Day%207.md "Day 7") [**_go to next day_**](https://github.com/darkprinx/100-plus-Python-programming-exercises-extended/blob/master/Status/Day%209.md "Day 9") [**_Discussion_**](https://github.com/darkprinx/100-plus-Python-programming-exercises-extended/issues/3) ================================================ FILE: 1.python-basic/Python-100/Status/Day 9.md ================================================ # Question 26 ### **Question:** > **_Define a function which can compute the sum of two numbers._** --- ### Hints: > **_Define a function with two numbers as arguments. You can compute the sum in the function and return the value._** --- **Main author's Solution: Python 2** ```python def SumFunction(number1, number2): return number1 + number2 print SumFunction(1,2) ``` --- **My Solution: Python 3** ```python sum = lambda n1,n2 : n1 + n2 # here lambda is use to define little function as sum print(sum(1,2)) ``` --- # Question 27 ### **Question:** > **_Define a function that can convert a integer into a string and print it in console._** --- ### Hints: > **_Use str() to convert a number to string._** --- **Main author's Solution: Python 2** ```python def printValue(n): print str(n) printValue(3) ``` --- **My Solution: Python 3** ```python conv = lambda x : str(x) n = conv(10) print(n) print(type(n)) # checks the type of the variable ``` --- # Question 28 ### **Question:** > **_Define a function that can receive two integer numbers in string form and compute their sum and then print it in console._** --- ### Hints: > **_Use int() to convert a string to integer._** --- **Main author's Solution: Python 2** ```python def printValue(s1,s2): print int(s1) + int(s2) printValue("3","4") #7 ``` --- **My Solution: Python 3** ```python sum = lambda s1,s2 : int(s1) + int(s2) print(sum("10","45")) # 55 ``` --- # Question 29 ### **Question:** > **_Define a function that can accept two strings as input and concatenate them and then print it in console._** --- ### Hints: > **_Use + sign to concatenate the strings._** --- **Main author's Solution: Python 2** ```python def printValue(s1,s2): print s1 + s2 printValue("3","4") #34 ``` --- **My Solution: Python 3** ```python sum = lambda s1,s2 : s1 + s2 print(sum("10","45")) # 1045 ``` --- # Question 30 ### **Question:** > **_Define a function that can accept two strings as input and print the string with maximum length in console. If two strings have the same length, then the function should print all strings line by line._** --- ### Hints: > **_Use len() function to get the length of a string._** --- **Main author's Solution: Python 2** ```python def printValue(s1,s2): len1 = len(s1) len2 = len(s2) if len1 > len2: print s1 elif len2 > len1: print s2 else: print s1 print s2 printValue("one","three") ``` --- **My Solution: Python 3** ```python def printVal(s1,s2): len1 = len(s1) len2 = len(s2) if len1 > len2: print(s1) elif len1 < len2: print(s2) else: print(s1) print(s2) s1,s2=input().split() printVal(s1,s2) ``` --- ```python '''Solution by: yuan1z''' func = lambda a,b: print(max((a,b),key=len)) if len(a)!=len(b) else print(a+'\n'+b) ``` --- [**_go to previous day_**](https://github.com/darkprinx/100-plus-Python-programming-exercises-extended/blob/master/Status/Day%208.md "Day 9") [**_go to next day_**](https://github.com/darkprinx/100-plus-Python-programming-exercises-extended/blob/master/Status/Day_10.md "Day 10") [**_Discussion_**](https://github.com/darkprinx/100-plus-Python-programming-exercises-extended/issues/3) ================================================ FILE: 1.python-basic/Python-100/Status/Day_10.md ================================================ # Question 31 ### **Question:** > **_Define a function which can print a dictionary where the keys are numbers between 1 and 20 (both included) and the values are square of keys._** --- ### Hints: ``` Use dict[key]=value pattern to put entry into a dictionary.Use ** operator to get power of a number.Use range() for loops. ``` --- **Main Author's Solution: Python 2** ```python def printDict(): d=dict() for i in range(1,21): d[i]=i**2 print d printDict() ``` --- **My Solution: Python 3** ```python def printDict(): dict={i:i**2 for i in range(1,21)} # Using comprehension method and print(dict) printDict() ``` --- # Question 32 ### **Question:** > **_Define a function which can generate a dictionary where the keys are numbers between 1 and 20 (both included) and the values are square of keys. The function should just print the keys only._** --- ### Hints: ``` Use dict[key]=value pattern to put entry into a dictionary.Use ** operator to get power of a number.Use range() for loops.Use keys() to iterate keys in the dictionary. Also we can use item() to get key/value pairs. ``` --- **Main Author's Solution: Python 2** ```python def printDict(): d=dict() for i in range(1,21): d[i]=i**2 for k in d.keys(): print k printDict() ``` --- **My Solution: Python 3** ```python def printDict(): dict = {i: i**2 for i in range(1, 21)} print(dict.keys()) # print keys of a dictionary printDict() ``` --- # Question 33 ### **Question:** > **_Define a function which can generate and print a list where the values are square of numbers between 1 and 20 (both included)._** --- ### Hints: ``` Use ** operator to get power of a number.Use range() for loops.Use list.append() to add values into a list. ``` --- **Main Author's Solution: Python 2** ```python def printList(): li=list() for i in range(1,21): li.append(i**2) print li printList() ``` --- **My Solution: Python 3** ```python def printList(): lst = [i ** 2 for i in range(1, 21)] print(lst) printList() ``` --- # Question 34 ### **Question:** > **_Define a function which can generate a list where the values are square of numbers between 1 and 20 (both included). Then the function needs to print the first 5 elements in the list._** --- ### Hints: ``` Use ** operator to get power of a number.Use range() for loops.Use list.append() to add values into a list.Use [n1:n2] to slice a list ``` --- **Main Author's Solution: Python 2** ```python def printList(): li=list() for i in range(1,21): li.append(i**2) print li[:5] printList() ``` --- **My Solution: Python 3** ```python def printList(): lst = [i ** 2 for i in range(1, 21)] for i in range(5): print(lst[i]) printList() ``` --- ```python '''Solution by: popomaticbubble ''' def squares(n): squares_list = [i**2 for i in range(1,n+1)] print(squares_list[0:5]) squares(20) ``` --- ```python '''Solution by: yuan1z''' func = lambda :print([i**2 for i in range(1,21)][:5]) ``` --- # Question 35 ### **Question:** > **_Define a function which can generate a list where the values are square of numbers between 1 and 20 (both included). Then the function needs to print the last 5 elements in the list._** --- ### Hints: ``` Use ** operator to get power of a number.Use range() for loops.Use list.append() to add values into a list.Use [n1:n2] to slice a list ``` --- **Main Author's Solution: Python 2** ```python def printList(): li=list() for i in range(1,21): li.append(i**2) print li[-5:] printList() ``` --- **My Solution: Python 3** ```python def printList(): lst = [i ** 2 for i in range(1, 21)] for i in range(19,14,-1): print(lst[i]) printList() ``` --- ```python '''Solution by: popomaticbubble ''' def squares(n): squares_list = [i**2 for i in range(1,n+1)] print(squares_list[-5:]) squares(20) ``` --- # Question 36 ### **Question:** > **_Define a function which can generate a list where the values are square of numbers between 1 and 20 (both included). Then the function needs to print all values except the first 5 elements in the list._** --- ``` Hints: Use ** operator to get power of a number.Use range() for loops.Use list.append() to add values into a list.Use [n1:n2] to slice a list ``` --- **Main Author's Solution: Python 2** ```python def printList(): li=list() for i in range(1,21): li.append(i**2) print li[5:] printList() ``` --- **My Solution: Python 3** ```python def printList(): lst = [i ** 2 for i in range(1, 21)] for i in range(5,20): print(lst[i]) printList() ``` --- # Question 37 ### **Question:** > **_Define a function which can generate and print a tuple where the value are square of numbers between 1 and 20 (both included)._** --- ### Hints: ``` Use ** operator to get power of a number.Use range() for loops.Use list.append() to add values into a list.Use tuple() to get a tuple from a list. ``` --- **Main Author's Solution: Python 2** ```python def printTuple(): li=list() for i in range(1,21): li.append(i**2) print tuple(li) printTuple() ``` --- **My Solution: Python 3** ```python def printTupple(): lst = [i ** 2 for i in range(1, 21)] print(tuple(lst)) printTupple() ``` --- ```python ''' Solution by: Seawolf159 ''' def square_of_numbers(): return tuple(i ** 2 for i in range(1, 21)) print(square_of_numbers()) ``` --- ### Comment **_Problems of this section is very much easy and all of those are of a modification of same type problem which mainly focused on using some commonly used function works with list,dictionary, tupple.In my entire solutions, I havn't tried to solve problems in efficient way.Rather I tried to solve in a different way that I can.This will help a beginner to know how simplest problems can be solved in different ways._** [**_go to previous day_**](https://github.com/darkprinx/100-plus-Python-programming-exercises-extended/blob/master/Status/Day%209.md "Day 9") [**_go to next day_**](https://github.com/darkprinx/100-plus-Python-programming-exercises-extended/blob/master/Status/Day_11.md "Day 11") [**_Discussion_**](https://github.com/darkprinx/100-plus-Python-programming-exercises-extended/issues/3) ================================================ FILE: 1.python-basic/Python-100/Status/Day_11.md ================================================ # Question 38 ### **Question:** > **_With a given tuple (1,2,3,4,5,6,7,8,9,10), write a program to print the first half values in one line and the last half values in one line._** --- ### Hints: > **_Use [n1:n2] notation to get a slice from a tuple._** --- **Main Author's Solution: Python 2** ```python tp = (1,2,3,4,5,6,7,8,9,10) tp1 = tp[:5] tp2 = tp[5:] print tp1 print tp2 ``` --- **My Solution: Python 3** ```python tpl = (1,2,3,4,5,6,7,8,9,10) for i in range(0,5): print(tpl[i],end = ' ') print() for i in range(5,10): print(tpl[i],end = ' ') ``` **OR** ```python tpl = (1,2,3,4,5,6,7,8,9,10) lst1,lst2 = [],[] for i in range(0,5): lst1.append(tpl[i]) for i in range(5,10): lst2.append(tpl[i]) print(lst1) print(lst2) ``` **OR** ```python ''' Solution by: CoffeeBrakeInc ''' tup = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10) lt = int(len(tup)/2) print(tup[:lt], tup[lt:]) ``` --- **OR** ```python ''' Solution by: AasaiAlangaram ''' tp = (1,2,3,4,5,6,7,8,9,10) print('The Original Tuple:',tp) [print('Splitted List :{List}'.format(List = tp[x:x+5])) for x in range(0,len(tp),5)] ``` --- # Question 39 ### **Question:** > **_Write a program to generate and print another tuple whose values are even numbers in the given tuple (1,2,3,4,5,6,7,8,9,10)._** --- ### Hints: > **_Use "for" to iterate the tuple. Use tuple() to generate a tuple from a list._** --- **Main Author's Solution: Python 2** ```python tp = (1,2,3,4,5,6,7,8,9,10) li = list() for i in tp: if tp[i]%2 == 0: li.append(tp[i]) tp2 = tuple(li) print tp2 ``` --- **My Solution: Python 3** ```python tpl = (1,2,3,4,5,6,7,8,9,10) tpl1 = tuple(i for i in tpl if i%2 == 0) print(tpl1) ``` **OR** ```python tpl = (1,2,3,4,5,6,7,8,9,10) tpl1 = tuple(filter(lambda x : x%2==0,tpl)) # Lambda function returns True if found even element. # Filter removes data for which function returns False print(tpl1) ``` --- # Question 40 ### **Question:** > **_Write a program which accepts a string as input to print "Yes" if the string is "yes" or "YES" or "Yes", otherwise print "No"._** --- ### Hints: > **_Use if statement to judge condition._** --- **Main Author's Solution: Python 2** ```python s= raw_input() if s=="yes" or s=="YES" or s=="Yes": print "Yes" else: print "No" ``` --- **Solution: Python 3** ```python ''' Solution by: Seawolf159 ''' text = input("Please type something. --> ") if text == "yes" or text == "YES" or text == "Yes": print("Yes") else: print("No") ``` --- ```python ''' Solution by: AasaiAlangaram ''' input = input('Enter string:') output = ''.join(['Yes' if input == 'yes' or input =='YES' or input =='Yes' else 'No' ]) print(str(output)) ``` ---------------- ``` Solution by: Prashanth ''' x = str(input().lower()) if x == 'yes': print('Yes') else: print('No') ``` -------- # Question 41 ### **Question:** > **_Write a program which can map() to make a list whose elements are square of elements in [1,2,3,4,5,6,7,8,9,10]._** --- ### Hints: > **_Use map() to generate a list.Use lambda to define anonymous functions._** --- **Main Author's Solution: Python 2** ```python li = [1,2,3,4,5,6,7,8,9,10] squaredNumbers = map(lambda x: x**2, li) print squaredNumbers ``` --- **My Solution: Python 3** ```python # No different way of code is written as the requirment is specificly mentioned in problem description li = [1,2,3,4,5,6,7,8,9,10] squaredNumbers = map(lambda x: x**2, li) # returns map type object data print(list(squaredNumbers)) # converting the object into list ``` --- # Question 42 ### **Question:** > **_Write a program which can map() and filter() to make a list whose elements are square of even number in [1,2,3,4,5,6,7,8,9,10]._** --- ### Hints: > **_Use map() to generate a list.Use filter() to filter elements of a list.Use lambda to define anonymous functions._** --- **Main Author's Solution: Python 2** ```python li = [1,2,3,4,5,6,7,8,9,10] evenNumbers = map(lambda x: x**2, filter(lambda x: x%2==0, li)) print evenNumbers ``` --- **My Solution: Python 3** ```python def even(x): return x%2==0 def squer(x): return x*x li = [1,2,3,4,5,6,7,8,9,10] li = map(squer,filter(even,li)) # first filters number by even number and the apply map() on the resultant elements print(list(li)) ``` --- # Question 43 ### **Question:** > **_Write a program which can filter() to make a list whose elements are even number between 1 and 20 (both included)._** --- ### Hints: > **_Use filter() to filter elements of a list.Use lambda to define anonymous functions._** --- **Main Author's Solution: Python 2** ```python evenNumbers = filter(lambda x: x%2==0, range(1,21)) print evenNumbers ``` --- **My Solution: Python 3** ```python def even(x): return x%2==0 evenNumbers = filter(even, range(1,21)) print(list(evenNumbers)) ``` --- [**_go to previous day_**](https://github.com/darkprinx/100-plus-Python-programming-exercises-extended/blob/master/Status/Day_10.md "Day 10") [**_go to next day_**](https://github.com/darkprinx/100-plus-Python-programming-exercises-extended/blob/master/Status/Day_12.md "Day 12") [**_Discussion_**](https://github.com/darkprinx/100-plus-Python-programming-exercises-extended/issues/3) ================================================ FILE: 1.python-basic/Python-100/Status/Day_12.md ================================================ # Question 44 ### **Question:** > **_Write a program which can map() to make a list whose elements are square of numbers between 1 and 20 (both included)._** --- ### Hints: > **_Use map() to generate a list. Use lambda to define anonymous functions._** --- **Main Author's Solution: Python 2** ```python squaredNumbers = map(lambda x: x**2, range(1,21)) print squaredNumbers ``` --- **My Solution: Python 3** ```python def sqr(x): return x*x squaredNumbers = list(map(sqr, range(1,21))) print (squaredNumbers) ``` --- # Question 45 ### **Question:** > **_Define a class named American which has a static method called printNationality._** --- ### Hints: > **_Use @staticmethod decorator to define class static method.There are also two more methods.To know more, go to this [link](https://realpython.com/blog/python/instance-class-and-static-methods-demystified/)._** --- **Main Author's Solution: Python 2** ```python class American(object): @staticmethod def printNationality(): print "America" anAmerican = American() anAmerican.printNationality() American.printNationality() ``` --- **My Solution: Python 3** ```python class American(): @staticmethod def printNationality(): print("I am American") american = American() american.printNationality() # this will not run if @staticmethod does not decorates the function. # Because the class has no instance. American.printNationality() # this will run even though the @staticmethod # does not decorate printNationality() ``` --- # Question 46 ### **Question:** > **_Define a class named American and its subclass NewYorker._** --- ### Hints: > **Use class Subclass(ParentClass) to define a subclass.\*** --- **Main Author's Solution: Python 2** ```python class American(object): pass class NewYorker(American): pass anAmerican = American() aNewYorker = NewYorker() print anAmerican print aNewYorker ``` --- **My Solution: Python 3** ```python class American(): pass class NewYorker(American): pass american = American() newyorker = NewYorker() print(american) print(newyorker) ``` --- [**_go to previous day_**](https://github.com/darkprinx/100-plus-Python-programming-exercises-extended/blob/master/Status/Day_11.md "Day 11") [**_go to next day_**](https://github.com/darkprinx/100-plus-Python-programming-exercises-extended/blob/master/Status/Day_13.md "Day 13") [**_Discussion_**](https://github.com/darkprinx/100-plus-Python-programming-exercises-extended/issues/3) ================================================ FILE: 1.python-basic/Python-100/Status/Day_13.md ================================================ # Question 47 ### **Question** > **_Define a class named Circle which can be constructed by a radius. The Circle class has a method which can compute the area._** --- ### Hints > **_Use def methodName(self) to define a method._** --- **Main author's Solution: Python 2** ```python class Circle(object): def __init__(self, r): self.radius = r def area(self): return self.radius**2*3.14 aCircle = Circle(2) print aCircle.area() ``` --- **My Solution: Python 3** ```python class Circle(): def __init__(self,r): self.radius = r def area(self): return 3.1416*(self.radius**2) circle = Circle(5) print(circle.area()) ``` --- # Question 48 ### **Question** > **_Define a class named Rectangle which can be constructed by a length and width. The Rectangle class has a method which can compute the area._** --- ### Hints > **_Use def methodName(self) to define a method._** --- **Main author's Solution: Python 2** ```python class Rectangle(object): def __init__(self, l, w): self.length = l self.width = w def area(self): return self.length*self.width aRectangle = Rectangle(2,10) print aRectangle.area() ``` --- **My Solution: Python 3** ```python class Rectangle(): def __init__(self,l,w): self.length = l self.width = w def area(self): return self.length*self.width rect = Rectangle(2,4) print(rect.area()) ``` --- # Question 49 ### **Question** > **_Define a class named Shape and its subclass Square. The Square class has an init function which takes a length as argument. Both classes have a area function which can print the area of the shape where Shape's area is 0 by default._** --- ### Hints > **_To override a method in super class, we can define a method with the same name in the super class._** --- **Main author's Solution: Python 2** ```python class Shape(object): def __init__(self): pass def area(self): return 0 class Square(Shape): def __init__(self, l): Shape.__init__(self) self.length = l def area(self): return self.length*self.length aSquare= Square(3) print aSquare.area() ``` --- **My Solution: Python 3** ```python class Shape(): def __init__(self): pass def area(self): return 0 class Square(Shape): def __init__(self,length = 0): Shape.__init__(self) self.length = length def area(self): return self.length*self.length Asqr = Square(5) print(Asqr.area()) # prints 25 as given argument print(Square().area()) # prints zero as default area ``` --- # Question 50 ### **Question** > **_Please raise a RuntimeError exception._** --- ### Hints > **_UUse raise() to raise an exception._** --- **Solution:** ```python raise RuntimeError('something wrong') ``` --- ## Conclusion **_Well It seems that the above problems are very much focused on basic concpets and implimantation of object oriented programming.As the concepts are not about to solve any functional problem rather design the structure , so both codes are very much similar in there implimantation part._** [**_go to previous day_**](https://github.com/darkprinx/100-plus-Python-programming-exercises-extended/blob/master/Status/Day_12.md "Day 12") [**_go to next day_**](https://github.com/darkprinx/100-plus-Python-programming-exercises-extended/blob/master/Status/Day_14.md "Day 14") [**_Discussion_**](https://github.com/darkprinx/100-plus-Python-programming-exercises-extended/issues/3) ================================================ FILE: 1.python-basic/Python-100/Status/Day_14.md ================================================ # Question 51 ### **Question** > ***Write a function to compute 5/0 and use try/except to catch the exceptions.*** ---------------------- ### Hints > ***Use try/except to catch exceptions.*** ---------------------- **Main author's Solution: Python 2** ```python def throws(): return 5/0 try: throws() except ZeroDivisionError: print "division by zero!" except Exception, err: print 'Caught an exception' finally: print 'In finally block for cleanup' ``` ---------------- **My Solution: Python 3** ```python def divide(): return 5/0 try: divide() except ZeroDivisionError as ze: print("Why on earth you are dividing a number by ZERO!!") except: print("Any other exception") ``` --------------------- # Question 52 ### **Question** > ***Define a custom exception class which takes a string message as attribute.*** ---------------------- ### Hints > ***To define a custom exception, we need to define a class inherited from Exception.*** ---------------------- **Main author's Solution: Python 2** ```python class MyError(Exception): """My own exception class Attributes: msg -- explanation of the error """ def __init__(self, msg): self.msg = msg error = MyError("something wrong") ``` ---------------- **My Solution: Python 3** ```python class CustomException(Exception): """Exception raised for custom purpose Attributes: message -- explanation of the error """ def __init__(self, message): self.message = message num = int(input()) try: if num < 10: raise CustomException("Input is less than 10") elif num > 10: raise CustomException("Input is grater than 10") except CustomException as ce: print("The error raised: " + ce.message) ``` --------------------- # Question 53 ### **Question** > ***Assuming that we have some email addresses in the "username@companyname.com" format, please write program to print the user name of a given email address. Both user names and company names are composed of letters only.*** > ***Example: If the following email address is given as input to the program:*** ``` john@google.com ``` > ***Then, the output of the program should be:*** ``` john ``` > ***In case of input data being supplied to the question, it should be assumed to be a console input.*** ---------------------- ### Hints > ***Use \w to match letters.*** ---------------------- **Main author's Solution: Python 2** ```python import re emailAddress = raw_input() pat2 = "(\w+)@((\w+\.)+(com))" r2 = re.match(pat2,emailAddress) print r2.group(1) ``` ---------------- **My Solution: Python 3** ```python email = "john@google.com" email = email.split('@') print(email[0]) ``` --------------------- **OR** ```python import re email = "john@google.com elise@python.com" pattern = "(\w+)@\w+.com" ans = re.findall(pattern,email) print(ans) ``` [***go to previous day***](https://github.com/darkprinx/100-plus-Python-programming-exercises-extended/blob/master/Status/Day_13.md "Day 13") [***go to next day***](https://github.com/darkprinx/100-plus-Python-programming-exercises-extended/blob/master/Status/Day_15.md "Day 15") [***Discussion***](https://github.com/darkprinx/100-plus-Python-programming-exercises-extended/issues/3) ================================================ FILE: 1.python-basic/Python-100/Status/Day_15.md ================================================ # Question 54 ### **Question** > **_Assuming that we have some email addresses in the "username@companyname.com" format, please write program to print the company name of a given email address. Both user names and company names are composed of letters only._** > **_Example: > If the following email address is given as input to the program:_** ``` john@google.com ``` > **_Then, the output of the program should be:_** ``` google ``` > **_In case of input data being supplied to the question, it should be assumed to be a console input._** --- ### Hints > **_Use \w to match letters._** --- **Main author's Solution: Python 2** ```python import re emailAddress = raw_input() pat2 = "(\w+)@(\w+)\.(com)" r2 = re.match(pat2,emailAddress) print r2.group(2) ``` --- **My Solution: Python 3** ```python import re email = "john@google.com elise@python.com" pattern = "\w+@(\w+).com" ans = re.findall(pattern,email) print(ans) ``` --- # Question 55 ### **Question** > **_Write a program which accepts a sequence of words separated by whitespace as input to print the words composed of digits only._** > **_Example: > If the following words is given as input to the program:_** ``` 2 cats and 3 dogs. ``` > **_Then, the output of the program should be:_** ``` ['2', '3'] ``` > **_In case of input data being supplied to the question, it should be assumed to be a console input._** --- ### Hints > **_Use re.findall() to find all substring using regex._** --- **Main author's Solution: Python 2** ```python import re s = raw_input() print re.findall("\d+",s) ``` --- **My Solution: Python 3** ```python import re email = input() pattern = "\d+" ans = re.findall(pattern,email) print(ans) ``` **OR** ```python email = input().split() ans = [] for word in email: if word.isdigit(): # can also use isnumeric() / isdecimal() function instead ans.append(word) print(ans) ``` **OR** ```python email = input().split() ans = [word for word in email if word.isdigit()] # using list comprehension method print(ans) ``` --- # Question 56 ### **Question** > **_Print a unicode string "hello world"._** --- ### Hints > **_Use u'strings' format to define unicode string._** --- **Main author's Solution: Python 2** ```python unicodeString = u"hello world!" print unicodeString ``` --- # Question 57 ### **Question** > **_Write a program to read an ASCII string and to convert it to a unicode string encoded by utf-8._** --- ### Hints > **_Use unicode()/encode() function to convert._** --- **Main author's Solution: Python 2** ```python s = raw_input() u = unicode( s ,"utf-8") print u ``` --- **My Solution: Python 3** ```python s = input() u = s.encode('utf-8') print(u) ``` --- # Question 58 ### **Question** > **_Write a special comment to indicate a Python source code file is in unicode._** --- ### Hints > **_Use unicode() function to convert._** --- **Solution:** ```python # -*- coding: utf-8 -*- ``` --- # Question 59 ### **Question** > **_Write a program to compute 1/2+2/3+3/4+...+n/n+1 with a given n input by console (n>0)._** > **_Example: > If the following n is given as input to the program:_** ``` 5 ``` > **_Then, the output of the program should be:_** ``` 3.55 ``` > **_In case of input data being supplied to the question, it should be assumed to be a console input._** --- ### Hints > **_Use float() to convert an integer to a float.Even if not converted it wont cause a problem because python by default understands the data type of a value_** --- **Main author's Solution: Python 2** ```python n=int(raw_input()) sum=0.0 for i in range(1,n+1): sum += float(float(i)/(i+1)) print sum ``` --- **My Solution: Python 3** ```python n = int(input()) sum = 0 for i in range(1, n+1): sum+= i/(i+1) print(round(sum, 2)) # rounded to 2 decimal point ``` --- [**_go to previous day_**](https://github.com/darkprinx/100-plus-Python-programming-exercises-extended/blob/master/Status/Day_14.md "Day 14") [**_go to next day_**](https://github.com/darkprinx/100-plus-Python-programming-exercises-extended/blob/master/Status/Day_16.md "Day 16") [**_Discussion_**](https://github.com/darkprinx/100-plus-Python-programming-exercises-extended/issues/3) ================================================ FILE: 1.python-basic/Python-100/Status/Day_16.md ================================================ # Question 60 ### **Question** > **_Write a program to compute:_** ``` f(n)=f(n-1)+100 when n>0 and f(0)=0 ``` > **_with a given n input by console (n>0)._** > **_Example: > If the following n is given as input to the program:_** ``` 5 ``` > **_Then, the output of the program should be:_** ``` 500 ``` > **_In case of input data being supplied to the question, it should be assumed to be a console input._** --- ### Hints > **_We can define recursive function in Python._** --- **Main author's Solution: Python 2** ```python def f(n): if n==0: return 0 else: return f(n-1)+100 n=int(raw_input()) print f(n) ``` --- **My Solution: Python 3** ```python def f(n): if n == 0: return 0 return f(n-1) + 100 n = int(input()) print(f(n)) ``` --- # Question 61 ### **Question** > **_The Fibonacci Sequence is computed based on the following formula:_** ``` f(n)=0 if n=0 f(n)=1 if n=1 f(n)=f(n-1)+f(n-2) if n>1 ``` > **_Please write a program to compute the value of f(n) with a given n input by console._** > **_Example: > If the following n is given as input to the program:_** ``` 7 ``` > **_Then, the output of the program should be:_** ``` 13 ``` > **_In case of input data being supplied to the question, it should be assumed to be a console input._** --- ### Hints > **_We can define recursive function in Python._** --- **Main author's Solution: Python 2** ```python def f(n): if n == 0: return 0 elif n == 1: return 1 else: return f(n-1)+f(n-2) n=int(raw_input()) print f(n) ``` --- **My Solution: Python 3** ```python def f(n): if n < 2: return n return f(n-1) + f(n-2) n = int(input()) print(f(n)) ``` --- # Question 62 ### **Question** > **_The Fibonacci Sequence is computed based on the following formula:_** ``` f(n)=0 if n=0 f(n)=1 if n=1 f(n)=f(n-1)+f(n-2) if n>1 ``` > **_Please write a program to compute the value of f(n) with a given n input by console._** > **_Example: > If the following n is given as input to the program:_** ``` 7 ``` > **_Then, the output of the program should be:_** ``` 0,1,1,2,3,5,8,13 ``` > **_In case of input data being supplied to the question, it should be assumed to be a console input._** --- ### Hints > **_We can define recursive function in Python. > Use list comprehension to generate a list from an existing list. > Use string.join() to join a list of strings._** --- **Main author's Solution: Python 2** ```python def f(n): if n == 0: return 0 elif n == 1: return 1 else: return f(n-1)+f(n-2) n=int(raw_input()) values = [str(f(x)) for x in range(0, n+1)] print ",".join(values) ``` --- **My Solution: Python 3** ```python def f(n): if n < 2: fibo[n] = n return fibo[n] fibo[n] = f(n-1) + f(n-2) return fibo[n] n = int(input()) fibo = [0]*(n+1) # initialize a list of size (n+1) f(n) # call once and it will set value to fibo[0-n] fibo = [str(i) for i in fibo] # converting integer data to string type ans = ",".join(fibo) # joining all string element of fibo with ',' character print(ans) ``` --- ```python '''Solution by: popomaticbubble ''' def fibo(n): if n < 2: return n return fibo(n-1)+fibo(n-2) def print_fiblist(n): fib_list = [(str(fibo(i))) for i in range(0, n+1)] return print(",".join(fib_list)) n = int(input()) print_fiblist(n) ``` --- # Question 63 ### **Question** > **_Please write a program using generator to print the even numbers between 0 and n in comma separated form while n is input by console._** > **_Example: > If the following n is given as input to the program:_** ``` 10 ``` > **_Then, the output of the program should be:_** ``` 0,2,4,6,8,10 ``` > **_In case of input data being supplied to the question, it should be assumed to be a console input._** --- ### Hints > **_Use yield to produce the next value in generator._** --- **Solution:** ```python def EvenGenerator(n): i=0 while i<=n: if i%2==0: yield i i+=1 n=int(raw_input()) values = [] for i in EvenGenerator(n): values.append(str(i)) print ",".join(values) ``` **OR** ```python # Solution by: StartZer0 n = int(input()) for i in range(0, n+1, 2): if i < n - 1: print(i, end = ',' ) else: print(i) ``` --- # Question 64 ### **Question** > **_Please write a program using generator to print the numbers which can be divisible by 5 and 7 between 0 and n in comma separated form while n is input by console._** > **_Example: > If the following n is given as input to the program:_** ``` 100 ``` > **_Then, the output of the program should be:_** ``` 0,35,70 ``` > **_In case of input data being supplied to the question, it should be assumed to be a console input._** --- ### Hints > **_Use yield to produce the next value in generator._** --- **Main author's Solution: Python 2** ```python def NumGenerator(n): for i in range(n+1): if i%5==0 and i%7==0: yield i n=int(raw_input()) values = [] for i in NumGenerator(n): values.append(str(i)) print ",".join(values) ``` --- **My Solution: Python 3** ```python def generate(n): for i in range(n+1): if i % 35 == 0: # 5*7 = 35, if a number is divisible by a & b then it is also divisible by a*b yield i n = int(input()) resp = [str(i) for i in generate(n)] print(",".join(resp)) ``` --- [**_go to previous day_**](https://github.com/darkprinx/100-plus-Python-programming-exercises-extended/blob/master/Status/Day_15.md "Day 15") [**_go to next day_**](https://github.com/darkprinx/100-plus-Python-programming-exercises-extended/blob/master/Status/Day_17.md "Day 17") [**_Discussion_**](https://github.com/darkprinx/100-plus-Python-programming-exercises-extended/issues/3) ================================================ FILE: 1.python-basic/Python-100/Status/Day_17.md ================================================ # Question 65 ### **Question** > **_Please write assert statements to verify that every number in the list [2,4,6,8] is even._** --- ### Hints > **_Use "assert expression" to make assertion._** --- **Main author's Solution: Python 2** ```python li = [2,4,6,8] for i in li: assert i%2==0 ``` --- **My Solution: Python 3** ```python data = [2,4,5,6] for i in data: assert i%2 == 0, "{} is not an even number".format(i) ``` --- # Question 66 ### **Question** > **_Please write a program which accepts basic mathematic expression from console and print the evaluation result._** > **_Example: > If the following n is given as input to the program:_** ``` 35 + 3 ``` > **_Then, the output of the program should be:_** ``` 38 ``` --- ### Hints > **_Use eval() to evaluate an expression._** --- **Main author's Solution: Python 2** ```python expression = raw_input() print eval(expression) ``` --- **My Solution: Python 3** ```python expression = input() ans = eval(expression) print(ans) ``` --- # Question 67 ### **Question** > **_Please write a binary search function which searches an item in a sorted list. The function should return the index of element to be searched in the list._** --- ### Hints > **_Use if/elif to deal with conditions._** --- **Main author's Solution: Python 2** ```python import math def bin_search(li, element): bottom = 0 top = len(li)-1 index = -1 while top>=bottom and index==-1: mid = int(math.floor((top+bottom)/2.0)) if li[mid]==element: index = mid elif li[mid]>element: top = mid-1 else: bottom = mid+1 return index li=[2,5,7,9,11,17,222] print bin_search(li,11) print bin_search(li,12) ``` --- **My Solution: Python 3** ```python #to be written ``` **Solution by ulmasovjafarbek: Python 3** ```python def binary_search(lst, item): low = 0 high = len(lst) - 1 while low <= high: mid = round((low + high) / 2) if lst[mid] == item: return mid elif lst[mid] > item: high = mid - 1 else: low = mid + 1 return None lst = [1,3,5,7,] print(binary_search(lst, 9)) ``` --- **Solution by AasaiAlangaram: Python 3** ```python def binary_search_Ascending(array, target): lower = 0 upper = len(array) print('Array Length:',upper) while lower < upper: x = (lower + upper) // 2 print('Middle Value:',x) value = array[x] if target == value: return x elif target > value: lower = x elif target < value: upper = x Array = [1,5,8,10,12,13,55,66,73,78,82,85,88,99] print('The Value Found at Index:',binary_search_Ascending(Array, 82)) ``` --- **Solution by yuan1z: Python 3** ```python idx = 0 def bs(num,num_list): global idx if (len(num_list) == 1): if num_list[0] == num: return idx else: return "No exit in the list" elif num in num_list[:len(num_list)//2]: return bs(num,num_list[:len(num_list)//2]) else: idx += len(num_list)//2 return bs(num,num_list[len(num_list)//2:]) print(bs(66,[1,5,8,10,12,13,55,66,73,78,82,85,88,99,100])) ``` --- # Question 68 ### **Question** > **_Please generate a random float where the value is between 10 and 100 using Python module._** --- ### Hints > **_Use random.random() to generate a random float in [0,1]._** --- **Main author's Solution: Python 2** ```python import random print random.random()*100 ``` --- **My Solution: Python 3** ```python import random rand_num = random.uniform(10,100) print(rand_num) ``` --- # Question 69 ### **Question** > **_Please generate a random float where the value is between 5 and 95 using Python module._** --- ### Hints > **_Use random.random() to generate a random float in [0,1]._** --- **Main author's Solution: Python 2** ```python import random print random.random()*100-5 ``` --- **My Solution: Python 3** ```python import random rand_num = random.uniform(5,95) print(rand_num) ``` --- [**_go to previous day_**](https://github.com/darkprinx/100-plus-Python-programming-exercises-extended/blob/master/Status/Day_16.md "Day 16") [**_go to next day_**](https://github.com/darkprinx/100-plus-Python-programming-exercises-extended/blob/master/Status/Day_18.md "Day 18") [**_Discussion_**](https://github.com/darkprinx/100-plus-Python-programming-exercises-extended/issues/3) ================================================ FILE: 1.python-basic/Python-100/Status/Day_18.md ================================================ # Question 70 ### **Question** > **_Please write a program to output a random even number between 0 and 10 inclusive using random module and list comprehension._** --- ### Hints > **_Use random.choice() to a random element from a list._** --- **Main author's Solution: Python 2** ```python li = [2,4,6,8] import random print random.choice([i for i in range(11) if i%2==0]) ``` --- **My Solution: Python 3** ```python import random resp = [i for i in range(0,11,2)] print(random.choice(resp)) ``` --- # Question 71 ### **Question** > **_Please write a program to output a random number, which is divisible by 5 and 7, between 10 and 150 inclusive using random module and list comprehension._** --- ### Hints > **_Use random.choice() to a random element from a list._** --- **Main author's Solution: Python 2** ```python import random print random.choice([i for i in range(10,151) if i%5==0 and i%7==0]) ``` --- **My Solution: Python 3** ```python import random resp = [i for i in range(10,151) if i % 35 == 0 ] print(random.choice(resp)) ``` --- # Question 72 ### **Question** > **_Please write a program to generate a list with 5 random numbers between 100 and 200 inclusive._** --- ### Hints > **_Use random.sample() to generate a list of random values._** --- **Main author's Solution: Python 2** ```python import random print random.sample(range(100,201), 5) ``` --- **My Solution: Python 3** ```python import random resp = random.sample(range(100,201),5) print(resp) ``` --- # Question 73 ### **Question** > **_Please write a program to randomly generate a list with 5 even numbers between 100 and 200 inclusive._** --- ### Hints > **_Use random.sample() to generate a list of random values._** --- **Main author's Solution: Python 2** ```python import random print random.sample([i for i in range(100,201) if i%2==0], 5) ``` --- **My Solution: Python 3** ```python import random resp = random.sample(range(100,201,2),5) print(resp) ``` --- # Question 74 ### **Question** > **_Please write a program to randomly generate a list with 5 numbers, which are divisible by 5 and 7 , between 1 and 1000 inclusive._** --- ### Hints > **_Use random.sample() to generate a list of random values._** --- **Main author's Solution: Python 2** ```python import random print random.sample([i for i in range(1,1001) if i%5==0 and i%7==0], 5) ``` --- **My Solution: Python 3** ```python import random lst = [i for i in range(1,1001) if i%35 == 0] resp = random.sample(lst,5) print(resp) ``` --- [**_go to previous day_**](https://github.com/darkprinx/100-plus-Python-programming-exercises-extended/blob/master/Status/Day_17.md "Day 17") [**_go to next day_**](https://github.com/darkprinx/100-plus-Python-programming-exercises-extended/blob/master/Status/Day_19.md "Day 19") [**_Discussion_**](https://github.com/darkprinx/100-plus-Python-programming-exercises-extended/issues/3) ================================================ FILE: 1.python-basic/Python-100/Status/Day_19.md ================================================ # Question 75 ### **Question** > **_Please write a program to randomly print a integer number between 7 and 15 inclusive._** --- ### Hints > **_Use random.randrange() to a random integer in a given range._** --- **Solution:** ```python import random print random.randrange(7,16) ``` --- # Question 76 ### **Question** > **_Please write a program to compress and decompress the string "hello world!hello world!hello world!hello world!"._** --- ### Hints > **_Use zlib.compress() and zlib.decompress() to compress and decompress a string._** --- **Solution:** ```python import zlib s = 'hello world!hello world!hello world!hello world!' t = zlib.compress(s) print t print zlib.decompress(t) ``` --- ```python '''Solution by: anas1434 ''' s = 'hello world!hello world!hello world!hello world!' # In Python 3 zlib.compress() accepts only DataType y = bytes(s, 'utf-8') x = zlib.compress(y) print(x) print(zlib.decompress(x)) ``` --- # Question 77 ### **Question** > **_Please write a program to print the running time of execution of "1+1" for 100 times._** --- ### Hints > **_Use timeit() function to measure the running time._** --- **Main author's Solution: Python 2** ```python from timeit import Timer t = Timer("for i in range(100):1+1") print t.timeit() ``` --- **My Solution: Python 3** ```python import datetime before = datetime.datetime.now() for i in range(100): x = 1 + 1 after = datetime.datetime.now() execution_time = after - before print(execution_time.microseconds) ``` **OR** ```python import time before = time.time() for i in range(100): x = 1 + 1 after = time.time() execution_time = after - before print(execution_time) ``` --- # Question 78 ### **Question** > **_Please write a program to shuffle and print the list [3,6,7,8]._** --- ### Hints > **_Use shuffle() function to shuffle a list._** --- **Main author's Solution: Python 2** ```python from random import shuffle li = [3,6,7,8] shuffle(li) print li ``` --- **My Solution: Python 3** ```python import random lst = [3,6,7,8] random.shuffle(lst) print(lst) ``` **OR** ```python import random # shuffle with a chosen seed lst = [3,6,7,8] seed = 7 random.Random(seed).shuffle(lst) print(lst) ``` --- # Question 79 ### **Question** > **_Please write a program to generate all sentences where subject is in ["I", "You"] and verb is in ["Play", "Love"] and the object is in ["Hockey","Football"]._** --- ### Hints > **_Use list[index] notation to get a element from a list._** --- **Main author's Solution: Python 2** ```python subjects=["I", "You"] verbs=["Play", "Love"] objects=["Hockey","Football"] for i in range(len(subjects)): for j in range(len(verbs)): for k in range(len(objects)): sentence = "%s %s %s." % (subjects[i], verbs[j], objects[k]) print sentence ``` --- **My Solution: Python 3** ```python subjects=["I", "You"] verbs=["Play", "Love"] objects=["Hockey","Football"] for sub in subjects: for verb in verbs: for obj in objects: print("{} {} {}".format(sub,verb,obj)) ``` --- [**_go to previous day_**](https://github.com/darkprinx/100-plus-Python-programming-exercises-extended/blob/master/Status/Day_18.md "Day 18") [**_go to next day_**](https://github.com/darkprinx/100-plus-Python-programming-exercises-extended/blob/master/Status/Day_20.md "Day 20") [**_Discussion_**](https://github.com/darkprinx/100-plus-Python-programming-exercises-extended/issues/3) ================================================ FILE: 1.python-basic/Python-100/Status/Day_20.md ================================================ # Question 80 ### **Question** > **_Please write a program to print the list after removing even numbers in [5,6,77,45,22,12,24]._** --- ### Hints > **_Use list comprehension to delete a bunch of element from a list._** --- **Main author's Solution: Python 2** ```python li = [5,6,77,45,22,12,24] li = [x for x in li if x%2!=0] print li ``` --- **My Solution: Python 3** ```python def isEven(n): return n%2!=0 li = [5,6,77,45,22,12,24] lst = list(filter(isEven,li)) print(lst) ``` **OR** ```python li = [5,6,77,45,22,12,24] lst = list(filter(lambda n:n%2!=0,li)) print(lst) ``` --- # Question 81 ### **Question** > **_By using list comprehension, please write a program to print the list after removing numbers which are divisible by 5 and 7 in [12,24,35,70,88,120,155]._** --- ### Hints > **_Use list comprehension to delete a bunch of element from a list._** --- **Main author's Solution: Python 2** ```python li = [12,24,35,70,88,120,155] li = [x for x in li if x%5!=0 and x%7!=0] print li ``` --- **My Solution: Python 3** ```python li = [12,24,35,70,88,120,155] li = [x for x in li if x % 35!=0] print(li) ``` --- # Question 82 ### **Question** > **_By using list comprehension, please write a program to print the list after removing the 0th, 2nd, 4th,6th numbers in [12,24,35,70,88,120,155]._** --- ### Hints > **_Use list comprehension to delete a bunch of element from a list. > Use enumerate() to get (index, value) tuple._** --- **Main author's Solution: Python 2** ```python li = [12,24,35,70,88,120,155] li = [x for (i,x) in enumerate(li) if i%2!=0] print li ``` --- **My Solution: Python 3** ```python li = [12,24,35,70,88,120,155] li = [li[i] for i in range(len(li)) if i%2 != 0] print(li) ``` --- # Question 83 ### **Question** > **_By using list comprehension, please write a program to print the list after removing the 2nd - 4th numbers in [12,24,35,70,88,120,155]._** --- ### Hints > **_Use list comprehension to delete a bunch of element from a list. > Use enumerate() to get (index, value) tuple._** --- **Main author's Solution: Python 2** ```python li = [12,24,35,70,88,120,155] li = [x for (i,x) in enumerate(li) if i<3 or 4 **_By using list comprehension, please write a program generate a 3\*5\*8 3D array whose each element is 0._** --- ### Hints > **_Use list comprehension to make an array._** --- **Solution:** ```python array = [[ [0 for col in range(8)] for col in range(5)] for row in range(3)] print array ``` --- [**_go to previous day_**](https://github.com/darkprinx/100-plus-Python-programming-exercises-extended/blob/master/Status/Day_19.md "Day 19") [**_go to next day_**](https://github.com/darkprinx/100-plus-Python-programming-exercises-extended/blob/master/Status/Day_21.md "Day 21") [**_Discussion_**](https://github.com/darkprinx/100-plus-Python-programming-exercises-extended/issues/3) ================================================ FILE: 1.python-basic/Python-100/Status/Day_21.md ================================================ # Question 85 ### **Question** > **_By using list comprehension, please write a program to print the list after removing the 0th,4th,5th numbers in [12,24,35,70,88,120,155]._** --- ### Hints > **_Use list comprehension to delete a bunch of element from a list.Use enumerate() to get (index, value) tuple._** --- **Main author's Solution: Python 2** ```python li = [12,24,35,70,88,120,155] li = [x for (i,x) in enumerate(li) if i not in (0,4,5)] print li ``` --- **My Solution: Python 3** ```python li = [12,24,35,70,88,120,155] li = [li[i] for i in range(len(li)) if i not in (0,4,5)] print(li) ``` --- ```python '''Solution by: pratikb0501 ''' li = [12, 24, 35, 70, 88, 120, 155] print(list(j for i, j in enumerate(li) if i != 0 and i != 4 and i != 5)) ``` --- # Question 86 ### **Question** > **_By using list comprehension, please write a program to print the list after removing the value 24 in [12,24,35,24,88,120,155]._** --- ### Hints > **_Use list's remove method to delete a value._** --- **Main author's Solution: Python 2** ```python li = [12,24,35,24,88,120,155] li = [x for x in li if x!=24] print li ``` --- **My Solution: Python 3** ```python li = [12,24,35,24,88,120,155] li.remove(24) # this will remove only the first occurrence of 24 print(li) ``` --- # Question 87 ### **Question** > **_With two given lists [1,3,6,78,35,55] and [12,24,35,24,88,120,155], write a program to make a list whose elements are intersection of the above given lists._** --- ### Hints > **_Use set() and "&=" to do set intersection operation._** --- **Main author's Solution: Python 2** ```python set1=set([1,3,6,78,35,55]) set2=set([12,24,35,24,88,120,155]) set1 &= set2 li=list(set1) print li ``` --- **My Solution: Python 3** ```python list1 = [1,3,6,78,35,55] list2 = [12,24,35,24,88,120,155] set1= set(list1) set2= set(list2) intersection = set1 & set2 print(intersection) ``` **OR** ```python list1 = [1,3,6,78,35,55] list2 = [12,24,35,24,88,120,155] set1= set(list1) set2= set(list2) intersection = set.intersection(set1,set2) print(intersection) ``` --- # Question 88 ### **Question** > **_With a given list [12,24,35,24,88,120,155,88,120,155], write a program to print this list after removing all duplicate values with original order reserved._** --- ### Hints > **_Use set() to store a number of values without duplicate._** --- **Main author's Solution: Python 2** ```python def removeDuplicate( li ): newli=[] seen = set() for item in li: if item not in seen: seen.add( item ) newli.append(item) return newli li=[12,24,35,24,88,120,155,88,120,155] print removeDuplicate(li) ``` --- **My Solution: Python 3** ```python li = [12,24,35,24,88,120,155,88,120,155] for i in li: if li.count(i) > 1: li.remove(i) print(li) ``` **OR** ```python def removeDuplicate( li ): seen = {} # dictionary for item in li: if item not in seen: seen[item] = True yield item li = [12, 24, 35, 24, 88, 120, 155, 88, 120, 155] ans = list(removeDuplicate(li)) print(ans) ``` --- # Question 89 ### **Question** > **_Define a class Person and its two child classes: Male and Female. All classes have a method "getGender" which can print "Male" for Male class and "Female" for Female class._** --- ### Hints > **_Use Subclass(Parentclass) to define a child class._** --- **Solution:** ```python class Person(object): def getGender( self ): return "Unknown" class Male( Person ): def getGender( self ): return "Male" class Female( Person ): def getGender( self ): return "Female" aMale = Male() aFemale= Female() print aMale.getGender() print aFemale.getGender() ``` --- [**_go to previous day_**](https://github.com/darkprinx/100-plus-Python-programming-exercises-extended/blob/master/Status/Day_20.md "Day 20") [**_go to next day_**](https://github.com/darkprinx/100-plus-Python-programming-exercises-extended/blob/master/Status/Day_22.md "Day 22") [**_Discussion_**](https://github.com/darkprinx/100-plus-Python-programming-exercises-extended/issues/3) ================================================ FILE: 1.python-basic/Python-100/Status/Day_22.md ================================================ # Question 90 ### **Question** > **_Please write a program which count and print the numbers of each character in a string input by console._** > **_Example: > If the following string is given as input to the program:_** ``` abcdefgabc ``` > **_Then, the output of the program should be:_** ``` a,2 c,2 b,2 e,1 d,1 g,1 f,1 ``` ### Hints > **_Use dict to store key/value pairs. > Use dict.get() method to lookup a key with default value._** --- **Main author's Solution: Python 2** ```python dic = {} s=raw_input() for s in s: dic[s] = dic.get(s,0)+1 print '\n'.join(['%s,%s' % (k, v) for k, v in dic.items()]) ``` --- **My Solution: Python 3** ```python import string s = input() for letter in string.ascii_lowercase: cnt = s.count(letter) if cnt > 0: print("{},{}".format(letter,cnt)) ``` **OR** ```python s = input() for letter in range(ord('a'),ord('z')+1): # ord() gets the ascii value of a char letter = chr(letter) # chr() gets the char of an ascii value cnt = s.count(letter) if cnt > 0: print("{},{}".format(letter,cnt)) ``` --- # Question 91 ### **Question** > **_Please write a program which accepts a string from console and print it in reverse order._** > **Example: > If the following string is given as input to the program:\*** ``` rise to vote sir ``` > **_Then, the output of the program should be:_** ``` ris etov ot esir ``` ### Hints > **_Use list[::-1] to iterate a list in a reverse order._** --- **Main author's Solution: Python 2** ```python s=raw_input() s = s[::-1] print s ``` --- **My Solution: Python 3** ```python s = input() s = ''.join(reversed(s)) print(s) ``` --- # Question 92 ### **Question** > **_Please write a program which accepts a string from console and print the characters that have even indexes._** > **_Example: > If the following string is given as input to the program:_** ``` H1e2l3l4o5w6o7r8l9d ``` > **_Then, the output of the program should be:_** ``` Helloworld ``` ### Hints > **_Use list[::2] to iterate a list by step 2._** --- **Main author's Solution: Python 2** ```python s=raw_input() s = s[::2] print s ``` --- **My Solution: Python 3** ```python s = "H1e2l3l4o5w6o7r8l9d" s = [ s[i] for i in range(len(s)) if i%2 ==0 ] print(''.join(s)) ``` **OR** ```python s = "H1e2l3l4o5w6o7r8l9d" ns ='' for i in range(len(s)): if i % 2 == 0: ns+=s[i] print(ns) ``` --- # Question 93 ### **Question** > **_Please write a program which prints all permutations of [1,2,3]_** --- ### Hints > **_Use itertools.permutations() to get permutations of list._** --- **Solution:** ```python import itertools print list(itertools.permutations([1,2,3])) ``` --- # Question 94 ### **Question** > **_Write a program to solve a classic ancient Chinese puzzle: > We count 35 heads and 94 legs among the chickens and rabbits in a farm. How many rabbits and how many chickens do we have?_** --- ### Hints > **_Use for loop to iterate all possible solutions._** --- **Solution:** ```python def solve(numheads,numlegs): ns='No solutions!' for i in range(numheads+1): j=numheads-i if 2*i+4*j==numlegs: return i,j return ns,ns numheads=35 numlegs=94 solutions=solve(numheads,numlegs) print solutions ``` --- [**_go to previous day_**](https://github.com/darkprinx/100-plus-Python-programming-exercises-extended/blob/master/Status/Day_21.md "Day 21") [**_go to next day_**](https://github.com/darkprinx/100-plus-Python-programming-exercises-extended/blob/master/Status/Day_23.md "Day 23") [**_Discussion_**](https://github.com/darkprinx/100-plus-Python-programming-exercises-extended/issues/3) ================================================ FILE: 1.python-basic/Python-100/Status/Day_23.md ================================================ # The extended part of the repository starts from this page. Previous 94 problems were collected from the repository mentioned in intro. The following problems are collected from Hackerrank and other resources from internet.All the given solutions are in python 3. # Question 95 ### **Question** > **_Given the participants' score sheet for your University Sports Day, you are required to find the runner-up score. You are given scores. Store them in a list and find the score of the runner-up._** > **_If the following string is given as input to the program:_** > > ``` > 5 > 2 3 6 6 5 > ``` > > **_Then, the output of the program should be:_** > > ``` > 5 > ``` ### Hints > **_Make the scores unique and then find 2nd best number_** --- **My Solution: Python 3** ```python n = int(input()) arr = map(int, input().split()) arr = list(set(arr)) arr.sort() print(arr[-2]) ``` --- ```python ''' Solution by: mishrasunny-coder ''' num = int(input("Enter num: ")) L = [] while True: L.append(num) num = int(input("Enter another: ")) if num == 0: break L1 = list(set(L[:])) L2 = sorted(L1) print(L2) print(f'The runner up is {L2[-2]}') ``` --- ```python '''Solution by: KailashS3 ''' num = int(input()) scores = list(map(int, input().split(' '))) winner = max(scores) lst = [] if len(scores) != num: print('length of score is greater than input given') else: for score in scores: if winner > score: lst.append(score) runnerup = max(lst) print(runnerup) ``` --- # Question 96 ### **Question** > **_You are given a string S and width W. > Your task is to wrap the string into a paragraph of width._** > **_If the following string is given as input to the program:_** > > ``` > ABCDEFGHIJKLIMNOQRSTUVWXYZ > 4 > ``` > > **_Then, the output of the program should be:_** > > ``` > ABCD > EFGH > IJKL > IMNO > QRST > UVWX > YZ > ``` ### Hints > **_Use wrap function of textwrap module_** --- **My Solution: Python 3** ```python import textwrap def wrap(string, max_width): string = textwrap.wrap(string,max_width) string = "\n".join(string) return string if __name__ == '__main__': string, max_width = input(), int(input()) result = wrap(string, max_width) print(result) ``` --- ```python '''Solution by: mishrasunny-coder ''' import textwrap string = input() width = int(input()) print(textwrap.fill(string,width)) ``` --- ```python '''solution by : Prashanth ''' from textwrap import wrap x = str(input(': ')) w = int(input()) z = list(wrap(x, w)) for i in z: print(i) ``` --- # Question 97 ### **Question** > **_You are given an integer, N. Your task is to print an alphabet rangoli of size N. (Rangoli is a form of Indian folk art based on creation of patterns.)_** > **_Different sizes of alphabet rangoli are shown below:_** > > ``` > #size 3 > > ----c---- > --c-b-c-- > c-b-a-b-c > --c-b-c-- > ----c---- > > #size 5 > > --------e-------- > ------e-d-e------ > ----e-d-c-d-e---- > --e-d-c-b-c-d-e-- > e-d-c-b-a-b-c-d-e > --e-d-c-b-c-d-e-- > ----e-d-c-d-e---- > ------e-d-e------ > --------e-------- > ``` ### Hints > **_First print the half of the Rangoli in the given way and save each line in a list. Then print the list in reverse order to get the rest._** --- **My Solution: Python 3** ```python import string def print_rangoli(size): n = size alph = string.ascii_lowercase width = 4 * n - 3 ans = [] for i in range(n): left = '-'.join(alph[n - i - 1:n]) mid = left[-1:0:-1] + left final = mid.center(width, '-') ans.append(final) if len(ans) > 1: for i in ans[n - 2::-1]: ans.append(i) ans = '\n'.join(ans) print(ans) if __name__ == '__main__': n = int(input()) print_rangoli(n) ``` --- # Question 98 ### **Question** > **_You are given a date. Your task is to find what the day is on that date._** **Input** > **_A single line of input containing the space separated month, day and year, respectively, in MM DD YYYY format._** > > ``` > 08 05 2015 > ``` **Output** > **_Output the correct day in capital letters._** > > ``` > WEDNESDAY > ``` --- ### Hints > **_Use weekday function of calender module_** --- **Solution:** ```python import calendar month, day, year = map(int, input().split()) dayId = calendar.weekday(year, month, day) print(calendar.day_name[dayId].upper()) ``` --- # Question 99 ### **Question** > **_Given 2 sets of integers, M and N, print their symmetric difference in ascending order. The term symmetric difference indicates those values that exist in either M or N but do not exist in both._** **Input** > **_The first line of input contains an integer, M.The second line contains M space-separated integers.The third line contains an integer, N.The fourth line contains N space-separated integers._** > > ``` > 4 > 2 4 5 9 > 4 > 2 4 11 12 > ``` **Output** > **_Output the symmetric difference integers in ascending order, one per line._** > > ``` > 5 > 9 > 11 > 12 > ``` --- ### Hints > **_Use \'^\' to make symmetric difference operation._** --- **Solution:** ```python if __name__ == '__main__': n = int(input()) set1 = set(map(int,input().split())) m = int(input()) set2 = set(map(int, input().split())) ans = list(set1 ^ set2) ans.sort() for i in ans: print(i) ``` --- [**_go to previous day_**](https://github.com/darkprinx/100-plus-Python-programming-exercises-extended/blob/master/Status/Day_22.md "Day 22") [**_go to next day_**](https://github.com/darkprinx/100-plus-Python-programming-exercises-extended/blob/master/Status/Day_24.md "Day 24") [**_Discussion_**](https://github.com/darkprinx/100-plus-Python-programming-exercises-extended/issues/3) ================================================ FILE: 1.python-basic/Python-100/Status/Day_24.md ================================================ # Question 100 ### **Question** > **_You are given words. Some words may repeat. For each word, output its number of occurrences. The output order should correspond with the input order of appearance of the word. See the sample input/output for clarification._** > **_If the following string is given as input to the program:_** > > ``` > 4 > bcdef > abcdefg > bcde > bcdef > ``` > > **_Then, the output of the program should be:_** > > ``` > 3 > 2 1 1 > ``` ### Hints > **_Make a list to get the input order and a dictionary to count the word frequency_** --- **My Solution: Python 3** ```python n = int(input()) word_list = [] word_dict = {} for i in range(n): word = input() if word not in word_dict: word_list.append(word) word_dict[word] = word_dict.get(word, 0) + 1 print(len(word_list)) for word in word_list: print(word_dict[word], end=' ') ``` --- # Question 101 ### **Question** > **_You are given a string.Your task is to count the frequency of letters of the string and print the letters in descending order of frequency._** > **_If the following string is given as input to the program:_** > > ``` > aabbbccde > ``` > > **_Then, the output of the program should be:_** > > ``` > b 3 > a 2 > c 2 > d 1 > e 1 > ``` ### Hints > **_Count frequency with dictionary and sort by Value from dictionary Items_** --- **My Solution: Python 3** ```python word = input() dct = {} for i in word: dct[i] = dct.get(i,0) + 1 dct = sorted(dct.items(),key=lambda x: (-x[1],x[0])) for i in dct: print(i[0],i[1]) ``` --- ```python '''Solution by: yuan1z''' X = input() my_set = set(X) arr = [] for item in my_set: arr.append([item,X.count(item)]) tmp = sorted(arr,key = lambda x: (-x[1],x[0])) for i in tmp: print(i[0]+' '+str(i[1])) ``` --- ```python '''Solution by: StartZer0''' s = list(input()) dict_count_ = {k:s.count(k) for k in s} list_of_tuples = [(k,v) for k,v in dict_count_.items()] list_of_tuples.sort(key = lambda x: x[1], reverse = True) for item in list_of_tuples: print(item[0], item[1]) ``` --- # Question 102 ### **Question** > **_Write a Python program that accepts a string and calculate the number of digits and letters._** **Input** > ``` > Hello321Bye360 > ``` **Output** > ``` > Digit - 6 > Letter - 8 > ``` --- ### Hints > **_Use isdigit() and isalpha() function_** --- **Solution:** ```python word = input() digit,letter = 0,0 for char in word: digit+=char.isdigit() letter+=char.isalpha() print('Digit -',digit) print('Letter -',letter) ``` --- # Question 103 ### **Question** > **_Given a number N.Find Sum of 1 to N Using Recursion_** **Input** > ``` > 5 > ``` **Output** > ``` > 15 > ``` --- ### Hints > **_Make a recursive function to get the sum_** --- **Solution:** ```python def rec(n): if n == 0: return n return rec(n-1) + n n = int(input()) sum = rec(n) print(sum) ``` --- [**_go to previous day_**](https://github.com/darkprinx/100-plus-Python-programming-exercises-extended/blob/master/Status/Day_22.md "Day 23") [**_Discussion_**](https://github.com/darkprinx/100-plus-Python-programming-exercises-extended/issues/3) # To Be Continue... ================================================ FILE: 1.python-basic/Python-100/notebooks/Day_01.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Question 1\n", "\n", "### **Question:**\n", "\n", "> **_Write a program which will find all such numbers which are divisible by 7 but are not a multiple of 5,\n", "> between 2000 and 3200 (both included).The numbers obtained should be printed in a comma-separated sequence on a single line._**\n", "\n", "---\n", "\n", "### Hints:\n", "\n", "> **_Consider use range(#begin, #end) method._**\n", "\n", "---\n", "\n", "\n", "\n", "**Solutions:**\n", "\n", "- **Using for loops**" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2002,2009,2016,2023,2037,2044,2051,2058,2072,2079,2086,2093,2107,2114,2121,2128,2142,2149,2156,2163,2177,2184,2191,2198,2212,2219,2226,2233,2247,2254,2261,2268,2282,2289,2296,2303,2317,2324,2331,2338,2352,2359,2366,2373,2387,2394,2401,2408,2422,2429,2436,2443,2457,2464,2471,2478,2492,2499,2506,2513,2527,2534,2541,2548,2562,2569,2576,2583,2597,2604,2611,2618,2632,2639,2646,2653,2667,2674,2681,2688,2702,2709,2716,2723,2737,2744,2751,2758,2772,2779,2786,2793,2807,2814,2821,2828,2842,2849,2856,2863,2877,2884,2891,2898,2912,2919,2926,2933,2947,2954,2961,2968,2982,2989,2996,3003,3017,3024,3031,3038,3052,3059,3066,3073,3087,3094,3101,3108,3122,3129,3136,3143,3157,3164,3171,3178,3192,3199,\b\n" ] } ], "source": [ "for i in range(2000, 3201):\n", " if i % 7 == 0 and i % 5 != 0:\n", " print(i, end=\",\")\n", "print(\"\\b\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "- **Using generators and list comprehension**" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2002,2009,2016,2023,2037,2044,2051,2058,2072,2079,2086,2093,2107,2114,2121,2128,2142,2149,2156,2163,2177,2184,2191,2198,2212,2219,2226,2233,2247,2254,2261,2268,2282,2289,2296,2303,2317,2324,2331,2338,2352,2359,2366,2373,2387,2394,2401,2408,2422,2429,2436,2443,2457,2464,2471,2478,2492,2499,2506,2513,2527,2534,2541,2548,2562,2569,2576,2583,2597,2604,2611,2618,2632,2639,2646,2653,2667,2674,2681,2688,2702,2709,2716,2723,2737,2744,2751,2758,2772,2779,2786,2793,2807,2814,2821,2828,2842,2849,2856,2863,2877,2884,2891,2898,2912,2919,2926,2933,2947,2954,2961,2968,2982,2989,2996,3003,3017,3024,3031,3038,3052,3059,3066,3073,3087,3094,3101,3108,3122,3129,3136,3143,3157,3164,3171,3178,3192,3199\n" ] } ], "source": [ "print(*(i for i in range(2000, 3201) if i % 7 == 0 and i % 5 != 0), sep=\",\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Question 2\n", "\n", "### **Question:**\n", "\n", "> **_Write a program which can compute the factorial of a given numbers.The results should be printed in a comma-separated sequence on a single line.Suppose the following input is supplied to the program: 8\n", "> Then, the output should be:40320_**\n", "\n", "---\n", "\n", "### Hints:\n", "\n", "> **_In case of input data being supplied to the question, it should be assumed to be a console input._**\n", "\n", "---\n", "\n", "\n", "\n", "**Solutions:**\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- **Using While Loop**" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "9\n", "362880\n" ] } ], "source": [ "n = int(input()) # input() function takes input as string type\n", "# int() converts it to integer type\n", "fact = 1\n", "i = 1\n", "while i <= n:\n", " fact = fact * i\n", " i = i + 1\n", "print(fact)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- **Using For Loop**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "n = int(input()) # input() function takes input as string type\n", "# int() converts it to integer type\n", "fact = 1\n", "for i in range(1, n + 1):\n", " fact = fact * i\n", "print(fact)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- **Using Lambda Function**" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "7\n", "5040\n" ] } ], "source": [ "# Solution by: harshraj22\n", "n = int(input())\n", "\n", "\n", "def shortFact(x):\n", " return 1 if x <= 1 else x * shortFact(x - 1)\n", "\n", "\n", "print(shortFact(n))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Question 3\n", "\n", "### **Question:**\n", "\n", "> **_With a given integral number n, write a program to generate a dictionary that contains (i, i x i) such that is an integral number between 1 and n (both included). and then the program should print the dictionary.Suppose the following input is supplied to the program: 8_**\n", "\n", "> **_Then, the output should be:_**\n", "\n", "\n", "{1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64}\n", "\n", "\n", "---\n", "\n", "### Hints:\n", "\n", "> **_In case of input data being supplied to the question, it should be assumed to be a console input.Consider use dict()_**\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Solutions:**" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- **Using For loop**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "n = int(input())\n", "ans = {}\n", "for i in range(1, n + 1):\n", " ans[i] = i * i\n", "print(ans)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- **Using dictionary comprehension**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "n = int(input())\n", "ans = {i: i * i for i in range(1, n + 1)}\n", "print(ans)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.6" } }, "nbformat": 4, "nbformat_minor": 4 } ================================================ FILE: 1.python-basic/Python-100/notebooks/Day_02.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Question 4\n", "\n", "### **Question:**\n", "\n", "> **_Write a program which accepts a sequence of comma-separated numbers from console and generate a list and a tuple which contains every number.Suppose the following input is supplied to the program:_**\n", "\n", "\n", "34,67,55,33,12,98\n", "\n", "\n", "> **_Then, the output should be:_**\n", "\n", "\n", "['34', '67', '55', '33', '12', '98']\n", "('34', '67', '55', '33', '12', '98')\n", "\n", "\n", "### Hints:\n", "\n", "> **_In case of input data being supplied to the question, it should be assumed to be a console input.tuple() method can convert list to tuple_**\n", "\n", "---\n", "\n", "\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "7767\n", "['7767']\n", "('7767',)\n" ] } ], "source": [ "lst = input().split(\",\")\n", "# the input is being taken as string and as it is string it has a built in\n", "# method name split. ',' inside split function does split where it finds any ','\n", "# and save the input as list in lst variable\n", "\n", "tpl = tuple(lst) # tuple method converts list to tuple\n", "\n", "print(lst)\n", "print(tpl)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 5\n", "\n", "### **Question:**\n", "\n", "> **_Define a class which has at least two methods:_**\n", ">\n", "> - **_getString: to get a string from console input_**\n", "> - **_printString: to print the string in upper case._**\n", "\n", "> **_Also please include simple test function to test the class methods._**\n", "\n", "### Hints:\n", "\n", "> **_Use **init** method to construct some parameters_**\n", "\n", "---\n", "\n", "\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdin", "output_type": "stream", "text": [ " abc\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "ABC\n" ] } ], "source": [ "class IOstring:\n", " def __init__(self):\n", " pass\n", "\n", " def get_string(self):\n", " self.s = input()\n", "\n", " def print_string(self):\n", " print(self.s.upper())\n", "\n", "\n", "xx = IOstring()\n", "xx.get_string()\n", "xx.print_string()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 6\n", "\n", "### **Question:**\n", "\n", "> **_Write a program that calculates and prints the value according to the given formula:_**\n", "\n", "> **_Q = Square root of [(2 _ C _ D)/H]_**\n", "\n", "> **_Following are the fixed values of C and H:_**\n", "\n", "> **_C is 50. H is 30._**\n", "\n", "> **_D is the variable whose values should be input to your program in a comma-separated sequence.For example\n", "> Let us assume the following comma separated input sequence is given to the program:_**\n", "\n", "\n", "100,150,180\n", "\n", "\n", "> **_The output of the program should be:_**\n", "\n", "\n", "18,22,24\n", "\n", "\n", "---\n", "\n", "### Hints:\n", "\n", "> **_If the output received is in decimal form, it should be rounded off to its nearest value (for example, if the output received is 26.0, it should be printed as 26).In case of input data being supplied to the question, it should be assumed to be a console input._**\n", "\n", "---\n", "\n", "\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdin", "output_type": "stream", "text": [ " 100, 150, 180\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "18,22,24\n" ] } ], "source": [ "from math import sqrt # import specific functions as importing all using *\n", "\n", "# is bad practice\n", "\n", "C, H = 50, 30\n", "\n", "\n", "def calc(D):\n", " return sqrt((2 * C * D) / H)\n", "\n", "\n", "D = [int(i) for i in input().split(\",\")] # splits in comma position and set up in list\n", "D = [int(i) for i in D] # converts string to integer\n", "D = [calc(i) for i in D] # returns floating value by calc method for every item in D\n", "D = [round(i) for i in D] # All the floating values are rounded\n", "D = [\n", " str(i) for i in D\n", "] # All the integers are converted to string to be able to apply join operation\n", "\n", "print(\",\".join(D))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**OR**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from math import sqrt\n", "\n", "C, H = 50, 30\n", "\n", "\n", "def calc(D):\n", " return sqrt((2 * C * D) / H)\n", "\n", "\n", "D = input().split(\",\") # splits in comma position and set up in list\n", "D = [\n", " str(round(calc(int(i)))) for i in D\n", "] # using comprehension method. It works in order of the previous code\n", "print(\",\".join(D))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**OR**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from math import sqrt\n", "\n", "C, H = 50, 30\n", "\n", "\n", "def calc(D):\n", " return sqrt((2 * C * D) / H)\n", "\n", "\n", "print(\",\".join([str(int(calc(int(i)))) for i in input().split(\",\")]))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**OR**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from math import * # importing all math functions\n", "\n", "C, H = 50, 30\n", "\n", "\n", "def calc(D):\n", " D = int(D)\n", " return str(int(sqrt((2 * C * D) / H)))\n", "\n", "\n", "D = input().split(\",\")\n", "D = list(map(calc, D)) # applying calc function on D and storing as a list\n", "print(\",\".join(D))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 7\n", "\n", "### **Question:**\n", "\n", "> **_Write a program which takes 2 digits, X,Y as input and generates a 2-dimensional array. The element value in the i-th row and j-th column of the array should be i _ j.\\***\n", "\n", "> **_Note: i=0,1.., X-1; j=0,1,¡­Y-1. Suppose the following inputs are given to the program: 3,5_**\n", "\n", "> **_Then, the output of the program should be:_**\n", "\n", "\n", "[[0, 0, 0, 0, 0], [0, 1, 2, 3, 4], [0, 2, 4, 6, 8]]\n", "\n", "\n", "---\n", "\n", "### Hints:\n", "\n", "> **_Note: In case of input data being supplied to the question, it should be assumed to be a console input in a comma-separated form._**\n", "\n", "---\n", "\n", "\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "x, y = map(int, input().split(\",\"))\n", "lst = []\n", "\n", "for i in range(x):\n", " tmp = []\n", " for j in range(y):\n", " tmp.append(i * j)\n", " lst.append(tmp)\n", "\n", "print(lst)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**OR**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "x, y = map(int, input().split(\",\"))\n", "lst = [[i * j for j in range(y)] for i in range(x)]\n", "print(lst)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 8\n", "\n", "### **Question:**\n", "\n", "> **_Write a program that accepts a comma separated sequence of words as input and prints the words in a comma-separated sequence after sorting them alphabetically._**\n", "\n", "> **_Suppose the following input is supplied to the program:_**\n", "\n", "\n", "without,hello,bag,world\n", "\n", "\n", "> **_Then, the output should be:_**\n", "\n", "\n", "bag,hello,without,world\n", "\n", "\n", "---\n", "\n", "### Hints:\n", "\n", "> **_In case of input data being supplied to the question, it should be assumed to be a console input._**\n", "\n", "---\n", "\n", "\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "lst = input().split(\",\")\n", "lst.sort()\n", "print(\",\".join(lst))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 9\n", "\n", "### **Question:**\n", "\n", "> **_Write a program that accepts sequence of lines as input and prints the lines after making all characters in the sentence capitalized._**\n", "\n", "> **_Suppose the following input is supplied to the program:_**\n", "\n", "\n", "Hello world\n", "\n", "Practice makes perfect\n", "\n", "\n", "> **_Then, the output should be:_**\n", "\n", "\n", "HELLO WORLD\n", "\n", "PRACTICE MAKES PERFECT\n", "\n", "\n", "---\n", "\n", "### Hints:\n", "\n", "> **_In case of input data being supplied to the question, it should be assumed to be a console input._**\n", "\n", "---\n", "\n", "\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "lst = []\n", "\n", "while input():\n", " x = input()\n", " if len(x) == 0:\n", " break\n", " lst.append(x.upper())\n", "\n", "for line in lst:\n", " print(line)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**OR**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def user_input():\n", " while True:\n", " s = input()\n", " if not s:\n", " return\n", " yield s\n", "\n", "\n", "for line in map(str.upper, user_input()):\n", " print(line)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.6" } }, "nbformat": 4, "nbformat_minor": 4 } ================================================ FILE: 1.python-basic/Python-100/notebooks/Day_03.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Question 10\n", "\n", "### **Question**\n", "\n", "> **_Write a program that accepts a sequence of whitespace separated words as input and prints the words after removing all duplicate words and sorting them alphanumerically._**\n", "\n", "> **_Suppose the following input is supplied to the program:_**\n", "\n", "hello world and practice makes perfect and hello world again\n", "\n", "> **_Then, the output should be:_**\n", "\n", "again and hello makes perfect practice world\n", "\n", "---\n", "\n", "### Hints:\n", "\n", "> **_In case of input data being supplied to the question, it should be assumed to be a console input.We use set container to remove duplicated data automatically and then use sorted() to sort the data._**\n", "\n", "---\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "word = input().split()\n", "\n", "for i in word:\n", " if (\n", " word.count(i) > 1\n", " ): # count function returns total repeatation of an element that is send as argument\n", " word.remove(i) # removes exactly one element per call\n", "\n", "word.sort()\n", "print(\" \".join(word))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**OR**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "word = input().split()\n", "[\n", " word.remove(i) for i in word if word.count(i) > 1\n", "] # removal operation with comprehension method\n", "word.sort()\n", "print(\" \".join(word))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**OR**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "word = sorted(\n", " list(set(input().split()))\n", ") # input string splits -> converting into set() to store unique\n", "# element -> converting into list to be able to apply sort\n", "print(\" \".join(word))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 11\n", "\n", "### **Question**\n", "\n", "> **_Write a program which accepts a sequence of comma separated 4 digit binary numbers as its input and then check whether they are divisible by 5 or not. The numbers that are divisible by 5 are to be printed in a comma separated sequence._**\n", "\n", "> **_Example:_**\n", "\n", "0100,0011,1010,1001\n", "\n", "> **_Then the output should be:_**\n", "\n", "1010\n", "\n", "> **_Notes: Assume the data is input by console._**\n", "\n", "---\n", "\n", "### Hints:\n", "\n", "> **_In case of input data being supplied to the question, it should be assumed to be a console input._**\n", "\n", "---\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def check(x): # converts binary to integer & returns zero if divisible by 5\n", " total, pw = 0, 1\n", " reversed(x)\n", "\n", " for i in x:\n", " total += pw * (ord(i) - 48) # ord() function returns ASCII value\n", " pw *= 2\n", " return total % 5\n", "\n", "\n", "data = input().split(\",\") # inputs taken here and splited in ',' position\n", "lst = []\n", "\n", "for i in data:\n", " if check(i) == 0: # if zero found it means divisible by zero and added to the list\n", " lst.append(i)\n", "\n", "print(\",\".join(lst))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**OR**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def check(x): # check function returns true if divisible by 5\n", " return int(x, 2) % 5 == 0 # int(x,b) takes x as string and b as base from which\n", " # it will be converted to decimal\n", "\n", "\n", "data = input().split(\",\")\n", "\n", "data = list(\n", " filter(check, data)\n", ") # in filter(func,object) function, elements are picked from 'data' if found True by 'check' function\n", "print(\",\".join(data))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**OR**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "data = input().split(\",\")\n", "data = list(\n", " filter(lambda i: int(i, 2) % 5 == 0, data)\n", ") # lambda is an operator that helps to write function of one line\n", "print(\",\".join(data))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 12\n", "\n", "### **Question:**\n", "\n", "> **_Write a program, which will find all such numbers between 1000 and 3000 (both included) such that each digit of the number is an even number.The numbers obtained should be printed in a comma-separated sequence on a single line._**\n", "\n", "---\n", "\n", "### Hints:\n", "\n", "> **_In case of input data being supplied to the question, it should be assumed to be a console input._**\n", "\n", "---\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "lst = []\n", "\n", "for i in range(1000, 3001):\n", " flag = 1\n", " for j in str(i): # every integer number i is converted into string\n", " if ord(j) % 2 != 0: # ord returns ASCII value and j is every digit of i\n", " flag = 0 # flag becomes zero if any odd digit found\n", " if flag == 1:\n", " lst.append(str(i)) # i is stored in list as string\n", "\n", "print(\",\".join(lst))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**OR**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def check(element):\n", " return all(\n", " ord(i) % 2 == 0 for i in element\n", " ) # all returns True if all digits i is even in element\n", "\n", "\n", "lst = [\n", " str(i) for i in range(1000, 3001)\n", "] # creates list of all given numbers with string data type\n", "lst = list(\n", " filter(check, lst)\n", ") # filter removes element from list if check condition fails\n", "print(\",\".join(lst))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**OR**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "lst = [str(i) for i in range(1000, 3001)]\n", "lst = list(\n", " filter(lambda i: all(ord(j) % 2 == 0 for j in i), lst)\n", ") # using lambda to define function inside filter function\n", "print(\",\".join(lst))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 13\n", "\n", "### **Question:**\n", "\n", "> **_Write a program that accepts a sentence and calculate the number of letters and digits._**\n", "\n", "> **_Suppose the following input is supplied to the program:_**\n", "\n", "hello world! 123\n", "\n", "> **_Then, the output should be:_**\n", "\n", "LETTERS 10\n", "\n", "DIGITS 3\n", "\n", "---\n", "\n", "### Hints:\n", "\n", "> **_In case of input data being supplied to the question, it should be assumed to be a console input._**\n", "\n", "---\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "word = input()\n", "letter, digit = 0, 0\n", "\n", "for i in word:\n", " if (\"a\" <= i and i <= \"z\") or (\"A\" <= i and i <= \"Z\"):\n", " letter += 1\n", " if \"0\" <= i and i <= \"9\":\n", " digit += 1\n", "\n", "print(\"LETTERS {0}\\nDIGITS {1}\".format(letter, digit))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**OR**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "word = input()\n", "letter, digit = 0, 0\n", "\n", "for i in word:\n", " if i.isalpha(): # returns True if alphabet\n", " letter += 1\n", " elif i.isnumeric(): # returns True if numeric\n", " digit += 1\n", "print(\n", " f\"LETTERS {letter}\\n{digits}\"\n", ") # two different types of formating method is shown in both solution" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "## Conclusion\n", "\n", "**_All the above problems are mostly string related problems. Major parts of the solution includes string releted functions and comprehension method to write down the code in more shorter form._**" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.6" } }, "nbformat": 4, "nbformat_minor": 4 } ================================================ FILE: 1.python-basic/Python-100/notebooks/Day_04.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Question 14\n", "\n", "### **Question:**\n", "\n", "> **_Write a program that accepts a sentence and calculate the number of upper case letters and lower case letters._**\n", "\n", "> **_Suppose the following input is supplied to the program:_**\n", "\n", "\n", "Hello world!\n", "\n", "\n", "> **_Then, the output should be:_**\n", "\n", "\n", "UPPER CASE 1\n", "\n", "LOWER CASE 9\n", "\n", "\n", "---\n", "\n", "### Hints:\n", "\n", "> **_In case of input data being supplied to the question, it should be assumed to be a console input._**\n", "\n", "---\n", "\n", "\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "word = input()\n", "upper, lower = 0, 0\n", "\n", "for i in word:\n", " if \"a\" <= i and i <= \"z\":\n", " lower += 1\n", " if \"A\" <= i and i <= \"Z\":\n", " upper += 1\n", "\n", "print(\"UPPER CASE {0}\\nLOWER CASE {1}\".format(upper, lower))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**OR**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "word = input()\n", "upper, lower = 0, 0\n", "\n", "for i in word:\n", " lower += i.islower()\n", " upper += i.isupper()\n", "\n", "print(\"UPPER CASE {0}\\nLOWER CASE {1}\".format(upper, lower))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**OR**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "word = input()\n", "upper = sum(\n", " 1 for i in word if i.isupper()\n", ") # sum function cumulatively sum up 1's if the condition is True\n", "lower = sum(1 for i in word if i.islower())\n", "\n", "print(\"UPPER CASE {0}\\nLOWER CASE {1}\".format(upper, lower))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**OR**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# solution by Amitewu\n", "\n", "string = input(\"Enter the sentense\")\n", "upper = 0\n", "lower = 0\n", "for x in string:\n", " if x.isupper() == True:\n", " upper += 1\n", " if x.islower() == True:\n", " lower += 1\n", "\n", "print(\"UPPER CASE: \", upper)\n", "print(\"LOWER CASE: \", lower)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 15\n", "\n", "### **Question:**\n", "\n", "> **_Write a program that computes the value of a+aa+aaa+aaaa with a given digit as the value of a._**\n", "\n", "> **_Suppose the following input is supplied to the program:_**\n", "\n", "\n", "9\n", "\n", "\n", "> **_Then, the output should be:_**\n", "\n", "\n", "11106\n", "\n", "\n", "---\n", "\n", "### Hints:\n", "\n", "> **_In case of input data being supplied to the question, it should be assumed to be a console input._**\n", "\n", "---\n", "\n", "\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "a = input()\n", "total, tmp = 0, str() # initialing an integer and empty string\n", "\n", "for i in range(4):\n", " tmp += a # concatenating 'a' to 'tmp'\n", " total += int(tmp) # converting string type to integer type\n", "\n", "print(total)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**OR**\n", "\n", "```python\n", "a = input()\n", "total = int(a) + int(2*a) + int(3*a) + int(4*a) # N*a=Na, for example a=\"23\", 2*a=\"2323\",3*a=\"232323\"\n", "print(total)\n", "```" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.6" } }, "nbformat": 4, "nbformat_minor": 4 } ================================================ FILE: 1.python-basic/Python-100/notebooks/Day_05.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Question 16\n", "\n", "### **Question:**\n", "\n", "> **_Use a list comprehension to square each odd number in a list. The list is input by a sequence of comma-separated numbers._** >**_Suppose the following input is supplied to the program:_**\n", "\n", "\n", "1,2,3,4,5,6,7,8,9\n", "\n", "\n", "> **_Then, the output should be:_**\n", "\n", "\n", "1,9,25,49,81\n", "\n", "\n", "---\n", "\n", "### Hints:\n", "\n", "> **_In case of input data being supplied to the question, it should be assumed to be a console input._**\n", "\n", "---\n", "\n", "\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "lst = [str(int(i) ** 2) for i in input().split(\",\") if int(i) % 2]\n", "print(\",\".join(lst))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "\"\"\"Solution by: shagun\"\"\"\n", "\n", "lst = input().split(\",\") # splits in comma position and set up in list\n", "\n", "seq = []\n", "lst = [int(i) for i in lst] # converts string to integer\n", "for i in lst:\n", " if i % 2 != 0:\n", " i = i * i\n", " seq.append(i)\n", "\n", "\n", "seq = [\n", " str(i) for i in seq\n", "] # All the integers are converted to string to be able to apply join operation\n", "print(\",\".join(seq))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "**_There were a mistake in the the test case and the solution's whice were notified and fixed with the help of @dwedigital. My warm thanks to him._**\n", "\n", "# Question 17\n", "\n", "### **Question:**\n", "\n", "> **_Write a program that computes the net amount of a bank account based a transaction log from console input. The transaction log format is shown as following:_**\n", "\n", "```\n", "D 100\n", "W 200\n", "```\n", "\n", "- D means deposit while W means withdrawal.\n", "\n", "> **_Suppose the following input is supplied to the program:_**\n", "\n", "```\n", "D 300\n", "D 300\n", "W 200\n", "D 100\n", "```\n", "\n", "> **_Then, the output should be:_**\n", "\n", "```\n", "500\n", "```\n", "\n", "---\n", "\n", "### Hints:\n", "\n", "> **_In case of input data being supplied to the question, it should be assumed to be a console input._**\n", "\n", "---\n", "\n", "\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "total = 0\n", "while True:\n", " s = input().split()\n", " if not s: # break if the string is empty\n", " break\n", " cm, num = map(\n", " str, s\n", " ) # two inputs are distributed in cm and num in string data type\n", "\n", " if cm == \"D\":\n", " total += int(num)\n", " if cm == \"W\":\n", " total -= int(num)\n", "\n", "print(total)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "\"\"\"Solution by: leonedott\"\"\"\n", "\n", "lst = []\n", "while True:\n", " x = input()\n", " if len(x) == 0:\n", " break\n", " lst.append(x)\n", "\n", "balance = 0\n", "for item in lst:\n", " if \"D\" in item:\n", " balance += int(item.strip(\"D \"))\n", " if \"W\" in item:\n", " balance -= int(item.strip(\"W \"))\n", "print(balance)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "\"\"\"Solution by: AlexanderSro\"\"\"\n", "\n", "account = 0\n", "while True:\n", " action = input(\"Deposit/Whitdrow/Balance/Quit? D/W/B/Q: \").lower()\n", " if action == \"d\":\n", " deposit = input(\"How much would you like to deposit? \")\n", " account = account + int(deposit)\n", " elif action == \"w\":\n", " withdrow = input(\"How much would you like to withdrow? \")\n", " account = account - int(withdrow)\n", " elif action == \"b\":\n", " print(account)\n", " else:\n", " quit()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "\"\"\"Solution by: ShalomPrinz\n", "\"\"\"\n", "lines = []\n", "while True:\n", " loopInput = input()\n", " if loopInput == \"done\":\n", " break\n", " else:\n", " lines.append(loopInput)\n", "\n", "lst = list(int(i[2:]) if i[0] == \"D\" else -int(i[2:]) for i in lines)\n", "print(sum(lst))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.6" } }, "nbformat": 4, "nbformat_minor": 4 } ================================================ FILE: 1.python-basic/Python-100/notebooks/Day_06.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Question 18\n", "\n", "### **Question:**\n", "\n", "> **_A website requires the users to input username and password to register. Write a program to check the validity of password input by users._**\n", "\n", "> **_Following are the criteria for checking the password:_**\n", "\n", "- **_At least 1 letter between [a-z]_**\n", "- **_At least 1 number between [0-9]_**\n", "- **_At least 1 letter between [A-Z]_**\n", "- **_At least 1 character from [$#@]_**\n", "- **_Minimum length of transaction password: 6_**\n", "- **_Maximum length of transaction password: 12_**\n", "\n", "> **_Your program should accept a sequence of comma separated passwords and will check them according to the above criteria. Passwords that match the criteria are to be printed, each separated by a comma._**\n", "\n", "> **_Example_**\n", "\n", "> **_If the following passwords are given as input to the program:_**\n", "\n", "\n", "ABd1234@1,a F1#,2w3E*,2We3345\n", "\n", "\n", "> **_Then, the output of the program should be:_**\n", "\n", "\n", "ABd1234@1\n", "\n", "\n", "---\n", "\n", "### Hints:\n", "\n", "> **_In case of input data being supplied to the question, it should be assumed to be a console input._**\n", "\n", "---\n", "\n", "\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "aaaaa\n", "\n" ] } ], "source": [ "def is_low(x): # Returns True if the string has a lowercase\n", " for i in x:\n", " if \"a\" <= i and i <= \"z\":\n", " return True\n", " return False\n", "\n", "\n", "def is_up(x): # Returns True if the string has a uppercase\n", " for i in x:\n", " if \"A\" <= i and i <= \"Z\":\n", " return True\n", " return False\n", "\n", "\n", "def is_num(x): # Returns True if the string has a numeric digit\n", " for i in x:\n", " if \"0\" <= i and i <= \"9\":\n", " return True\n", " return False\n", "\n", "\n", "def is_other(x): # Returns True if the string has any \"$#@\"\n", " for i in x:\n", " if i == \"$\" or i == \"#\" or i == \"@\":\n", " return True\n", " return False\n", "\n", "\n", "s = input().split(\",\")\n", "lst = []\n", "\n", "for i in s:\n", " length = len(i)\n", " if (\n", " 6 <= length\n", " and length <= 12\n", " and is_low(i)\n", " and is_up(i)\n", " and is_num(i)\n", " and is_other(i)\n", " ): # Checks if all the requirments are fulfilled\n", " lst.append(i)\n", "\n", "print(\",\".join(lst))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**OR**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def check(x):\n", " cnt = 6 <= len(x) and len(x) <= 12\n", " for i in x:\n", " if i.isupper():\n", " cnt += 1\n", " break\n", " for i in x:\n", " if i.islower():\n", " cnt += 1\n", " break\n", " for i in x:\n", " if i.isnumeric():\n", " cnt += 1\n", " break\n", " for i in x:\n", " if i == \"@\" or i == \"#\" or i == \"$\":\n", " cnt += 1\n", " break\n", " return (\n", " cnt == 5\n", " ) # counting if total 5 all conditions are fulfilled then returns True\n", "\n", "\n", "s = input().split(\",\")\n", "lst = filter(\n", " check, s\n", ") # Filter function pick the words from s, those returns True by check() function\n", "print(\",\".join(lst))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**OR**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import re\n", "\n", "s = input().split(\",\")\n", "lst = []\n", "\n", "for i in s:\n", " cnt = 0\n", " cnt += 6 <= len(i) and len(i) <= 12\n", " cnt += bool(\n", " re.search(\"[a-z]\", i)\n", " ) # here re module includes a function re.search() which returns the object information\n", " cnt += bool(\n", " re.search(\"[A-Z]\", i)\n", " ) # of where the pattern string i is matched with any of the [a-z]/[A-z]/[0=9]/[@#$] characters\n", " cnt += bool(\n", " re.search(\"[0-9]\", i)\n", " ) # if not a single match found then returns NONE which converts to False in boolean\n", " cnt += bool(re.search(\"[@#$]\", i)) # expression otherwise True if found any.\n", " if cnt == 5:\n", " lst.append(i)\n", "\n", "print(\",\".join(lst))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 19\n", "\n", "### **Question:**\n", "\n", "> **_You are required to write a program to sort the (name, age, score) tuples by ascending order where name is string, age and score are numbers. The tuples are input by console. The sort criteria is:_**\n", "\n", "- **_1: Sort based on name_**\n", "- **_2: Then sort based on age_**\n", "- **_3: Then sort by score_**\n", "\n", "> **_The priority is that name > age > score._**\n", "\n", "> **_If the following tuples are given as input to the program:_**\n", "\n", "\n", "Tom,19,80\n", "\n", "John,20,90\n", "\n", "Jony,17,91\n", "\n", "Jony,17,93\n", "\n", "Json,21,85\n", "\n", "\n", "> **_Then, the output of the program should be:_**\n", "\n", "\n", "[('John', '20', '90'), ('Jony', '17', '91'), ('Jony', '17', '93'), ('Json', '21', '85'), ('Tom', '19', '80')]\n", "\n", "\n", "---\n", "\n", "### Hints:\n", "\n", "> **_In case of input data being supplied to the question, it should be assumed to be a console input.We use itemgetter to enable multiple sort keys._**\n", "\n", "---\n", "\n", "\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "lst = []\n", "while True:\n", " s = input().split(\",\")\n", " if not s[0]: # breaks for blank input\n", " break\n", " lst.append(tuple(s))\n", "\n", "lst.sort(\n", " key=lambda x: (x[0], x[1], x[2])\n", ") # here key is defined by lambda and the data is sorted by element priority 0>1>2 in accending order\n", "print(lst)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.6" } }, "nbformat": 4, "nbformat_minor": 4 } ================================================ FILE: 1.python-basic/Python-100/notebooks/Day_07.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Question 20\n", "\n", "### **Question:**\n", "\n", "> **_Define a class with a generator which can iterate the numbers, which are divisible by 7, between a given range 0 and n._**\n", "\n", "---\n", "\n", "### Hints:\n", "\n", "> **_Consider use class, function and comprehension._**\n", "\n", "---\n", "\n", "\n", "\n", "**Solution: Python 3**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "\"\"\"Solution by: ShalomPrinz\n", "\"\"\"\n", "\n", "\n", "class MyGen:\n", " def by_seven(self, n):\n", " for i in range(0, int(n / 7) + 1):\n", " yield i * 7\n", "\n", "\n", "for i in MyGen().by_seven(int(input(\"Please enter a number... \"))):\n", " print(i)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "\"\"\"Solution by: Seawolf159\n", "\"\"\"\n", "\n", "\n", "class Divisible:\n", " def by_seven(self, n):\n", " for number in range(n + 1):\n", " if number % 7 == 0:\n", " yield number\n", "\n", "\n", "divisible = Divisible()\n", "generator = divisible.by_seven(int(input(\"Please insert a number. --> \")))\n", "for number in generator:\n", " print(number)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 21\n", "\n", "### **Question:**\n", "\n", "> **_A robot moves in a plane starting from the original point (0,0). The robot can move toward UP, DOWN, LEFT and RIGHT with a given steps. The trace of robot movement is shown as the following:_**\n", "\n", "```\n", "UP 5\n", "DOWN 3\n", "LEFT 3\n", "RIGHT 2\n", "```\n", "> **_The numbers after the direction are steps. Please write a program to compute the distance from current position after a sequence of movement and original point. If the distance is a float, then just print the nearest integer._**\n", "> **_Example:_**\n", "> **_If the following tuples are given as input to the program:_**\n", "\n", "```\n", "UP 5\n", "DOWN 3\n", "LEFT 3\n", "RIGHT 2\n", "```\n", "\n", "> **_Then, the output of the program should be:_**\n", "\n", "```\n", "2\n", "```\n", "---\n", "\n", "### Hints:\n", "\n", "> **_In case of input data being supplied to the question, it should be assumed to be a console input.Here distance indicates to euclidean distance.Import math module to use sqrt function._**\n", "\n", "---\n", "\n", "\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import math\n", "\n", "x, y = 0, 0\n", "while True:\n", " s = input().split()\n", " if not s:\n", " break\n", " if s[0] == \"UP\": # s[0] indicates command\n", " x -= int(s[1]) # s[1] indicates unit of move\n", " if s[0] == \"DOWN\":\n", " x += int(s[1])\n", " if s[0] == \"LEFT\":\n", " y -= int(s[1])\n", " if s[0] == \"RIGHT\":\n", " y += int(s[1])\n", " # N**P means N^P\n", "dist = round(\n", " math.sqrt(x ** 2 + y ** 2)\n", ") # euclidean distance = square root of (x^2+y^2) and rounding it to nearest integer\n", "print(dist)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.6" } }, "nbformat": 4, "nbformat_minor": 4 } ================================================ FILE: 1.python-basic/Python-100/notebooks/Day_08.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Question 22\n", "\n", "### **Question:**\n", "\n", "> **_Write a program to compute the frequency of the words from the input. The output should output after sorting the key alphanumerically._**\n", "\n", "> **_Suppose the following input is supplied to the program:_**\n", "\n", "\n", "New to Python or choosing between Python 2 and Python 3? Read Python 2 or Python 3.\n", "\n", "\n", "> **_Then, the output should be:_**\n", "\n", "```\n", "2:2\n", "3.:1\n", "3?:1\n", "New:1\n", "Python:5\n", "Read:1\n", "and:1\n", "between:1\n", "choosing:1\n", "or:2\n", "to:1\n", "```\n", "\n", "---\n", "\n", "### Hints\n", "\n", "> **_In case of input data being supplied to the question, it should be assumed to be a console input._**\n", "\n", "---\n", "\n", "\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "ss = input().split()\n", "word = sorted(set(ss)) # split words are stored and sorted as a set\n", "\n", "for i in word:\n", " print(\"{0}:{1}\".format(i, ss.count(i)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**OR**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "ss = input().split()\n", "dict = {}\n", "for i in ss:\n", " i = dict.setdefault(\n", " i, ss.count(i)\n", " ) # setdefault() function takes key & value to set it as dictionary.\n", "\n", "dict = sorted(\n", " dict.items()\n", ") # items() function returns both key & value of dictionary as a list\n", "# and then sorted. The sort by default occurs in order of 1st -> 2nd key\n", "for i in dict:\n", " print(\"%s:%d\" % (i[0], i[1]))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**OR**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "ss = input().split()\n", "dict = {\n", " i: ss.count(i) for i in ss\n", "} # sets dictionary as i-> split word & ss.count(i) -> total occurrence of i in ss\n", "dict = sorted(\n", " dict.items()\n", ") # items() function returns both key & value of dictionary as a list\n", "# and then sorted. The sort by default occurs in order of 1st -> 2nd key\n", "for i in dict:\n", " print(\"%s:%d\" % (i[0], i[1]))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**OR**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from collections import Counter\n", "\n", "ss = input().split()\n", "ss = Counter(ss) # returns key & frequency as a dictionary\n", "ss = sorted(ss.items()) # returns as a tuple list\n", "\n", "for i in ss:\n", " print(\"%s:%d\" % (i[0], i[1]))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Solution by: AnjanKumarG**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from pprint import pprint\n", "\n", "p = input().split()\n", "pprint({i: p.count(i) for i in p})" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 23\n", "\n", "### **Question:**\n", "\n", "> **_Write a method which can calculate square value of number_**\n", "\n", "---\n", "\n", "### Hints:\n", "\n", "\n", "Using the ** operator which can be written as n**p where means n^p\n", "\n", "\n", "---\n", "\n", "\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "n = int(input())\n", "print(n ** 2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 24\n", "\n", "### **Question:**\n", "\n", "> **_Python has many built-in functions, and if you do not know how to use it, you can read document online or find some books. But Python has a built-in document function for every built-in functions._**\n", "\n", "> **_Please write a program to print some Python built-in functions documents, such as abs(), int(), raw_input()_**\n", "\n", "> **_And add document for your own function_**\n", "\n", "### Hints:\n", "\n", "\n", "The built-in document method is __doc__\n", "\n", "\n", "---\n", "\n", "\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "print(str.__doc__)\n", "print(sorted.__doc__)\n", "\n", "\n", "def pow(n, p):\n", " \"\"\"\n", " param n: This is any integer number\n", " param p: This is power over n\n", " return: n to the power p = n^p\n", " \"\"\"\n", "\n", " return n ** p\n", "\n", "\n", "print(pow(3, 4))\n", "print(pow.__doc__)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 25\n", "\n", "### **Question:**\n", "\n", "> **_Define a class, which have a class parameter and have a same instance parameter._**\n", "\n", "---\n", "\n", "### Hints:\n", "\n", "\n", "Define an instance parameter, need add it in __init__ method.You can init an object with construct parameter or set the value later\n", "\n", "\n", "---\n", "\n", "\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Car name is Honda\n", "Car name is Toyota\n" ] } ], "source": [ "class Car:\n", " name = \"Car\"\n", "\n", " def __init__(self, name=None):\n", " self.name = name\n", "\n", "\n", "honda = Car(\"Honda\")\n", "print(f\"{Car.name} name is {honda.name}\")\n", "\n", "toyota = Car()\n", "toyota.name = \"Toyota\"\n", "print(f\"{Car.name} name is {toyota.name}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.6" } }, "nbformat": 4, "nbformat_minor": 4 } ================================================ FILE: 1.python-basic/Python-100/notebooks/Day_09.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Question 26\n", "\n", "### **Question:**\n", "\n", "> **_Define a function which can compute the sum of two numbers._**\n", "\n", "---\n", "\n", "### Hints:\n", "\n", "> **_Define a function with two numbers as arguments. You can compute the sum in the function and return the value._**\n", "\n", "---\n", "\n", "\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "sum = lambda n1, n2: n1 + n2 # here lambda is use to define little function as sum\n", "print(sum(1, 2))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 27\n", "\n", "### **Question:**\n", "\n", "> **_Define a function that can convert a integer into a string and print it in console._**\n", "\n", "---\n", "\n", "### Hints:\n", "\n", "> **_Use str() to convert a number to string._**\n", "\n", "---\n", "\n", "\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "conv = lambda x: str(x)\n", "n = conv(10)\n", "print(n)\n", "print(type(n)) # checks the type of the variable" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 28\n", "\n", "### **Question:**\n", "\n", "> **_Define a function that can receive two integer numbers in string form and compute their sum and then print it in console._**\n", "\n", "---\n", "\n", "### Hints:\n", "\n", "> **_Use int() to convert a string to integer._**\n", "\n", "---\n", "\n", "\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "sum = lambda s1, s2: int(s1) + int(s2)\n", "print(sum(\"10\", \"45\")) # 55" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 29\n", "\n", "### **Question:**\n", "\n", "> **_Define a function that can accept two strings as input and concatenate them and then print it in console._**\n", "\n", "---\n", "\n", "### Hints:\n", "\n", "> **_Use + sign to concatenate the strings._**\n", "\n", "---\n", "\n", "\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "sum = lambda s1, s2: s1 + s2\n", "print(sum(\"10\", \"45\")) # 1045" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 30\n", "\n", "### **Question:**\n", "\n", "> **_Define a function that can accept two strings as input and print the string with maximum length in console. If two strings have the same length, then the function should print all strings line by line._**\n", "\n", "---\n", "\n", "### Hints:\n", "\n", "> **_Use len() function to get the length of a string._**\n", "\n", "---\n", "\n", "\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def printVal(s1, s2):\n", " len1 = len(s1)\n", " len2 = len(s2)\n", " if len1 > len2:\n", " print(s1)\n", " elif len1 < len2:\n", " print(s2)\n", " else:\n", " print(s1)\n", " print(s2)\n", "\n", "\n", "s1, s2 = input().split()\n", "printVal(s1, s2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "\"\"\"Solution by: yuan1z\"\"\"\n", "func = (\n", " lambda a, b: print(max((a, b), key=len))\n", " if len(a) != len(b)\n", " else print(a + \"\\n\" + b)\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.6" } }, "nbformat": 4, "nbformat_minor": 4 } ================================================ FILE: 1.python-basic/Python-100/notebooks/Day_10.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Question 31\n", "\n", "### **Question:**\n", "\n", "> **_Define a function which can print a dictionary where the keys are numbers between 1 and 20 (both included) and the values are square of keys._**\n", "\n", "---\n", "\n", "### Hints:\n", "\n", "\n", "Use dict[key]=value pattern to put entry into a dictionary.Use ** operator to get power of a number.Use range() for loops.\n", "\n", "\n", "---\n", "\n", "\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def printDict():\n", " dict = {i: i ** 2 for i in range(1, 21)} # Using comprehension method and\n", " print(dict)\n", "\n", "\n", "printDict()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 32\n", "\n", "### **Question:**\n", "\n", "> **_Define a function which can generate a dictionary where the keys are numbers between 1 and 20 (both included) and the values are square of keys. The function should just print the keys only._**\n", "\n", "---\n", "\n", "### Hints:\n", "\n", "\n", "Use dict[key]=value pattern to put entry into a dictionary.Use ** operator to get power of a number.Use range() for loops.Use keys() to iterate keys in the dictionary. Also we can use item() to get key/value pairs.\n", "\n", "\n", "---\n", "\n", "\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def printDict():\n", " dict = {i: i ** 2 for i in range(1, 21)}\n", " print(dict.keys()) # print keys of a dictionary\n", "\n", "\n", "printDict()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 33\n", "\n", "### **Question:**\n", "\n", "> **_Define a function which can generate and print a list where the values are square of numbers between 1 and 20 (both included)._**\n", "\n", "---\n", "\n", "### Hints:\n", "\n", "\n", "Use ** operator to get power of a number.Use range() for loops.Use list.append() to add values into a list.\n", "\n", "\n", "---\n", "\n", "\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def printList():\n", " lst = [i ** 2 for i in range(1, 21)]\n", " print(lst)\n", "\n", "\n", "printList()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 34\n", "\n", "### **Question:**\n", "\n", "> **_Define a function which can generate a list where the values are square of numbers between 1 and 20 (both included). Then the function needs to print the first 5 elements in the list._**\n", "\n", "---\n", "\n", "### Hints:\n", "\n", "\n", "Use ** operator to get power of a number.Use range() for loops.Use list.append() to add values into a list.Use [n1:n2] to slice a list\n", "\n", "\n", "---\n", "\n", "\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def printList():\n", " lst = [i ** 2 for i in range(1, 21)]\n", "\n", " for i in range(5):\n", " print(lst[i])\n", "\n", "\n", "printList()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1\n", "4\n", "9\n", "16\n", "25\n" ] } ], "source": [ "\"\"\"Solution by: yuan1z && edited by: apurvmishra99\"\"\"\n", "func = lambda: ([i ** 2 for i in range(1, 21)][:5])\n", "print(*(func()), sep=\"\\n\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 35\n", "\n", "### **Question:**\n", "\n", "> **_Define a function which can generate a list where the values are square of numbers between 1 and 20 (both included). Then the function needs to print the last 5 elements in the list._**\n", "\n", "---\n", "\n", "### Hints:\n", "\n", "\n", "Use ** operator to get power of a number.Use range() for loops.Use list.append() to add values into a list.Use [n1:n2] to slice a list\n", "\n", "\n", "---\n", "\n", "\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def printList():\n", " lst = [i ** 2 for i in range(1, 21)]\n", " for i in range(19, 14, -1):\n", " print(lst[i])\n", "\n", "\n", "printList()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 36\n", "\n", "### **Question:**\n", "\n", "> **_Define a function which can generate a list where the values are square of numbers between 1 and 20 (both included). Then the function needs to print all values except the first 5 elements in the list._**\n", "\n", "---\n", "\n", "\n", "Hints: Use ** operator to get power of a number.Use range() for loops.Use list.append() to add values into a list.Use [n1:n2] to slice a list\n", "\n", "\n", "---\n", "\n", "\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def printList():\n", " lst = [i ** 2 for i in range(1, 21)]\n", " for i in range(5, 20):\n", " print(lst[i])\n", "\n", "\n", "printList()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 37\n", "\n", "### **Question:**\n", "\n", "> **_Define a function which can generate and print a tuple where the value are square of numbers between 1 and 20 (both included)._**\n", "\n", "---\n", "\n", "### Hints:\n", "\n", "\n", "Use ** operator to get power of a number.Use range() for loops.Use list.append() to add values into a list.Use tuple() to get a tuple from a list.\n", "\n", "\n", "---\n", "\n", "\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def printTupple():\n", " lst = [i ** 2 for i in range(1, 21)]\n", " print(tuple(lst))\n", "\n", "\n", "printTupple()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "\"\"\"\n", "Solution by: Seawolf159\n", "\"\"\"\n", "\n", "\n", "def square_of_numbers():\n", " return tuple(i ** 2 for i in range(1, 21))\n", "\n", "\n", "print(square_of_numbers())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "### Comment\n", "\n", "**_Problems of this section is very much easy and all of those are of a modification of same type problem which mainly focused on using some commonly used function works with list,dictionary, tupple.In my entire solutions, I havn't tried to solve problems in efficient way.Rather I tried to solve in a different way that I can.This will help a beginner to know how simplest problems can be solved in different ways._**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.6" } }, "nbformat": 4, "nbformat_minor": 4 } ================================================ FILE: 1.python-basic/Python-100/notebooks/Day_11.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Question 38\n", "\n", "### **Question:**\n", "\n", "> **_With a given tuple (1,2,3,4,5,6,7,8,9,10), write a program to print the first half values in one line and the last half values in one line._**\n", "\n", "---\n", "\n", "### Hints:\n", "\n", "> **_Use [n1:n2] notation to get a slice from a tuple._**\n", "\n", "---\n", "\n", "\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "tpl = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)\n", "\n", "for i in range(0, 5):\n", " print(tpl[i], end=\" \")\n", "print()\n", "for i in range(5, 10):\n", " print(tpl[i], end=\" \")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**OR**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "tpl = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)\n", "lst1, lst2 = [], []\n", "\n", "for i in range(0, 5):\n", " lst1.append(tpl[i])\n", "\n", "for i in range(5, 10):\n", " lst2.append(tpl[i])\n", "\n", "print(lst1)\n", "print(lst2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**OR**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "\"\"\"\n", "Solution by: CoffeeBrakeInc\n", "\"\"\"\n", "\n", "tup = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)\n", "lt = int(len(tup) / 2)\n", "print(tup[:lt], tup[lt:])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "**OR**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "\"\"\"\n", "Solution by: AasaiAlangaram\n", "\"\"\"\n", "\n", "tp = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)\n", "\n", "print(\"The Original Tuple:\", tp)\n", "\n", "[\n", " print(\"Splitted List :{List}\".format(List=tp[x : x + 5]))\n", " for x in range(0, len(tp), 5)\n", "]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 39\n", "\n", "### **Question:**\n", "\n", "> **_Write a program to generate and print another tuple whose values are even numbers in the given tuple (1,2,3,4,5,6,7,8,9,10)._**\n", "\n", "---\n", "\n", "### Hints:\n", "\n", "> **_Use \"for\" to iterate the tuple. Use tuple() to generate a tuple from a list._**\n", "\n", "---\n", "\n", "\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "tpl = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)\n", "tpl1 = tuple(i for i in tpl if i % 2 == 0)\n", "print(tpl1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**OR**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "tpl = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)\n", "tpl1 = tuple(\n", " filter(lambda x: x % 2 == 0, tpl)\n", ") # Lambda function returns True if found even element.\n", "# Filter removes data for which function returns False\n", "print(tpl1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 40\n", "\n", "### **Question:**\n", "\n", "> **_Write a program which accepts a string as input to print \"Yes\" if the string is \"yes\" or \"YES\" or \"Yes\", otherwise print \"No\"._**\n", "\n", "---\n", "\n", "### Hints:\n", "\n", "> **_Use if statement to judge condition._**\n", "\n", "---\n", "\n", "\n", "\n", "**Solution: Python 3**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "\"\"\"\n", "Solution by: Seawolf159\n", "\"\"\"\n", "text = input(\"Please type something. --> \")\n", "if text == \"yes\" or text == \"YES\" or text == \"Yes\":\n", " print(\"Yes\")\n", "else:\n", " print(\"No\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "\"\"\"\n", "Solution by: AasaiAlangaram\n", "\"\"\"\n", "input = input(\"Enter string:\")\n", "output = \"\".join(\n", " [\"Yes\" if input == \"yes\" or input == \"YES\" or input == \"Yes\" else \"No\"]\n", ")\n", "print(str(output))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 41\n", "\n", "### **Question:**\n", "\n", "> **_Write a program which can map() to make a list whose elements are square of elements in [1,2,3,4,5,6,7,8,9,10]._**\n", "\n", "---\n", "\n", "### Hints:\n", "\n", "> **_Use map() to generate a list.Use lambda to define anonymous functions._**\n", "\n", "---\n", "\n", "\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# No different way of code is written as the requirment is specificly mentioned in problem description\n", "\n", "li = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]\n", "squaredNumbers = map(lambda x: x ** 2, li) # returns map type object data\n", "print(list(squaredNumbers)) # converting the object into list" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 42\n", "\n", "### **Question:**\n", "\n", "> **_Write a program which can map() and filter() to make a list whose elements are square of even number in [1,2,3,4,5,6,7,8,9,10]._**\n", "\n", "---\n", "\n", "### Hints:\n", "\n", "> **_Use map() to generate a list.Use filter() to filter elements of a list.Use lambda to define anonymous functions._**\n", "\n", "---\n", "\n", "\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def even(x):\n", " return x % 2 == 0\n", "\n", "\n", "def squer(x):\n", " return x * x\n", "\n", "\n", "li = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]\n", "li = map(\n", " squer, filter(even, li)\n", ") # first filters number by even number and the apply map() on the resultant elements\n", "print(list(li))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 43\n", "\n", "### **Question:**\n", "\n", "> **_Write a program which can filter() to make a list whose elements are even number between 1 and 20 (both included)._**\n", "\n", "---\n", "\n", "### Hints:\n", "\n", "> **_Use filter() to filter elements of a list.Use lambda to define anonymous functions._**\n", "\n", "---\n", "\n", "\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def even(x):\n", " return x % 2 == 0\n", "\n", "\n", "evenNumbers = filter(even, range(1, 21))\n", "print(list(evenNumbers))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.6" } }, "nbformat": 4, "nbformat_minor": 4 } ================================================ FILE: 1.python-basic/Python-100/notebooks/Day_12.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Question 44\n", "\n", "### **Question:**\n", "\n", "> **_Write a program which can map() to make a list whose elements are square of numbers between 1 and 20 (both included)._**\n", "\n", "---\n", "\n", "### Hints:\n", "\n", "> **_Use map() to generate a list. Use lambda to define anonymous functions._**\n", "\n", "---\n", "\n", "\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "code_folding": [] }, "outputs": [], "source": [ "def sqr(x):\n", " return x * x\n", "\n", "\n", "squaredNumbers = list(map(sqr, range(1, 21)))\n", "print(squaredNumbers)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 45\n", "\n", "### **Question:**\n", "\n", "> **_Define a class named American which has a static method called printNationality._**\n", "\n", "---\n", "\n", "### Hints:\n", "\n", "> **_Use @staticmethod decorator to define class static method.There are also two more methods.To know more, go to this [link](https://realpython.com/blog/python/instance-class-and-static-methods-demystified/)._**\n", "\n", "---\n", "\n", "\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "class American:\n", " @staticmethod\n", " def printNationality():\n", " print(\"I am American\")\n", "\n", "\n", "american = American()\n", "american.printNationality() # this will not run if @staticmethod does not decorates the function.\n", "# Because the class has no instance.\n", "\n", "American.printNationality() # this will run even though the @staticmethod\n", "# does not decorate printNationality()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 46\n", "\n", "### **Question:**\n", "\n", "> **_Define a class named American and its subclass NewYorker._**\n", "\n", "---\n", "\n", "### Hints:\n", "\n", "> **Use class Subclass(ParentClass) to define a subclass.\\***\n", "\n", "---\n", "\n", "\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "class American:\n", " pass\n", "\n", "\n", "class NewYorker(American):\n", " pass\n", "\n", "\n", "american = American()\n", "newyorker = NewYorker()\n", "\n", "print(american)\n", "print(newyorker)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.6" } }, "nbformat": 4, "nbformat_minor": 4 } ================================================ FILE: 1.python-basic/Python-100/notebooks/Day_13.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Question 47\n", "\n", "### **Question**\n", "\n", "> **_Define a class named Circle which can be constructed by a radius. The Circle class has a method which can compute the area._**\n", "\n", "---\n", "\n", "### Hints\n", "\n", "> **_Use def methodName(self) to define a method._**\n", "\n", "---\n", "\n", "\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "class Circle:\n", " def __init__(self, r):\n", " self.radius = r\n", "\n", " def area(self):\n", " return 3.1416 * (self.radius ** 2)\n", "\n", "\n", "circle = Circle(5)\n", "print(circle.area())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 48\n", "\n", "### **Question**\n", "\n", "> **_Define a class named Rectangle which can be constructed by a length and width. The Rectangle class has a method which can compute the area._**\n", "\n", "---\n", "\n", "### Hints\n", "\n", "> **_Use def methodName(self) to define a method._**\n", "\n", "---\n", "\n", "\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "class Rectangle:\n", " def __init__(self, l, w):\n", " self.length = l\n", " self.width = w\n", "\n", " def area(self):\n", " return self.length * self.width\n", "\n", "\n", "rect = Rectangle(2, 4)\n", "print(rect.area())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 49\n", "\n", "### **Question**\n", "\n", "> **_Define a class named Shape and its subclass Square. The Square class has an init function which takes a length as argument. Both classes have a area function which can print the area of the shape where Shape's area is 0 by default._**\n", "\n", "---\n", "\n", "### Hints\n", "\n", "> **_To override a method in super class, we can define a method with the same name in the super class._**\n", "\n", "---\n", "\n", "\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "class Shape:\n", " def __init__(self):\n", " pass\n", "\n", " def area(self):\n", " return 0\n", "\n", "\n", "class Square(Shape):\n", " def __init__(self, length=0):\n", " Shape.__init__(self)\n", " self.length = length\n", "\n", " def area(self):\n", " return self.length * self.length\n", "\n", "\n", "Asqr = Square(5)\n", "print(Asqr.area()) # prints 25 as given argument\n", "\n", "print(Square().area()) # prints zero as default area" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 50\n", "\n", "### **Question**\n", "\n", "> **_Please raise a RuntimeError exception._**\n", "\n", "---\n", "\n", "### Hints\n", "\n", "> **_Use raise to raise an exception._**\n", "\n", "---\n", "\n", "**Solution:**" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "ename": "RuntimeError", "evalue": "something wrong", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mRuntimeError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mRuntimeError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"something wrong\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;31mRuntimeError\u001b[0m: something wrong" ] } ], "source": [ "raise RuntimeError(\"something wrong\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "## Conclusion\n", "\n", "**_Well It seems that the above problems are very much focused on basic concpets and implimantation of object oriented programming.As the concepts are not about to solve any functional problem rather design the structure , so both codes are very much similar in there implimantation part._**" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.6" } }, "nbformat": 4, "nbformat_minor": 4 } ================================================ FILE: 1.python-basic/Python-100/notebooks/Day_14.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Question 51\n", "\n", "### **Question**\n", "\n", "> **_Write a function to compute 5/0 and use try/except to catch the exceptions._**\n", "\n", "---\n", "\n", "### Hints\n", "\n", "> **_Use try/except to catch exceptions._**\n", "\n", "---\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def divide():\n", " return 5 / 0\n", "\n", "\n", "try:\n", " divide()\n", "except ZeroDivisionError as ze:\n", " print(\"Why on earth you are dividing a number by ZERO!!\")\n", "except:\n", " print(\"Any other exception\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 52\n", "\n", "### **Question**\n", "\n", "> **_Define a custom exception class which takes a string message as attribute._**\n", "\n", "---\n", "\n", "### Hints\n", "\n", "> **_To define a custom exception, we need to define a class inherited from Exception._**\n", "\n", "---\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "class CustomException(Exception):\n", " \"\"\"Exception raised for custom purpose\n", "\n", " Attributes:\n", " message -- explanation of the error\n", " \"\"\"\n", "\n", " def __init__(self, message):\n", " self.message = message\n", "\n", "\n", "num = int(input())\n", "\n", "try:\n", " if num < 10:\n", " raise CustomException(\"Input is less than 10\")\n", " elif num > 10:\n", " raise CustomException(\"Input is grater than 10\")\n", "except CustomException as ce:\n", " print(\"The error raised: \" + ce.message)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 53\n", "\n", "### **Question**\n", "\n", "> **_Assuming that we have some email addresses in the \"username@companyname.com\" format, please write program to print the user name of a given email address. Both user names and company names are composed of letters only._**\n", "\n", "> **_Example:\n", "> If the following email address is given as input to the\n", "> program:_**\n", "\n", "> john@google.com\n", "\n", "> **_Then, the output of the program should be:_**\n", "\n", "> john\n", "\n", "> **_In case of input data being supplied to the question, it should be assumed to be a console input._**\n", "\n", "---\n", "\n", "### Hints\n", "\n", "> **_Use \\w to match letters._**\n", "\n", "---\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "email = \"john@google.com\"\n", "email = email.split(\"@\")\n", "print(email[0])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "**OR**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import re\n", "\n", "email = \"john@google.com elise@python.com\"\n", "pattern = \"(\\w+)@\\w+.com\"\n", "ans = re.findall(pattern, email)\n", "print(ans)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.6" } }, "nbformat": 4, "nbformat_minor": 4 } ================================================ FILE: 1.python-basic/Python-100/notebooks/Day_15.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Question 54\n", "\n", "### **Question**\n", "\n", "> **_Assuming that we have some email addresses in the \"username@companyname.com\" format, please write program to print the company name of a given email address. Both user names and company names are composed of letters only._**\n", "\n", "> **_Example:\n", "> If the following email address is given as input to the program:_**\n", "\n", "\n", "> john@google.com\n", "\n", "\n", "> **_Then, the output of the program should be:_**\n", "\n", "\n", "> google\n", "\n", "\n", "> **_In case of input data being supplied to the question, it should be assumed to be a console input._**\n", "\n", "---\n", "\n", "### Hints\n", "\n", "> **_Use \\w to match letters._**\n", "\n", "---\n", "\n", "\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import re\n", "\n", "email = \"john@google.com elise@python.com\"\n", "pattern = \"\\w+@(\\w+).com\"\n", "ans = re.findall(pattern, email)\n", "print(ans)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 55\n", "\n", "### **Question**\n", "\n", "> **_Write a program which accepts a sequence of words separated by whitespace as input to print the words composed of digits only._**\n", "\n", "> **_Example:\n", "> If the following words is given as input to the program:_**\n", "\n", "\n", "> 2 cats and 3 dogs.\n", "\n", "\n", "> **_Then, the output of the program should be:_**\n", "\n", "\n", "> ['2', '3']\n", "\n", "\n", "> **_In case of input data being supplied to the question, it should be assumed to be a console input._**\n", "\n", "---\n", "\n", "### Hints\n", "\n", "> **_Use re.findall() to find all substring using regex._**\n", "\n", "---\n", "\n", "\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import re\n", "\n", "email = input()\n", "pattern = \"\\d+\"\n", "ans = re.findall(pattern, email)\n", "print(ans)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**OR**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "email = input().split()\n", "ans = []\n", "for word in email:\n", " if word.isdigit(): # can also use isnumeric() / isdecimal() function instead\n", " ans.append(word)\n", "print(ans)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**OR**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "email = input().split()\n", "ans = [word for word in email if word.isdigit()] # using list comprehension method\n", "print(ans)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 56\n", "\n", "### **Question**\n", "\n", "> **_Print a unicode string \"hello world\"._**\n", "\n", "---\n", "\n", "### Hints\n", "\n", "> **_Use u'strings' format to define unicode string._**\n", "\n", "---\n", "\n", "\n", "\n", "# Question 57\n", "\n", "### **Question**\n", "\n", "> **_Write a program to read an ASCII string and to convert it to a unicode string encoded by utf-8._**\n", "\n", "---\n", "\n", "### Hints\n", "\n", "> **_Use unicode()/encode() function to convert._**\n", "\n", "---\n", "\n", "\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "s = input()\n", "u = s.encode(\"utf-8\")\n", "print(u)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 58\n", "\n", "### **Question**\n", "\n", "> **_Write a special comment to indicate a Python source code file is in unicode._**\n", "\n", "---\n", "\n", "### Hints\n", "\n", "> **_Use unicode() function to convert._**\n", "\n", "---\n", "\n", "**Solution:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# -*- coding: utf-8 -*-" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 59\n", "\n", "### **Question**\n", "\n", "> **_Write a program to compute 1/2+2/3+3/4+...+n/n+1 with a given n input by console (n>0)._**\n", "\n", "> **_Example:\n", "> If the following n is given as input to the program:_**\n", "\n", "\n", "> 5\n", "\n", "\n", "> **_Then, the output of the program should be:_**\n", "\n", "\n", "> 3.55\n", "\n", "\n", "> **_In case of input data being supplied to the question, it should be assumed to be a console input._**\n", "\n", "---\n", "\n", "### Hints\n", "\n", "> **_Use float() to convert an integer to a float.Even if not converted it wont cause a problem because python by default understands the data type of a value_**\n", "\n", "---\n", "\n", "\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "n = int(input())\n", "sum = 0\n", "for i in range(1, n + 1):\n", " sum += i / (i + 1)\n", "print(round(sum, 2)) # rounded to 2 decimal point" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.6" } }, "nbformat": 4, "nbformat_minor": 4 } ================================================ FILE: 1.python-basic/Python-100/notebooks/Day_16.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Question 60\n", "\n", "### **Question**\n", "\n", "> **_Write a program to compute:_**\n", "\n", "\n", "> $f(n)=f(n-1)+100$ when n>0\n", "\n", "> and $f(0)=0$\n", "\n", "\n", "> **_with a given n input by console (n>0)._**\n", "\n", "> **_Example:\n", "> If the following n is given as input to the program:_**\n", "\n", "\n", "> 5\n", "\n", "\n", "> **_Then, the output of the program should be:_**\n", "\n", "\n", "> 500\n", "\n", "\n", "> **_In case of input data being supplied to the question, it should be assumed to be a console input._**\n", "\n", "---\n", "\n", "### Hints\n", "\n", "> **_We can define recursive function in Python._**\n", "\n", "---\n", "\n", "\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def f(n):\n", " if n == 0:\n", " return 0\n", " return f(n - 1) + 100\n", "\n", "\n", "n = int(input())\n", "print(f(n))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 61\n", "\n", "### **Question**\n", "\n", "> **_The Fibonacci Sequence is computed based on the following formula:_**\n", "\n", "\n", "> $f(n)=0$ if n=0\n", "\n", "> $f(n)=1$ if n=1\n", "\n", "> $f(n)=f(n-1)+f(n-2)$ if n>1\n", "\n", "\n", "> **_Please write a program to compute the value of f(n) with a given n input by console._**\n", "\n", "> **_Example:\n", "> If the following n is given as input to the program:_**\n", "\n", "\n", "> 7\n", "\n", "\n", "> **_Then, the output of the program should be:_**\n", "\n", "\n", "> 13\n", "\n", "\n", "> **_In case of input data being supplied to the question, it should be assumed to be a console input._**\n", "\n", "---\n", "\n", "### Hints\n", "\n", "> **_We can define recursive function in Python._**\n", "\n", "---\n", "\n", "\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def f(n):\n", " if n < 2:\n", " return n\n", " return f(n - 1) + f(n - 2)\n", "\n", "\n", "n = int(input())\n", "print(f(n))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 62\n", "\n", "### **Question**\n", "\n", "> **_The Fibonacci Sequence is computed based on the following formula:_**\n", "\n", "\n", "> $f(n)=0$ if n=0\n", "\n", "> $f(n)=1$ if n=1\n", "\n", "> $f(n)=f(n-1)+f(n-2)$ if n>1\n", "\n", "\n", "> **_Please write a program to compute the value of f(n) with a given n input by console._**\n", "\n", "> **_Example:\n", "> If the following n is given as input to the program:_**\n", "\n", "> 7\n", "\n", "> **_Then, the output of the program should be:_**\n", "\n", "> 0,1,1,2,3,5,8,13\n", "\n", "> **_In case of input data being supplied to the question, it should be assumed to be a console input._**\n", "\n", "---\n", "\n", "### Hints\n", "\n", "> **_We can define recursive function in Python.\n", "> Use list comprehension to generate a list from an existing list.\n", "> Use string.join() to join a list of strings._**\n", "\n", "---\n", "\n", "\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def f(n):\n", " if n < 2:\n", " fibo[n] = n\n", " return fibo[n]\n", " fibo[n] = f(n - 1) + f(n - 2)\n", " return fibo[n]\n", "\n", "\n", "n = int(input())\n", "fibo = [0] * (n + 1) # initialize a list of size (n+1)\n", "f(n) # call once and it will set value to fibo[0-n]\n", "fibo = [str(i) for i in fibo] # converting integer data to string type\n", "ans = \",\".join(fibo) # joining all string element of fibo with ',' character\n", "print(ans)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 63\n", "\n", "### **Question**\n", "\n", "> **_Please write a program using generator to print the even numbers between 0 and n in comma separated form while n is input by console._**\n", "\n", "> **_Example:\n", "> If the following n is given as input to the program:_**\n", "\n", "> 10\n", "\n", "> **_Then, the output of the program should be:_**\n", "\n", "> 0,2,4,6,8,10\n", "\n", "> **_In case of input data being supplied to the question, it should be assumed to be a console input._**\n", "\n", "---\n", "\n", "### Hints\n", "\n", "> **_Use yield to produce the next value in generator._**\n", "\n", "---\n", "\n", "**Solution:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def EvenGenerator(n):\n", " i = 0\n", " while i <= n:\n", " if i % 2 == 0:\n", " yield i\n", " i += 1\n", "\n", "\n", "n = int(raw_input())\n", "values = []\n", "for i in EvenGenerator(n):\n", " values.append(str(i))\n", "\n", "print \",\".join(values)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**OR**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Solution by: StartZer0\n", "n = int(input())\n", "\n", "for i in range(0, n + 1, 2):\n", " if i < n - 1:\n", " print(i, end=\",\")\n", " else:\n", " print(i)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 64\n", "\n", "### **Question**\n", "\n", "> **_Please write a program using generator to print the numbers which can be divisible by 5 and 7 between 0 and n in comma separated form while n is input by console._**\n", "\n", "> **_Example:\n", "> If the following n is given as input to the program:_**\n", "\n", "> 100\n", "\n", "> **_Then, the output of the program should be:_**\n", "\n", "> 0,35,70\n", "\n", "> **_In case of input data being supplied to the question, it should be assumed to be a console input._**\n", "\n", "---\n", "\n", "### Hints\n", "\n", "> **_Use yield to produce the next value in generator._**\n", "\n", "---\n", "\n", "\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def generate(n):\n", " for i in range(n + 1):\n", " if (\n", " i % 35 == 0\n", " ): # 5*7 = 35, if a number is divisible by a & b then it is also divisible by a*b\n", " yield i\n", "\n", "\n", "n = int(input())\n", "resp = [str(i) for i in generate(n)]\n", "print(\",\".join(resp))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.6" } }, "nbformat": 4, "nbformat_minor": 4 } ================================================ FILE: 1.python-basic/Python-100/notebooks/Day_17.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Question 65\n", "\n", "### **Question**\n", "\n", "> **_Please write assert statements to verify that every number in the list [2,4,6,8] is even._**\n", "\n", "---\n", "\n", "### Hints\n", "\n", "> **_Use \"assert expression\" to make assertion._**\n", "\n", "---\n", "\n", "\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "data = [2, 4, 5, 6]\n", "for i in data:\n", " assert i % 2 == 0, \"{} is not an even number\".format(i)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 66\n", "\n", "### **Question**\n", "\n", "> **_Please write a program which accepts basic mathematic expression from console and print the evaluation result._**\n", "\n", "> **_Example:\n", "> If the following n is given as input to the program:_**\n", "\n", "\n", "> 35 + 3\n", "\n", "\n", "> **_Then, the output of the program should be:_**\n", "\n", "\n", "> 38\n", "\n", "\n", "---\n", "\n", "### Hints\n", "\n", "> **_Use eval() to evaluate an expression._**\n", "\n", "---\n", "\n", "\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "expression = input()\n", "ans = eval(expression)\n", "print(ans)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 67\n", "\n", "### **Question**\n", "\n", "> **_Please write a binary search function which searches an item in a sorted list. The function should return the index of element to be searched in the list._**\n", "\n", "---\n", "\n", "### Hints\n", "\n", "> **_Use if/elif to deal with conditions._**\n", "\n", "---\n", "\n", "**Solutions:**\n", "\n", "### Solution by AasaiAlangaram" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def binary_search_Ascending(array, target):\n", " lower = 0\n", " upper = len(array)\n", " print(\"Array Length:\", upper)\n", " while lower < upper:\n", " x = (lower + upper) // 2\n", " print(\"Middle Value:\", x)\n", " value = array[x]\n", " if target == value:\n", " return x\n", " elif target > value:\n", " lower = x\n", " elif target < value:\n", " upper = x\n", "\n", "\n", "Array = [1, 5, 8, 10, 12, 13, 55, 66, 73, 78, 82, 85, 88, 99]\n", "print(\"The Value Found at Index:\", binary_search_Ascending(Array, 82))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "**OR**\n", "\n", "### Solution by yuan1z: Python" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "idx = 0\n", "\n", "\n", "def bs(num, num_list):\n", " global idx\n", " if len(num_list) == 1:\n", " if num_list[0] == num:\n", " return idx\n", " else:\n", " return \"No exit in the list\"\n", " elif num in num_list[: len(num_list) // 2]:\n", " return bs(num, num_list[: len(num_list) // 2])\n", " else:\n", " idx += len(num_list) // 2\n", " return bs(num, num_list[len(num_list) // 2 :])\n", "\n", "\n", "print(bs(66, [1, 5, 8, 10, 12, 13, 55, 66, 73, 78, 82, 85, 88, 99, 100]))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 68\n", "\n", "### **Question**\n", "\n", "> **_Please generate a random float where the value is between 10 and 100 using Python module._**\n", "\n", "---\n", "\n", "### Hints\n", "\n", "> **_Use random.random() to generate a random float in [0,1]._**\n", "\n", "---\n", "\n", "\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import random\n", "\n", "rand_num = random.uniform(10, 100)\n", "print(rand_num)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 69\n", "\n", "### **Question**\n", "\n", "> **_Please generate a random float where the value is between 5 and 95 using Python module._**\n", "\n", "---\n", "\n", "### Hints\n", "\n", "> **_Use random.random() to generate a random float in [0,1]._**\n", "\n", "---\n", "\n", "\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import random\n", "\n", "rand_num = random.uniform(5, 95)\n", "print(rand_num)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.6" } }, "nbformat": 4, "nbformat_minor": 4 } ================================================ FILE: 1.python-basic/Python-100/notebooks/Day_18.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Question 70\n", "\n", "### **Question**\n", "\n", "> **_Please write a program to output a random even number between 0 and 10 inclusive using random module and list comprehension._**\n", "\n", "---\n", "\n", "### Hints\n", "\n", "> **_Use random.choice() to a random element from a list._**\n", "\n", "---\n", "\n", "\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import random\n", "\n", "resp = [i for i in range(0, 11, 2)]\n", "print(random.choice(resp))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 71\n", "\n", "### **Question**\n", "\n", "> **_Please write a program to output a random number, which is divisible by 5 and 7, between 10 and 150 inclusive using random module and list comprehension._**\n", "\n", "---\n", "\n", "### Hints\n", "\n", "> **_Use random.choice() to a random element from a list._**\n", "\n", "---\n", "\n", "\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import random\n", "\n", "resp = [i for i in range(10, 151) if i % 35 == 0]\n", "print(random.choice(resp))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 72\n", "\n", "### **Question**\n", "\n", "> **_Please write a program to generate a list with 5 random numbers between 100 and 200 inclusive._**\n", "\n", "---\n", "\n", "### Hints\n", "\n", "> **_Use random.sample() to generate a list of random values._**\n", "\n", "---\n", "\n", "\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import random\n", "\n", "resp = random.sample(range(100, 201), 5)\n", "print(resp)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 73\n", "\n", "### **Question**\n", "\n", "> **_Please write a program to randomly generate a list with 5 even numbers between 100 and 200 inclusive._**\n", "\n", "---\n", "\n", "### Hints\n", "\n", "> **_Use random.sample() to generate a list of random values._**\n", "\n", "---\n", "\n", "\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import random\n", "\n", "resp = random.sample(range(100, 201, 2), 5)\n", "print(resp)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 74\n", "\n", "### **Question**\n", "\n", "> **_Please write a program to randomly generate a list with 5 numbers, which are divisible by 5 and 7 , between 1 and 1000 inclusive._**\n", "\n", "---\n", "\n", "### Hints\n", "\n", "> **_Use random.sample() to generate a list of random values._**\n", "\n", "---\n", "\n", "\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import random\n", "\n", "lst = [i for i in range(1, 1001) if i % 35 == 0]\n", "resp = random.sample(lst, 5)\n", "print(resp)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.6" } }, "nbformat": 4, "nbformat_minor": 4 } ================================================ FILE: 1.python-basic/Python-100/notebooks/Day_19.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Question 75\n", "\n", "### **Question**\n", "\n", "> **_Please write a program to randomly print a integer number between 7 and 15 inclusive._**\n", "\n", "---\n", "\n", "### Hints\n", "\n", "> **_Use random.randrange() to a random integer in a given range._**\n", "\n", "---\n", "\n", "**Solution:**" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "8\n" ] } ], "source": [ "import random\n", "\n", "print(random.randrange(7, 16))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 76\n", "\n", "### **Question**\n", "\n", "> **_Please write a program to compress and decompress the string \"hello world!hello world!hello world!hello world!\"._**\n", "\n", "---\n", "\n", "### Hints\n", "\n", "> **_Use zlib.compress() and zlib.decompress() to compress and decompress a string._**\n", "\n", "---\n", "\n", "**Solution:**" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "b'x\\x9c\\xcbH\\xcd\\xc9\\xc9W(\\xcf/\\xcaIQ\\xcc \\x82\\r\\x00\\xbd[\\x11\\xf5'\n", "b'hello world!hello world!hello world!hello world!'\n" ] } ], "source": [ "import zlib\n", "\n", "t = zlib.compress(b'hello world!hello world!hello world!hello world!')\n", "print(t)\n", "print(zlib.decompress(t))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 77\n", "\n", "### **Question**\n", "\n", "> **_Please write a program to print the running time of execution of \"1+1\" for 100 times._**\n", "\n", "---\n", "\n", "### Hints\n", "\n", "> **_Use timeit() function to measure the running time._**\n", "\n", "---\n", "\n", "\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import datetime\n", "\n", "before = datetime.datetime.now()\n", "for i in range(100):\n", " x = 1 + 1\n", "after = datetime.datetime.now()\n", "execution_time = after - before\n", "print(execution_time.microseconds)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**OR**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import time\n", "\n", "before = time.time()\n", "for i in range(100):\n", " x = 1 + 1\n", "after = time.time()\n", "execution_time = after - before\n", "print(execution_time)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 78\n", "\n", "### **Question**\n", "\n", "> **_Please write a program to shuffle and print the list [3,6,7,8]._**\n", "\n", "---\n", "\n", "### Hints\n", "\n", "> **_Use shuffle() function to shuffle a list._**\n", "\n", "---\n", "\n", "\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import random\n", "\n", "lst = [3, 6, 7, 8]\n", "random.shuffle(lst)\n", "print(lst)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**OR**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import random\n", "\n", "# shuffle with a chosen seed\n", "lst = [3, 6, 7, 8]\n", "seed = 7\n", "random.Random(seed).shuffle(lst)\n", "print(lst)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 79\n", "\n", "### **Question**\n", "\n", "> **_Please write a program to generate all sentences where subject is in [\"I\", \"You\"] and verb is in [\"Play\", \"Love\"] and the object is in [\"Hockey\",\"Football\"]._**\n", "\n", "---\n", "\n", "### Hints\n", "\n", "> **_Use list[index] notation to get a element from a list._**\n", "\n", "---\n", "\n", "\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "subjects = [\"I\", \"You\"]\n", "verbs = [\"Play\", \"Love\"]\n", "objects = [\"Hockey\", \"Football\"]\n", "\n", "for sub in subjects:\n", " for verb in verbs:\n", " for obj in objects:\n", " print(\"{} {} {}\".format(sub, verb, obj))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.6" } }, "nbformat": 4, "nbformat_minor": 4 } ================================================ FILE: 1.python-basic/Python-100/notebooks/Day_20.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Question 80\n", "\n", "### **Question**\n", "\n", "> **_Please write a program to print the list after removing even numbers in [5,6,77,45,22,12,24]._**\n", "\n", "---\n", "\n", "### Hints\n", "\n", "> **_Use list comprehension to delete a bunch of element from a list._**\n", "\n", "---\n", "\n", "\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def isEven(n):\n", " return n % 2 != 0\n", "\n", "\n", "li = [5, 6, 77, 45, 22, 12, 24]\n", "lst = list(filter(isEven, li))\n", "print(lst)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**OR**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "li = [5, 6, 77, 45, 22, 12, 24]\n", "lst = list(filter(lambda n: n % 2 != 0, li))\n", "print(lst)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 81\n", "\n", "### **Question**\n", "\n", "> **_By using list comprehension, please write a program to print the list after removing numbers which are divisible by 5 and 7 in [12,24,35,70,88,120,155]._**\n", "\n", "---\n", "\n", "### Hints\n", "\n", "> **_Use list comprehension to delete a bunch of element from a list._**\n", "\n", "---\n", "\n", "\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "li = [12, 24, 35, 70, 88, 120, 155]\n", "li = [x for x in li if x % 35 != 0]\n", "print(li)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 82\n", "\n", "### **Question**\n", "\n", "> **_By using list comprehension, please write a program to print the list after removing the 0th, 2nd, 4th,6th numbers in [12,24,35,70,88,120,155]._**\n", "\n", "---\n", "\n", "### Hints\n", "\n", "> **_Use list comprehension to delete a bunch of element from a list.\n", "> Use enumerate() to get (index, value) tuple._**\n", "\n", "---\n", "\n", "\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "li = [12, 24, 35, 70, 88, 120, 155]\n", "li = [li[i] for i in range(len(li)) if i % 2 != 0]\n", "print(li)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 83\n", "\n", "### **Question**\n", "\n", "> **_By using list comprehension, please write a program to print the list after removing the 2nd - 4th numbers in [12,24,35,70,88,120,155]._**\n", "\n", "---\n", "\n", "### Hints\n", "\n", "> **_Use list comprehension to delete a bunch of element from a list.\n", "> Use enumerate() to get (index, value) tuple._**\n", "\n", "---\n", "\n", "\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# to be written\n", "li = [12, 24, 35, 70, 88, 120, 155]\n", "li = [li[i] for i in range(len(li)) if i < 3 or 4 < i]\n", "print(li)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 84\n", "\n", "### **Question**\n", "\n", "> **_By using list comprehension, please write a program generate a 3\\*5\\*8 3D array whose each element is 0._**\n", "\n", "---\n", "\n", "### Hints\n", "\n", "> **_Use list comprehension to make an array._**\n", "\n", "---\n", "\n", "**Solution:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "array = [[[0 for col in range(8)] for col in range(5)] for row in range(3)]\n", "print array" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.6" } }, "nbformat": 4, "nbformat_minor": 4 } ================================================ FILE: 1.python-basic/Python-100/notebooks/Day_21.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Question 85\n", "\n", "### **Question**\n", "\n", "> **_By using list comprehension, please write a program to print the list after removing the 0th,4th,5th numbers in [12,24,35,70,88,120,155]._**\n", "\n", "---\n", "\n", "### Hints\n", "\n", "> **_Use list comprehension to delete a bunch of element from a list.Use enumerate() to get (index, value) tuple._**\n", "\n", "---\n", "\n", "\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "li = [12, 24, 35, 70, 88, 120, 155]\n", "li = [li[i] for i in range(len(li)) if i not in (0, 4, 5)]\n", "print(li)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 86\n", "\n", "### **Question**\n", "\n", "> **_By using list comprehension, please write a program to print the list after removing the value 24 in [12,24,35,24,88,120,155]._**\n", "\n", "---\n", "\n", "### Hints\n", "\n", "> **_Use list's remove method to delete a value._**\n", "\n", "---\n", "\n", "\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "li = [12, 24, 35, 24, 88, 120, 155]\n", "li.remove(24) # this will remove only the first occurrence of 24\n", "print(li)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 87\n", "\n", "### **Question**\n", "\n", "> **_With two given lists [1,3,6,78,35,55] and [12,24,35,24,88,120,155], write a program to make a list whose elements are intersection of the above given lists._**\n", "\n", "---\n", "\n", "### Hints\n", "\n", "> **_Use set() and \"&=\" to do set intersection operation._**\n", "\n", "---\n", "\n", "\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "list1 = [1, 3, 6, 78, 35, 55]\n", "list2 = [12, 24, 35, 24, 88, 120, 155]\n", "set1 = set(list1)\n", "set2 = set(list2)\n", "intersection = set1 & set2\n", "print(intersection)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**OR**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "list1 = [1, 3, 6, 78, 35, 55]\n", "list2 = [12, 24, 35, 24, 88, 120, 155]\n", "set1 = set(list1)\n", "set2 = set(list2)\n", "intersection = set.intersection(set1, set2)\n", "print(intersection)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 88\n", "\n", "### **Question**\n", "\n", "> **_With a given list [12,24,35,24,88,120,155,88,120,155], write a program to print this list after removing all duplicate values with original order reserved._**\n", "\n", "---\n", "\n", "### Hints\n", "\n", "> **_Use set() to store a number of values without duplicate._**\n", "\n", "---\n", "\n", "\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "li = [12, 24, 35, 24, 88, 120, 155, 88, 120, 155]\n", "for i in li:\n", " if li.count(i) > 1:\n", " li.remove(i)\n", "print(li)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**OR**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def removeDuplicate(li):\n", " seen = {} # dictionary\n", " for item in li:\n", " if item not in seen:\n", " seen[item] = True\n", " yield item\n", "\n", "\n", "li = [12, 24, 35, 24, 88, 120, 155, 88, 120, 155]\n", "ans = list(removeDuplicate(li))\n", "print(ans)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 89\n", "\n", "### **Question**\n", "\n", "> **_Define a class Person and its two child classes: Male and Female. All classes have a method \"getGender\" which can print \"Male\" for Male class and \"Female\" for Female class._**\n", "\n", "---\n", "\n", "### Hints\n", "\n", "> **_Use Subclass(Parentclass) to define a child class._**\n", "\n", "---\n", "\n", "**Solution:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "class Person(object):\n", " def getGender(self):\n", " return \"Unknown\"\n", "\n", "\n", "class Male(Person):\n", " def getGender(self):\n", " return \"Male\"\n", "\n", "\n", "class Female(Person):\n", " def getGender(self):\n", " return \"Female\"\n", "\n", "\n", "aMale = Male()\n", "aFemale = Female()\n", "print(aMale.getGender())\n", "print(aFemale.getGender())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.6" } }, "nbformat": 4, "nbformat_minor": 4 } ================================================ FILE: 1.python-basic/Python-100/notebooks/Day_22.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Question 90\n", "\n", "### **Question**\n", "\n", "> **_Please write a program which count and print the numbers of each character in a string input by console._**\n", "\n", "> **_Example:\n", "> If the following string is given as input to the program:_**\n", "\n", "```\n", "abcdefgabc\n", "```\n", "\n", "> **_Then, the output of the program should be:_**\n", "\n", "```\n", "a,2\n", "c,2\n", "b,2\n", "e,1\n", "d,1\n", "g,1\n", "f,1\n", "```\n", "\n", "### Hints\n", "\n", "> **_Use dict to store key/value pairs.\n", "> Use dict.get() method to lookup a key with default value._**\n", "\n", "---\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import string\n", "\n", "s = input()\n", "for letter in string.ascii_lowercase:\n", " cnt = s.count(letter)\n", " if cnt > 0:\n", " print(\"{},{}\".format(letter, cnt))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**OR**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "s = input()\n", "for letter in range(ord(\"a\"), ord(\"z\") + 1): # ord() gets the ascii value of a char\n", " letter = chr(letter) # chr() gets the char of an ascii value\n", " cnt = s.count(letter)\n", " if cnt > 0:\n", " print(\"{},{}\".format(letter, cnt))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 91\n", "\n", "### **Question**\n", "\n", "> **_Please write a program which accepts a string from console and print it in reverse order._**\n", "\n", "> **Example:\n", "> If the following string is given as input to the program:\\***\n", "\n", "\n", "rise to vote sir\n", "\n", "\n", "> **_Then, the output of the program should be:_**\n", "\n", "ris etov ot esir\n", "\n", "### Hints\n", "\n", "> **_Use list[::-1] to iterate a list in a reverse order._**\n", "\n", "---\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "s = input()\n", "s = \"\".join(reversed(s))\n", "print(s)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 92\n", "\n", "### **Question**\n", "\n", "> **_Please write a program which accepts a string from console and print the characters that have even indexes._**\n", "\n", "> **_Example:\n", "> If the following string is given as input to the program:_**\n", "```\n", "H1e2l3l4o5w6o7r8l9d\n", "```\n", "> **_Then, the output of the program should be:_**\n", "```\n", "Helloworld\n", "```\n", "### Hints\n", "\n", "> **_Use list[::2] to iterate a list by step 2._**\n", "\n", "---\n", "\n", "\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "s = \"H1e2l3l4o5w6o7r8l9d\"\n", "s = [s[i] for i in range(len(s)) if i % 2 == 0]\n", "print(\"\".join(s))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**OR**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "s = \"H1e2l3l4o5w6o7r8l9d\"\n", "ns = \"\"\n", "for i in range(len(s)):\n", " if i % 2 == 0:\n", " ns += s[i]\n", "print(ns)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 93\n", "\n", "### **Question**\n", "\n", "> **_Please write a program which prints all permutations of [1,2,3]_**\n", "\n", "---\n", "\n", "### Hints\n", "\n", "> **_Use itertools.permutations() to get permutations of list._**\n", "\n", "---\n", "\n", "**Solution:**" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[(1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1)]\n" ] } ], "source": [ "import itertools\n", "\n", "print(list(itertools.permutations([1, 2, 3])))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 94\n", "\n", "### **Question**\n", "\n", "> **_Write a program to solve a classic ancient Chinese puzzle:\n", "> We count 35 heads and 94 legs among the chickens and rabbits in a farm. How many rabbits and how many chickens do we have?_**\n", "\n", "---\n", "\n", "### Hints\n", "\n", "> **_Use for loop to iterate all possible solutions._**\n", "\n", "---\n", "\n", "**Solution:**" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "code_folding": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(23, 12)\n" ] } ], "source": [ "def solve(numheads, numlegs):\n", " ns = \"No solutions!\"\n", " for i in range(numheads + 1):\n", " j = numheads - i\n", " if 2 * i + 4 * j == numlegs:\n", " return i, j\n", " return ns, ns\n", "\n", "\n", "numheads = 35\n", "numlegs = 94\n", "solutions = solve(numheads, numlegs)\n", "print(solutions)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.6" } }, "nbformat": 4, "nbformat_minor": 4 } ================================================ FILE: 1.python-basic/Python-100/notebooks/Day_23.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# The extended part of the repository starts from this page. Previous 94 problems were collected from the repository mentioned in intro. The following problems are collected from Hackerrank and other resources from internet.\n", "\n", "# Question 95\n", "\n", "### **Question**\n", "\n", "> **_Given the participants' score sheet for your University Sports Day, you are required to find the runner-up score. You are given scores. Store them in a list and find the score of the runner-up._**\n", "\n", "> **_If the following string is given as input to the program:_**\n", ">\n", "> 5\n", "> 2 3 6 6 5\n", ">\n", "> **_Then, the output of the program should be:_**\n", ">\n", "> 5\n", "\n", "### Hints\n", "\n", "> **_Make the scores unique and then find 2nd best number_**\n", "\n", "---\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "5 2\n", "2\n" ] } ], "source": [ "arr = map(int, input().split())\n", "arr = list(set(arr))\n", "arr.sort()\n", "print(arr[-2])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "\"\"\"\n", "Solution by: mishrasunny-coder\n", "\"\"\"\n", "num = int(input(\"Enter num: \"))\n", "L = []\n", "\n", "while True:\n", " L.append(num)\n", " num = int(input(\"Enter another: \"))\n", " if num == 0:\n", " break\n", "\n", "L1 = list(set(L[:]))\n", "L2 = sorted(L1)\n", "print(L2)\n", "\n", "print(f\"The runner up is {L2[-2]}\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 96\n", "\n", "### **Question**\n", "\n", "> **_You are given a string S and width W.\n", "> Your task is to wrap the string into a paragraph of width._**\n", "\n", "> **_If the following string is given as input to the program:_**\n", ">\n", "> ABCDEFGHIJKLIMNOQRSTUVWXYZ\n", "> 4\n", ">\n", "> **_Then, the output of the program should be:_**\n", ">\n", "> ABCD\n", "> EFGH\n", "> IJKL\n", "> IMNO\n", "> QRST\n", "> UVWX\n", "> YZ\n", "\n", "### Hints\n", "\n", "> **_Use wrap function of textwrap module_**\n", "\n", "---\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import textwrap\n", "\n", "\n", "def wrap(string, max_width):\n", " string = textwrap.wrap(string, max_width)\n", " string = \"\\n\".join(string)\n", " return string\n", "\n", "\n", "if __name__ == \"__main__\":\n", " string, max_width = input(), int(input())\n", " result = wrap(string, max_width)\n", " print(result)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "\"\"\"\n", "Solution by: mishrasunny-coder\n", "\"\"\"\n", "import textwrap\n", "\n", "string = input()\n", "width = int(input())\n", "\n", "print(textwrap.fill(string, width))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 97\n", "\n", "### **Question**\n", "\n", "> **_You are given an integer, N. Your task is to print an alphabet rangoli of size N. (Rangoli is a form of Indian folk art based on creation of patterns.)_**\n", "\n", "> **_Different sizes of alphabet rangoli are shown below:_**\n", ">\n", "> $size = 3$\n", ">\n", "> ----c----\n", "\n", "> --c-b-c--\n", "\n", "> c-b-a-b-c\n", "\n", "> --c-b-c--\n", "\n", "> ----c----\n", ">\n", "> $size = 5$\n", ">\n", "> --------e--------\n", "\n", "> ------e-d-e------\n", "\n", "> ----e-d-c-d-e----\n", "\n", "> --e-d-c-b-c-d-e--\n", "\n", "> e-d-c-b-a-b-c-d-e\n", "\n", "> --e-d-c-b-c-d-e--\n", "\n", "> ----e-d-c-d-e----\n", "\n", "> ------e-d-e------\n", "\n", "> --------e--------\n", "\n", "### Hints\n", "\n", "> **_First print the half of the Rangoli in the given way and save each line in a list. Then print the list in reverse order to get the rest._**\n", "\n", "---\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import string\n", "\n", "\n", "def print_rangoli(size):\n", " n = size\n", " alph = string.ascii_lowercase\n", " width = 4 * n - 3\n", "\n", " ans = []\n", " for i in range(n):\n", " left = \"-\".join(alph[n - i - 1 : n])\n", " mid = left[-1:0:-1] + left\n", " final = mid.center(width, \"-\")\n", " ans.append(final)\n", "\n", " if len(ans) > 1:\n", " for i in ans[n - 2 :: -1]:\n", " ans.append(i)\n", " ans = \"\\n\".join(ans)\n", " print(ans)\n", "\n", "\n", "if __name__ == \"__main__\":\n", " n = int(input())\n", " print_rangoli(n)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 98\n", "\n", "### **Question**\n", "\n", "> **_You are given a date. Your task is to find what the day is on that date._**\n", "\n", "**Input**\n", "\n", "> **_A single line of input containing the space separated month, day and year, respectively, in MM DD YYYY format._**\n", ">\n", "> 08 05 2015\n", "\n", "**Output**\n", "\n", "> **_Output the correct day in capital letters._**\n", ">\n", "> WEDNESDAY\n", "\n", "---\n", "\n", "### Hints\n", "\n", "> **_Use weekday function of calender module_**\n", "\n", "---\n", "\n", "**Solution:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import calendar\n", "\n", "month, day, year = map(int, input().split())\n", "\n", "dayId = calendar.weekday(year, month, day)\n", "print(calendar.day_name[dayId].upper())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 99\n", "\n", "### **Question**\n", "\n", "> **_Given 2 sets of integers, M and N, print their symmetric difference in ascending order. The term symmetric difference indicates those values that exist in either M or N but do not exist in both._**\n", "\n", "**Input**\n", "\n", "> **_The first line of input contains an integer, M.The second line contains M space-separated integers.The third line contains an integer, N.The fourth line contains N space-separated integers._**\n", ">\n", "> 4\n", "> 2 4 5 9\n", "> 4\n", "> 2 4 11 12\n", "\n", "**Output**\n", "\n", "> **_Output the symmetric difference integers in ascending order, one per line._**\n", ">\n", "> 5\n", "> 9\n", "> 11\n", "> 12\n", "\n", "---\n", "\n", "### Hints\n", "\n", "> **_Use \\'^\\' to make symmetric difference operation._**\n", "\n", "---\n", "\n", "**Solution:**" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2\n", "1\n", "1\n", "1\n" ] } ], "source": [ "n = int(input())\n", "set1 = set(map(int, input().split()))\n", "\n", "m = int(input())\n", "set2 = set(map(int, input().split()))\n", "\n", "ans = list(set1 ^ set2)\n", "ans.sort()\n", "for i in ans:\n", " print(i)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.6" } }, "nbformat": 4, "nbformat_minor": 4 } ================================================ FILE: 1.python-basic/Python-100/notebooks/Day_24.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Question 100\n", "\n", "### **Question**\n", "\n", "> **_You are given words. Some words may repeat. For each word, output its number of occurrences. The output order should correspond with the input order of appearance of the word. See the sample input/output for clarification._**\n", "\n", "> **_If the following string is given as input to the program:_**\n", ">\n", "> 4\n", "> bcdef\n", "> abcdefg\n", "> bcde\n", "> bcdef\n", ">\n", "> **_Then, the output of the program should be:_**\n", ">\n", "> 3\n", "> 2 1 1\n", "\n", "### Hints\n", "\n", "> **_Make a list to get the input order and a dictionary to count the word frequency_**\n", "\n", "---\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "n = int(input())\n", "\n", "word_list = []\n", "word_dict = {}\n", "\n", "for i in range(n):\n", " word = input()\n", " if word not in word_dict:\n", " word_list.append(word)\n", " word_dict[word] = word_dict.get(word, 0) + 1\n", "\n", "print(len(word_list))\n", "for word in word_list:\n", " print(word_dict[word], end=\" \")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 101\n", "\n", "### **Question**\n", "\n", "> **_You are given a string.Your task is to count the frequency of letters of the string and print the letters in descending order of frequency._**\n", "\n", "> **_If the following string is given as input to the program:_**\n", ">\n", "> aabbbccde\n", ">\n", "> **_Then, the output of the program should be:_**\n", ">\n", "> b 3\n", "> a 2\n", "> c 2\n", "> d 1\n", "> e 1\n", "\n", "### Hints\n", "\n", "> **_Count frequency with dictionary and sort by Value from dictionary Items_**\n", "\n", "---\n", "\n", "**Solutions:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "word = input()\n", "dct = {}\n", "for i in word:\n", " dct[i] = dct.get(i, 0) + 1\n", "\n", "dct = sorted(dct.items(), key=lambda x: (-x[1], x[0]))\n", "for i in dct:\n", " print(i[0], i[1])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "\"\"\"Solution by: yuan1z\"\"\"\n", "\n", "X = input()\n", "my_set = set(X)\n", "arr = []\n", "for item in my_set:\n", " arr.append([item, X.count(item)])\n", "tmp = sorted(arr, key=lambda x: (-x[1], x[0]))\n", "\n", "for i in tmp:\n", " print(i[0] + \" \" + str(i[1]))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "\"\"\"Solution by: StartZer0\"\"\"\n", "\n", "s = list(input())\n", "\n", "dict_count_ = {k: s.count(k) for k in s}\n", "list_of_tuples = [(k, v) for k, v in dict_count_.items()]\n", "list_of_tuples.sort(key=lambda x: x[1], reverse=True)\n", "\n", "for item in list_of_tuples:\n", " print(item[0], item[1])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 102\n", "\n", "### **Question**\n", "\n", "> **_Write a Python program that accepts a string and calculate the number of digits and letters._**\n", "\n", "**Input**\n", "\n", "> Hello321Bye360\n", "\n", "**Output**\n", "\n", "> Digit - 6\n", "\n", "> Letter - 8\n", "\n", "---\n", "\n", "### Hints\n", "\n", "> **_Use isdigit() and isalpha() function_**\n", "\n", "---\n", "\n", "**Solution:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "word = input()\n", "digit, letter = 0, 0\n", "for char in word:\n", " digit += char.isdigit()\n", " letter += char.isalpha()\n", "\n", "print(\"Digit -\", digit)\n", "print(\"Letter -\", letter)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# Question 103\n", "\n", "### **Question**\n", "\n", "> **_Given a number N.Find Sum of 1 to N Using Recursion_**\n", "\n", "**Input**\n", "\n", "> 5\n", "\n", "**Output**\n", "\n", "> 15\n", "\n", "---\n", "\n", "### Hints\n", "\n", "> **_Make a recursive function to get the sum_**\n", "\n", "---\n", "\n", "**Solution:**" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def rec(n):\n", " if n == 0:\n", " return n\n", " return rec(n - 1) + n\n", "\n", "\n", "n = int(input())\n", "sum = rec(n)\n", "print(sum)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "# To Be Continued..." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.6" } }, "nbformat": 4, "nbformat_minor": 4 } ================================================ FILE: 1.python-basic/Python_Basic.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Python语言基础" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "本章是python语言的基础部分,也是后续内容的基础。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1 Python数据类型" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1.1 字符串" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "在Python中用引号引起来的字符集称之为字符串,比如:'hello'、\"my Python\"、\"2+3\"等都是字符串\n", "Python中字符串中使用的引号可以是单引号、双引号跟三引号" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "hello world!\n" ] } ], "source": [ "print ('hello world!')" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "It is a \"dog\"!\n" ] } ], "source": [ "c = 'It is a \"dog\"!'\n", "print (c)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "It's a dog!\n" ] } ], "source": [ "c1= \"It's a dog!\"\n", "print (c1)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "hello\n", "world\n", "!\n" ] } ], "source": [ "c2 = \"\"\"hello\n", "world\n", "!\"\"\"\n", "print (c2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 转义字符'\\'" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "转义字符\\可以转义很多字符,比如\\n表示换行,\\t表示制表符,字符\\本身也要转义,所以\\\\表示的字符就是\\" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "It's a dog!\n", "hello world!\n", "hello Python!\n", "\\\t\\\n" ] } ], "source": [ "print ('It\\'s a dog!')\n", "print (\"hello world!\\nhello Python!\")\n", "print ('\\\\\\t\\\\')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "原样输出引号内字符串可以使用在引号前加r" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\\\\\\t\\\\\n" ] } ], "source": [ "print (r'\\\\\\t\\\\')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 子字符串及运算" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "True\n", "False\n" ] } ], "source": [ "s = 'Python'\n", "print( 'Py' in s)\n", "print( 'py' in s)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "取子字符串有两种方法,使用[]索引或者切片运算法[:],这两个方法使用面非常广" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "t\n" ] } ], "source": [ "print (s[2])" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "yth\n" ] } ], "source": [ "print (s[1:4])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 字符串连接与格式化输出" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "The first word is \"hello\", and the second word is \"world\"\n", "hello world!\n" ] } ], "source": [ "word1 = '\"hello\"'\n", "word2 = '\"world\"'\n", "sentence = word1.strip('\"') + ' ' + word2.strip('\"') + '!'\n", "\n", "print( 'The first word is %s, and the second word is %s' %(word1, word2))\n", "print (sentence)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1.2 整数与浮点数" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 整数\n", "\n", "Python可以处理任意大小的整数,当然包括负整数,在程序中的表示方法和数学上的写法一模一样" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "7\n" ] } ], "source": [ "i = 7\n", "print (i)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "10" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "7 + 3" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "4" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "7 - 3" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "21" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "7 * 3" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "343" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "7 ** 3" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2.3333333333333335" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "7 / 3#Python3之后,整数除法和浮点数除法已经没有差异" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "7 % 3" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "7//3" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 浮点数" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2.3333333333333335" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "7.0 / 3" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "314.0" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "3.14 * 10 ** 2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "其它表示方法" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "15" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "0b1111" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "255" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "0xff" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1.2e-05" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "1.2e-5" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "更多运算" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1.0\n" ] } ], "source": [ "import math\n", "\n", "print (math.log(math.e)) # 更多运算可查阅文档" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1.3 布尔值" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "True" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "False" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "False" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "False" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "True and False" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "True or False" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "False" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "not True" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "True + False" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "18 >= 6 * 3 or 'py' in 'Python'" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "False" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "18 >= 6 * 3 and 'py' in 'Python'" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "18 >= 6 * 3 and 'Py' in 'Python'" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1.4 日期时间" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "time.struct_time(tm_year=2016, tm_mon=7, tm_mday=20, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=2, tm_yday=202, tm_isdst=-1)\n" ] } ], "source": [ "import time\n", "\n", "now = time.strptime('2016-07-20', '%Y-%m-%d')\n", "print (now)" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'2016-07-20'" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "time.strftime('%Y-%m-%d', now)" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "5" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import datetime\n", "\n", "someDay = datetime.date(1999,2,10)\n", "anotherDay = datetime.date(1999,2,15)\n", "deltaDay = anotherDay - someDay\n", "deltaDay.days" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "还有其他一些datetime格式\n", "![](images/09b1dbf9ccdb4b69b614a0875b4e5f4c_006tKfTcgy1fkr9s9113dj30g80i7weq.jpg)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 查看变量类型" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "NoneType" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type(None)" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "float" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type(1.0)" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "bool" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type(True)" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "str" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s=\"NoneType\"\n", "type(s)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 类型转换" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'10086'" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "str(10086)" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [], "source": [ "?float()" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "10086.0" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "float(10086)" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "10086" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" } ], "source": [ "int('10086')" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(10086+0j)" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "complex(10086)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2 Python数据结构" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "列表(list)、元组(tuple)、集合(set)、字典(dict)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2.1 列表(list)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "用来存储一连串元素的容器,列表用[]来表示,其中元素的类型可不相同。" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0, 1, 2, 3, 4, 5]\n" ] } ], "source": [ "mylist= [0, 1, 2, 3, 4, 5]\n", "print (mylist)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "列表索引和切片" ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[4]= 4\n", "[-4]= 2\n", "[0:4]= [0, 1, 2, 3]\n", "[:4]= [0, 1, 2, 3]\n", "[4:]= [4, 5]\n", "[0:4:2]= [0, 2]\n", "[-5:-1:]= [1, 2, 3, 4]\n", "[-2::-1]= [4, 3, 2, 1, 0]\n" ] } ], "source": [ "# 索引从0开始,含左不含右\n", "print ('[4]=', mylist[4])\n", "print ('[-4]=', mylist[-4])\n", "print ('[0:4]=', mylist[0:4])\n", "print ('[:4]=', mylist[:4])#dddd\n", "print( '[4:]=', mylist[4:])\n", "print ('[0:4:2]=', mylist[0:4:2])\n", "print ('[-5:-1:]=', mylist[-5:-1:])\n", "print ('[-2::-1]=', mylist[-2::-1])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "修改列表" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "小月\n", "小楠\n", "19978\n" ] } ], "source": [ "mylist[3] = \"小月\"\n", "print (mylist[3])\n", "\n", "mylist[5]=\"小楠\"\n", "print (mylist[5])\n", "\n", "mylist[5]=19978\n", "print (mylist[5])\n" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0, 1, 2, '小月', 4, 19978]\n" ] } ], "source": [ "print (mylist)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "插入元素" ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0, 1, 2, '小月', 4, 19978, 'han', 'long', 'wan']\n" ] } ], "source": [ "mylist.append('han') # 添加到尾部\n", "mylist.extend(['long', 'wan'])\n", "print (mylist)" ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[0, [90, 80, 75, 66], 1, 2, '小月', 4, 19978, 'han', 'long', 'wan']" ] }, "execution_count": 51, "metadata": {}, "output_type": "execute_result" } ], "source": [ "scores = [90, 80, 75, 66]\n", "mylist.insert(1, scores) # 添加到指定位置\n", "mylist" ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [], "source": [ "a=[]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "删除元素" ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[90, 80, 75, 66]\n", "[0, 1, 2, '小月', 4, 19978, 'han', 'long', 'wan']\n" ] } ], "source": [ "print (mylist.pop(1)) # 该函数返回被弹出的元素,不传入参数则删除最后一个元素\n", "print (mylist)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "判断元素是否在列表中等" ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "True\n", "False\n" ] } ], "source": [ "print( 'wan' in mylist)\n", "print ('han' not in mylist)" ] }, { "cell_type": "code", "execution_count": 55, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1" ] }, "execution_count": 55, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mylist.count('wan')" ] }, { "cell_type": "code", "execution_count": 56, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "8" ] }, "execution_count": 56, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mylist.index('wan')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "range函数生成整数列表" ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "range(0, 10)\n", "range(-5, 5)\n", "range(-10, 10, 2)\n", "range(16, 10, -1)\n" ] } ], "source": [ "print (range(10))\n", "print (range(-5, 5))\n", "print (range(-10, 10, 2))\n", "print (range(16, 10, -1))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2.2 元组(tuple)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "元组类似列表,元组里面的元素也是进行索引计算。列表里面的元素的值可以修改,而元组里面的元素的值不能修改,只能读取。元组的符号是()。" ] }, { "cell_type": "code", "execution_count": 58, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "('ming', 'jun', 'qiang', 'wu', [90, 80, 75, 66])" ] }, "execution_count": 58, "metadata": {}, "output_type": "execute_result" } ], "source": [ "studentsTuple = (\"ming\", \"jun\", \"qiang\", \"wu\", scores)\n", "studentsTuple" ] }, { "cell_type": "code", "execution_count": 59, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "TypeError\n" ] } ], "source": [ "try:\n", " studentsTuple[1] = 'fu'\n", "except TypeError:\n", " print ('TypeError')" ] }, { "cell_type": "code", "execution_count": 60, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "('ming', 'jun', 'qiang', 'wu', [90, 100, 75, 66])" ] }, "execution_count": 60, "metadata": {}, "output_type": "execute_result" } ], "source": [ "scores[1]= 100\n", "studentsTuple" ] }, { "cell_type": "code", "execution_count": 61, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 61, "metadata": {}, "output_type": "execute_result" } ], "source": [ "'ming' in studentsTuple" ] }, { "cell_type": "code", "execution_count": 62, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "('ming', 'jun', 'qiang', 'wu')" ] }, "execution_count": 62, "metadata": {}, "output_type": "execute_result" } ], "source": [ "studentsTuple[0:4]" ] }, { "cell_type": "code", "execution_count": 63, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1" ] }, "execution_count": 63, "metadata": {}, "output_type": "execute_result" } ], "source": [ "studentsTuple.count('ming')" ] }, { "cell_type": "code", "execution_count": 64, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1" ] }, "execution_count": 64, "metadata": {}, "output_type": "execute_result" } ], "source": [ "studentsTuple.index('jun')" ] }, { "cell_type": "code", "execution_count": 65, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "5" ] }, "execution_count": 65, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(studentsTuple)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2.3 集合(set)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Python中集合主要有两个功能,一个功能是进行集合操作,另一个功能是消除重复元素。 集合的格式是:set(),其中()内可以是列表、字典或字符串,因为字符串是以列表的形式存储的" ] }, { "cell_type": "code", "execution_count": 66, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{0, 1, 2, 'han', 4, 'long', 'wan', 19978, '小月'}\n" ] } ], "source": [ "studentsSet = set(mylist)\n", "print (studentsSet)" ] }, { "cell_type": "code", "execution_count": 67, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{0, 1, 2, 'han', 4, 'long', 'xu', 'wan', 19978, '小月'}\n" ] } ], "source": [ "studentsSet.add('xu')\n", "print (studentsSet)" ] }, { "cell_type": "code", "execution_count": 68, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{0, 1, 2, 'han', 4, 'long', 'wan', 19978, '小月'}\n" ] } ], "source": [ "studentsSet.remove('xu')\n", "print (studentsSet)" ] }, { "cell_type": "code", "execution_count": 70, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "a= {'n', 'g', 'm', 'c', 's', 'b', 'a'}\n" ] } ], "source": [ "a = set(\"abcnmaaaaggsng\")\n", "print ('a=', a)" ] }, { "cell_type": "code", "execution_count": 71, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "b= {'f', 'm', 'd', 'c'}\n" ] } ], "source": [ "b = set(\"cdfm\")\n", "print ('b=', b)" ] }, { "cell_type": "code", "execution_count": 72, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "x= {'c', 'm'}\n" ] } ], "source": [ "#交集\n", "x = a & b \n", "print( 'x=', x)" ] }, { "cell_type": "code", "execution_count": 73, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "y= {'g', 'n', 'f', 'c', 'm', 's', 'b', 'a', 'd'}\n", "z= {'g', 'n', 's', 'b', 'a'}\n", "{'g', 'n', 's', 'b', 'a'}\n" ] } ], "source": [ "#并集\n", "y = a | b\n", "print ('y=', y)\n", "#差集\n", "z = a - b\n", "print( 'z=', z)\n", "#去除重复元素\n", "new = set(a)\n", "print( z)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2.4字典(dict)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Python中的字典dict也叫做关联数组,用大括号{}括起来,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度,其中key不能重复。" ] }, { "cell_type": "code", "execution_count": 74, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "guilin\n" ] } ], "source": [ "k = {\"name\":\"weiwei\", \"home\":\"guilin\"}\n", "print (k[\"home\"])" ] }, { "cell_type": "code", "execution_count": 75, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "dict_keys(['name', 'home'])\n", "dict_values(['weiwei', 'guilin'])\n" ] } ], "source": [ "print( k.keys())\n", "print( k.values())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "添加、修改字典里面的项目" ] }, { "cell_type": "code", "execution_count": 76, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'name': 'guangzhou', 'home': 'guilin', 'like': 'music'}\n" ] } ], "source": [ "k[\"like\"] = \"music\"\n", "k['name'] = 'guangzhou'\n", "print (k)" ] }, { "cell_type": "code", "execution_count": 77, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "-1" ] }, "execution_count": 77, "metadata": {}, "output_type": "execute_result" } ], "source": [ "k.get('edu', -1) # 通过dict提供的get方法,如果key不存在,可以返回None,或者自己指定的value" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "删除key-value元素" ] }, { "cell_type": "code", "execution_count": 78, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'name': 'guangzhou', 'home': 'guilin'}\n" ] } ], "source": [ "k.pop('like')\n", "print (k)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2.5 列表、元组、集合、字典的互相转换" ] }, { "cell_type": "code", "execution_count": 79, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "list" ] }, "execution_count": 79, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type(mylist)" ] }, { "cell_type": "code", "execution_count": 80, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(0, 1, 2, '小月', 4, 19978, 'han', 'long', 'wan')" ] }, "execution_count": 80, "metadata": {}, "output_type": "execute_result" } ], "source": [ "tuple(mylist)" ] }, { "cell_type": "code", "execution_count": 81, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['name', 'home']" ] }, "execution_count": 81, "metadata": {}, "output_type": "execute_result" } ], "source": [ "list(k)" ] }, { "cell_type": "code", "execution_count": 82, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "{'A': 1, 'B': 2, 'C': 3}\n" ] } ], "source": [ "zl = zip(('A', 'B', 'C'), [1, 2, 3, 4]) # zip可以将列表、元组、集合、字典‘缝合’起来\n", "print (zl)\n", "print (dict(zl))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 3 Python控制流" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "在Python中通常的情况下程序的执行是从上往下执行的,而某些时候我们为了改变程序的执行顺序,使用控制流语句控制程序执行方式。Python中有三种控制流类型:顺序结构、分支结构、循环结构。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "另外,Python可以使用分号\";\"分隔语句,但一般是使用换行来分隔;语句块不用大括号\"{}\",而使用缩进(可以使用四个空格)来表示" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3.1 顺序结构" ] }, { "cell_type": "code", "execution_count": 83, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "36\n" ] } ], "source": [ "s = '7'\n", "num = int(s) # 一般不使用这种分隔方式\n", "num -= 1 # num = num - 1 \n", "num *= 6 # num = num * 6\n", "print (num)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3.2 分支结构:Python中if语句是用来判断选择执行哪个语句块的" ] }, { "cell_type": "raw", "metadata": {}, "source": [ "if :\n", " 执行语句块\n", "elif :\n", " 执行语句块\n", "else: # 都不满足\n", " 执行语句块\n", " \n", "# elif子句可以有多条,elif和else部分可省略" ] }, { "cell_type": "code", "execution_count": 84, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "..........\n" ] } ], "source": [ "salary = 1000\n", "if salary > 10000:\n", " print (\"Wow!!!!!!!\")\n", "elif salary > 5000:\n", " print (\"That's OK.\")\n", "elif salary > 3000:\n", " print (\"5555555555\")\n", "else:\n", " print (\"..........\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3.3 循环结构" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "while 循环" ] }, { "cell_type": "raw", "metadata": {}, "source": [ "while :\n", " 循环执行语句块\n", "else: # 不满足条件\n", " 执行语句块\n", "\n", "#else部分可以省略" ] }, { "cell_type": "code", "execution_count": 85, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1\n", "2\n", "3\n", "4\n", "5\n", "Hello\n", "Hello\n", "Hello\n", "Hello\n", "Done\n" ] } ], "source": [ "a = 1\n", "while a < 10:\n", " if a <= 5:\n", " print (a)\n", " else:\n", " print (\"Hello\")\n", " a = a + 1\n", "else:\n", " print (\"Done\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- for 循环" ] }, { "cell_type": "raw", "metadata": {}, "source": [ "for (条件变量) in (集合):\n", " 执行语句块\n", " \n", "# “集合”并不单指set,而是“形似”集合的列表、元组、字典、数组都可以进行循环\n", "# 条件变量可以有多个" ] }, { "cell_type": "code", "execution_count": 86, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Yao 226\n", "Sharq 216\n", "AI 183\n" ] } ], "source": [ "heights = {'Yao':226, 'Sharq':216, 'AI':183}\n", "for i in heights:\n", " print (i, heights[i])" ] }, { "cell_type": "code", "execution_count": 87, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Yao 226\n", "Sharq 216\n", "AI 183\n" ] } ], "source": [ "for key, value in heights.items():\n", " print(key, value)" ] }, { "cell_type": "code", "execution_count": 88, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "5050\n" ] } ], "source": [ "total = 0\n", "for i in range(1, 101):\n", " total += i#total=total+i\n", "print (total)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3.4 break、continue和pass" ] }, { "cell_type": "raw", "metadata": {}, "source": [ "break:跳出循环\n", "continue:跳出当前循环,继续下一次循环\n", "pass:占位符,什么也不做" ] }, { "cell_type": "code", "execution_count": 89, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1\n", "2\n" ] } ], "source": [ "for i in range(1, 5):\n", " if i == 3:\n", " break\n", " print (i)" ] }, { "cell_type": "code", "execution_count": 90, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1\n", "2\n", "4\n" ] } ], "source": [ "for i in range(1, 5):\n", " if i == 3:\n", " continue\n", " print (i)" ] }, { "cell_type": "code", "execution_count": 91, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1\n", "2\n", "3\n", "4\n" ] } ], "source": [ "for i in range(1, 5):\n", " if i == 3:\n", " pass\n", " print (i)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3.5 列表生成式" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "三种形式\n", "- [<表达式> for (条件变量) in (集合)]\n", "- [<表达式> for (条件变量) in (集合) if <'True or False'表达式>]\n", "- [<表达式> if <'True or False'表达式> else <表达式> for (条件变量) in (集合) ]" ] }, { "cell_type": "code", "execution_count": 92, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['Apple', 'Watermelon', 'Banana']" ] }, "execution_count": 92, "metadata": {}, "output_type": "execute_result" } ], "source": [ "fruits = ['\"Apple', 'Watermelon', '\"Banana\"']\n", "[x.strip('\"') for x in fruits]" ] }, { "cell_type": "code", "execution_count": 93, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['Apple', 'Watermelon', 'Banana']" ] }, "execution_count": 93, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 另一种写法\n", "test_list=[]\n", "for x in fruits:\n", " x=x.strip('\"')\n", " test_list.append(x)\n", "test_list" ] }, { "cell_type": "code", "execution_count": 94, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[1, 9, 25, 49, 81, 121, 169, 225, 289, 361]" ] }, "execution_count": 94, "metadata": {}, "output_type": "execute_result" } ], "source": [ "[x ** 2 for x in range(21) if x%2]" ] }, { "cell_type": "code", "execution_count": 95, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[1, 9, 25, 49, 81, 121, 169, 225, 289, 361]" ] }, "execution_count": 95, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 另一种写法\n", "test_list=[]\n", "for x in range(21):\n", " if x%2:\n", " x=x**2\n", " test_list.append(x)\n", "test_list" ] }, { "cell_type": "code", "execution_count": 96, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']" ] }, "execution_count": 96, "metadata": {}, "output_type": "execute_result" } ], "source": [ "[m + n for m in 'ABC' for n in 'XYZ']" ] }, { "cell_type": "code", "execution_count": 97, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']" ] }, "execution_count": 97, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 另一种写法\n", "test_list=[]\n", "for m in 'ABC':\n", " for n in 'XYZ':\n", " x=m+n\n", " test_list.append(x)\n", "test_list" ] }, { "cell_type": "code", "execution_count": 98, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['x=A', 'y=B', 'z=C']" ] }, "execution_count": 98, "metadata": {}, "output_type": "execute_result" } ], "source": [ "d = {'x': 'A', 'y': 'B', 'z': 'C' }\n", "[k + '=' + v for k, v in d.items()]" ] }, { "cell_type": "code", "execution_count": 99, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['x=A', 'y=B', 'z=C']" ] }, "execution_count": 99, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 另一种写法\n", "test_list=[]\n", "for k, v in d.items():\n", " x=k + '=' + v\n", " test_list.append(x)\n", "test_list" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 4 Python函数" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "函数是用来封装特定功能的实体,可对不同类型和结构的数据进行操作,达到预定目标" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4.1 调用函数" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- Python内置了很多有用的函数,我们可以直接调用,进行数据分析时多数情况下是通过调用定义好的函数来操作数据的" ] }, { "cell_type": "code", "execution_count": 100, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2\n", "9\n" ] } ], "source": [ "str1 = \"as\"\n", "int1 = -9\n", "print (len(str1))\n", "print (abs(int1))" ] }, { "cell_type": "code", "execution_count": 101, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['Apple', 'Banana', 'Melon', 'Grape']\n" ] } ], "source": [ "fruits = ['Apple', 'Banana', 'Melon']\n", "fruits.append('Grape')\n", "print (fruits)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4.2 定义函数" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "当系统自带函数不足以完成指定的功能时,需要用户自定义函数来完成。" ] }, { "cell_type": "raw", "metadata": {}, "source": [ "def 函数名():\n", " 函数内容\n", " 函数内容\n", " " ] }, { "cell_type": "code", "execution_count": 102, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "9" ] }, "execution_count": 102, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def my_abs(x):\n", " if x >= 0:\n", " return x\n", " else:\n", " return -x\n", " \n", "my_abs(-9)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "可以没有return" ] }, { "cell_type": "code", "execution_count": 103, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "None\n", "['Apple', 'Banana', 'Grape']\n" ] } ], "source": [ "def filter_fruit(someList, d):\n", " for i in someList:\n", " if i == d:\n", " someList.remove(i)\n", " else:\n", " pass\n", "\n", "print (filter_fruit(fruits, 'Melon'))\n", "print (fruits)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "多个返回值的情况" ] }, { "cell_type": "code", "execution_count": 104, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "4 5 20\n" ] }, { "data": { "text/plain": [ "tuple" ] }, "execution_count": 104, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def test(i, j):\n", " k = i * j\n", " return i, j, k\n", "\n", "a , b , c = test(4, 5)\n", "print (a, b , c)\n", "type(test(4, 5))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4.3 高阶函数" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 把另一个函数作为参数传入一个函数,这样的函数称为高阶函数" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "函数本身也可以赋值给变量,函数与其它对象具有同等地位" ] }, { "cell_type": "code", "execution_count": 105, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "9" ] }, "execution_count": 105, "metadata": {}, "output_type": "execute_result" } ], "source": [ "myFunction = abs\n", "myFunction(-9)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 参数传入函数" ] }, { "cell_type": "code", "execution_count": 106, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "12" ] }, "execution_count": 106, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def add(x, y, f):\n", " return f(x) + f(y)\n", "\n", "add(7, -5, myFunction)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 常用高阶函数" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "map/reduce: map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回;reduce把一个函数作用在一个序列[x1, x2, x3...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算" ] }, { "cell_type": "code", "execution_count": 107, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 107, "metadata": {}, "output_type": "execute_result" } ], "source": [ "myList = [-1, 2, -3, 4, -5, 6, 7]\n", "map(abs, myList)" ] }, { "cell_type": "code", "execution_count": 108, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "3560020598205630145296938" ] }, "execution_count": 108, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from functools import reduce\n", "def powerAdd(a, b):\n", " return pow(a, 2) + pow(b, 2)\n", "\n", "reduce(powerAdd, myList) # 是否是计算平方和?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "filter: filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素" ] }, { "cell_type": "code", "execution_count": 109, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 109, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def is_odd(x):\n", " return x % 3 # 0被判断为False,其它被判断为True\n", "\n", "filter(is_odd, myList)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "sorted: 实现对序列排序,默认情况下对于两个元素x和y,如果认为x < y,则返回-1,如果认为x == y,则返回0,如果认为x > y,则返回1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "默认排序:数字大小或字母序(针对字符串)" ] }, { "cell_type": "code", "execution_count": 110, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[-5, -3, -1, 2, 4, 6, 7]" ] }, "execution_count": 110, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sorted(myList)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 返回函数: 高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回" ] }, { "cell_type": "code", "execution_count": 111, "metadata": {}, "outputs": [ { "data": { "text/plain": [ ".power>" ] }, "execution_count": 111, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def powAdd(x, y):\n", " def power(n):\n", " return pow(x, n) + pow(y, n)\n", " return power\n", "\n", "myF = powAdd(3, 4)\n", "myF" ] }, { "cell_type": "code", "execution_count": 112, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "25" ] }, "execution_count": 112, "metadata": {}, "output_type": "execute_result" } ], "source": [ "myF(2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 匿名函数:高阶函数传入函数时,不需要显式地定义函数,直接传入匿名函数更方便" ] }, { "cell_type": "code", "execution_count": 113, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "16" ] }, "execution_count": 113, "metadata": {}, "output_type": "execute_result" } ], "source": [ "f = lambda x: x * x\n", "f(4)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "等同于:" ] }, { "cell_type": "code", "execution_count": 114, "metadata": {}, "outputs": [], "source": [ "def f(x):\n", " return x * x" ] }, { "cell_type": "code", "execution_count": 115, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 115, "metadata": {}, "output_type": "execute_result" } ], "source": [ "map(lambda x: x * x, myList)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "匿名函数可以传入多个参数" ] }, { "cell_type": "code", "execution_count": 116, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "140" ] }, "execution_count": 116, "metadata": {}, "output_type": "execute_result" } ], "source": [ "reduce(lambda x, y: x + y, map(lambda x: x * x, myList))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "返回函数可以是匿名函数" ] }, { "cell_type": "code", "execution_count": 117, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "25" ] }, "execution_count": 117, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def powAdd1(x, y):\n", " return lambda n: pow(x, n) + pow(y, n)\n", "\n", "lamb = powAdd1(3, 4)\n", "lamb(2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 其它" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 标识符第一个字符只能是字母或下划线,第一个字符不能出现数字或其他字符;标识符除第一个字符外,其他部分可以是字母或者下划线或者数字,标识符大小写敏感,比如name跟Name是不同的标识符。\n", "- Python规范:\n", "* 类标识符每个字符第一个字母大写;\n", "* 对象\\变量标识符的第一个字母小写,其余首字母大写,或使用下划线'_' 连接;\n", "* 函数命名同普通对象。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 关键字" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "关键字是指系统中自带的具备特定含义的标识符" ] }, { "cell_type": "code", "execution_count": 118, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['False', 'None', 'True', 'and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']\n" ] } ], "source": [ "# 查看一下关键字有哪些,避免关键字做自定义标识符\n", "import keyword\n", "print (keyword.kwlist)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 注释" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Python中的注释一般用#进行注释" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 帮助" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "可以用?或者help()" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.4" } }, "nbformat": 4, "nbformat_minor": 1 } ================================================ FILE: 1.python-basic/a.txt ================================================ time 2018-12-15 17:24:57 Saturday December PM 05 end action time 2018-12-15 17:24:57 Saturday December PM 05 end action time 2018-12-15 17:24:57 Saturday December PM 05 end action time 2020-07-07 19:17:43 Tuesday July PM 07 end action time 2020-07-07 19:17:43 Tuesday July PM 07 end action time 2020-07-07 19:17:43 Tuesday July PM 07 end action ================================================ FILE: 1.python-basic/test ================================================ 阿斯达所, 天安门上太阳升 阿斯达所, 天安门上太阳升 阿斯达所, 天安门上太阳升 阿斯达所, 天安门上太阳升 ================================================ FILE: 1.python-basic/两天入门python-第一天.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 一、Day1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 0.print" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "What is your name?Mike\n", "Hello Mike\n" ] } ], "source": [ "name = input(\"What is your name?\")\n", "print(\"Hello \"+name )\n", "# 或者print(\"Hello\",name ),print中逗号分隔直接将字符串用空格分隔,若用+号连接,并且想留空格,则在前一字符串留空格即可" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1.输入输出" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "username:111\n", "password:666\n", "111 666\n" ] } ], "source": [ "username=input(\"username:\")\n", "password=input(\"password:\")\n", "print(username,password)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2.格式输入输出" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Name:Mike\n", "age:28\n", "job:worker\n", "---------info of ---------\n", "Name:Mike\n", "Age:28\n", "Job:worker\n" ] } ], "source": [ "# 第一种方法\n", "name=input(\"Name:\")\n", "age=input(\"age:\")\n", "job=input(\"job:\")\n", "\n", "info='''---------info of ---------''' + '''\n", "Name:'''+name+'''\n", "Age:'''+age+'''\n", "Job:'''+job\n", "print(info)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Name:Mike\n", "age:28\n", "job:worker\n", "---------info of ---------\n", "Name:Mike\n", "Age:28\n", "Job:worker\n" ] } ], "source": [ "# 第二种方法\n", "\n", "name=input(\"Name:\")\n", "age=int(input(\"age:\")) #如果不用int()就会报错(虽然输入为数字,但是print(type(age))为str型),因为python如果不强制类型转化,就会默认字符型\n", "job=input(\"job:\")\n", "\n", "info='''---------info of ---------\n", "Name:%s\n", "Age:%d\n", "Job:%s'''%(name,age,job)\n", "print(info)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Name:Mike\n", "age:28\n", "job:worker\n", "---------info of ---------\n", "Name:Mike\n", "Age:28\n", "Job:worker\n" ] } ], "source": [ "# 第三种方法\n", "\n", "name=input(\"Name:\")\n", "age=int(input(\"age:\")) #如果不用int()就会报错(虽然输入为数字,但是print(type(age))为str型),因为python如果不强制类型转化,就会默认字符型\n", "job=input(\"job:\")\n", "\n", "info='''---------info of ---------\n", "Name:{_name}\n", "Age:{_age}\n", "Job:{_job}'''.format(_name=name,_age=age,_job=job)\n", "print(info)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Name:Mike\n", "age:28\n", "job:worker\n", "---------info of ---------\n", "Name:Mike\n", "Age:28\n", "Job:worker\n" ] } ], "source": [ "# 第四种方法\n", "\n", "name=input(\"Name:\")\n", "age=int(input(\"age:\")) #如果不用int()就会报错(虽然输入为数字,但是print(type(age))为str型),因为python如果不强制类型转化,就会默认字符型\n", "job=input(\"job:\")\n", "\n", "info='''---------info of ---------\n", "Name:{0}\n", "Age:{1}\n", "Job:{2}'''.format(name,age,job)\n", "print(info)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 3.输入密码不可见" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "请输入密码:········\n", "3434\n" ] } ], "source": [ "import getpass\n", "pwd=getpass.getpass(\"请输入密码:\")\n", "print(pwd)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 4.验证,python缩进" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "username:df\n", "password:i'\n", "Invalid username or password!\n" ] } ], "source": [ "_username='Alex Li'\n", "_password='abc123'\n", "username=input(\"username:\")\n", "password=input(\"password:\")\n", "if _username==username and _password==password:\n", " print((\"Welcome user {name} login...\").format(name=username))\n", "else:\n", " print(\"Invalid username or password!\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 5.指向---修改字符串" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Hello World\n", "Alex Li\n", "My name is Alex Li Alex Li\n", "My name is PaoChe Ge Alex Li\n", "您好,我来了\n" ] } ], "source": [ "print(\"Hello World\")\n", "name = \"Alex Li\"\n", "name2=name\n", "print(name)\n", "print(\"My name is\", name,name2) # Alex Li Alex Li\n", "name = \"PaoChe Ge\"\n", "# name2=name指的是name2与name一样指向Alex Li的内存地址,name指向改了,但是name2不变\n", "print(\"My name is\", name,name2) # PaoChe Ge Alex Li\n", "print(\"您好,我来了\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 6.注释`''' '''`内涵" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'print(\"这是一行注释\")'" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 第一种情况就是注释\n", "'''print(\"这是一行注释\")'''" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "这是第一行内容\n", "这是第二行内容\n" ] } ], "source": [ "#第二种情况就是打印多行字符串\n", "str='''这是第一行内容\n", "这是第二行内容'''\n", "print(str)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "i'am a student\n" ] } ], "source": [ "# 3.单套双,双套单都可以\n", "str1=\"i'am a student\"\n", "print(str1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 7.模块初始sys与os" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['', 'C:\\\\ProgramData\\\\Anaconda3\\\\python36.zip', 'C:\\\\ProgramData\\\\Anaconda3\\\\DLLs', 'C:\\\\ProgramData\\\\Anaconda3\\\\lib', 'C:\\\\ProgramData\\\\Anaconda3', 'C:\\\\ProgramData\\\\Anaconda3\\\\lib\\\\site-packages', 'C:\\\\ProgramData\\\\Anaconda3\\\\lib\\\\site-packages\\\\win32', 'C:\\\\ProgramData\\\\Anaconda3\\\\lib\\\\site-packages\\\\win32\\\\lib', 'C:\\\\ProgramData\\\\Anaconda3\\\\lib\\\\site-packages\\\\Pythonwin', 'C:\\\\ProgramData\\\\Anaconda3\\\\lib\\\\site-packages\\\\IPython\\\\extensions', 'C:\\\\Users\\\\haigu\\\\.ipython']\n", "['C:\\\\ProgramData\\\\Anaconda3\\\\lib\\\\site-packages\\\\ipykernel_launcher.py', '-f', 'C:\\\\Users\\\\haigu\\\\AppData\\\\Roaming\\\\jupyter\\\\runtime\\\\kernel-28ddb76e-a36b-4edc-ab46-0b848ae5812f.json']\n", "C:\\Users\\haigu\\AppData\\Roaming\\jupyter\\runtime\\kernel-28ddb76e-a36b-4edc-ab46-0b848ae5812f.json\n" ] } ], "source": [ "import sys\n", "# 打印环境变量\n", "print(sys.path)\n", "\n", "print(sys.argv)\n", "print(sys.argv[2])" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "##################################################" ] } ], "source": [ "# 进度条\n", "import time\n", "for i in range(50):\n", " sys.stdout.write('#')\n", " sys.stdout.flush()\n", " time.sleep(0.5)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "---> 0\n" ] } ], "source": [ "import os\n", "cmd_res = os.system(\"dir\") # os.system()执行后直接输出到终端,然后结束,最后cmd_res保存的是os.system()执行后的状态码\n", "print(\"--->\",cmd_res) # ---> 0" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "---> \n" ] } ], "source": [ "cmd_res1=os.popen(\"dir\")\n", "print(\"--->\",cmd_res1) # 得到的是内存对象值 ---> " ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "---> 驱动器 E 中的卷是 tools\n", " 卷的序列号是 E2B0-A3DA\n", "\n", " E:\\tools\\学术\\python\\两天入门python 的目录\n", "\n", "2018/12/15 11:10 .\n", "2018/12/15 11:10 ..\n", "2018/12/15 10:58 .ipynb_checkpoints\n", "2018/12/15 11:10 9,565 两天入门python.ipynb\n", " 1 个文件 9,565 字节\n", " 3 个目录 24,186,036,224 可用字节\n", "\n" ] } ], "source": [ "cmd_res1=os.popen(\"dir\").read()\n", "print(\"--->\",cmd_res1) # 读取数据必须再后面加个read()" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [], "source": [ "os.mkdir(\"new_dir3\") # 创建一个目录\n", "os.removedirs(\"new_dir3\") # 删除一个目录" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 8.三元运算" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "3\n" ] } ], "source": [ "# 1.result = 值1 if 条件 else 值2\n", "a=1\n", "b=2\n", "c=3\n", "d=a if a>b else c\n", "print(d)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 9.python3特性" ] }, { "cell_type": "raw", "metadata": {}, "source": [ "python3中最重要的新特性大概是对文本和二进制数据作了更为清晰的区分。文本总是Unicode,由str类型表示,\n", "二进制数据则由bytes类型表示。Python3不会以任意隐式的方式混用str和bytes,正是这使得两者区分特别清晰。\n", "即:在python2中类型会自动转化,而在python3中则要么报错,要么不转化\n", "str与bytes相互转化" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 10.bytes与str转化" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "我爱北京天安门\n" ] } ], "source": [ "msg=\"我爱北京天安门\"\n", "\n", "print(msg)" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "b'\\xe6\\x88\\x91\\xe7\\x88\\xb1\\xe5\\x8c\\x97\\xe4\\xba\\xac\\xe5\\xa4\\xa9\\xe5\\xae\\x89\\xe9\\x97\\xa8'\n" ] } ], "source": [ "print(msg.encode(encoding=\"utf-8\")) # str转bytes,编码" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "我爱北京天安门\n" ] } ], "source": [ "print(msg.encode(encoding=\"utf-8\").decode(encoding=\"utf-8\")) # bytes转str,解码" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 11.循环" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "第一种循环\n", "count: 0\n", "count: 1\n", "count: 2\n", "count: 3\n", "count: 4\n", "count: 5\n", "count: 6\n", "count: 7\n", "count: 8\n", "count: 9\n" ] } ], "source": [ "print(\"第一种循环\")\n", "count = 0\n", "while True:\n", " print(\"count:\",count)\n", " count+=1\n", " if(count==10):\n", " break" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "第二种循环\n", "count: 0\n", "count: 2\n", "count: 4\n", "count: 6\n", "count: 8\n", "loop 0\n", "hehe....\n", "loop 1\n", "hehe....\n", "loop 2\n", "hehe....\n", "loop 3\n", "hehe....\n", "loop 4\n", "hehe....\n", "input your guess num:2\n", "Oops,think bigger!\n", "猜这么多次都不对,你个笨蛋.\n", "input your guess num:28\n", "Congratulations,you got it!\n" ] } ], "source": [ "print(\"第二种循环\")\n", "count = 0\n", "for count in range(0,10,2):\n", " print(\"count:\", count)\n", "\n", "for i in range(0,10):\n", " if i<5:\n", " print(\"loop \",i)\n", " else:\n", " continue\n", " print(\"hehe....\")\n", "my_age=28\n", "count = 0\n", "while count<3:\n", " user_input=int(input(\"input your guess num:\"))\n", "\n", " if user_input==my_age:\n", " print(\"Congratulations,you got it!\")\n", " break\n", " elif user_input>:2\n", "北京\n", "山东\n", "广东\n", "选择进入1>>:3\n", "北京\n", "山东\n", "广东\n", "选择进入1>>:q\n", "北京\n", "山东\n", "广东\n", "选择进入1>>:2\n", "北京\n", "山东\n", "广东\n" ] } ], "source": [ "data={\n", " '北京':{\n", " \"昌平\":{\n", " \"沙河\":[\"oldboys\",'test'],\n", " \"天通苑\":[\"链家地产\",\"我爱我家\"]\n", " },\n", " \"朝阳\":{\n", " \"望京\":[\"oldboys\",'默陌陌'],\n", " \"国贸\":[\"CICC\",\"HP\"],\n", " \"东直门\":[\"Advent\",\"飞信\"]\n", " },\n", " \"海淀\":{}\n", " },\n", " '山东':{\n", " \"德州\":{},\n", " \"青岛\":{},\n", " \"济南\":{}\n", " },\n", " '广东':{\n", " \"德州\":{},\n", " \"青岛\":{},\n", " \"济南\":{}\n", " },\n", "}\n", "exit_flag = False\n", "while not exit_flag:\n", " for i in data:\n", " print(i)\n", " choice=input(\"选择进入1>>:\")\n", " if choice in data:\n", " while not exit_flag:\n", " for i2 in data[choice]:\n", " print(\"\\t\",i2)\n", " choice2=input(\"选择进入2>>:\")\n", " if choice2 in data[choice]:\n", " while not exit_flag:\n", " for i3 in data[choice][choice2]:\n", " print(\"\\t\\t\", i3)\n", " choice3 = input(\"选择进入3>>:\")\n", " if choice3 in data[choice][choice2]:\n", " for i4 in data[choice][choice2][choice3]:\n", " print(i4)\n", " choice4=input(\"最后一层,按b返回>>:\")\n", " if choice4=='b':\n", " pass # pass可以理解为占位符,表示什么都不做,返回循环起始位置,以后可以在此处添加内容\n", " elif choice4=='q':\n", " exit_flag=True\n", " if (choice3 == 'b'):\n", " break\n", " elif choice3 == 'q':\n", " exit_flag = True\n", " if (choice2 == 'b'):\n", " break\n", " elif choice2 == 'q':\n", " exit_flag = True\n", "\n", " if (choice == 'b'):\n", " break" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.4" } }, "nbformat": 4, "nbformat_minor": 2 } ================================================ FILE: 1.python-basic/两天入门python-第二天.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 二、Day2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1.编码变换" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "b'\\xce\\xd2\\xb0\\xae\\xb1\\xb1\\xbe\\xa9\\xcc\\xec\\xb0\\xb2\\xc3\\xc5'\n" ] } ], "source": [ "# utf-8与gbk互相转化需要通过Unicode作为中介\n", "s=\"我爱北京天安门\" # 默认编码为Unicode\n", "print(s.encode(\"gbk\")) # Unicode可直接转化为gbk" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "b'\\xe6\\x88\\x91\\xe7\\x88\\xb1\\xe5\\x8c\\x97\\xe4\\xba\\xac\\xe5\\xa4\\xa9\\xe5\\xae\\x89\\xe9\\x97\\xa8'\n" ] } ], "source": [ "print(s.encode(\"utf-8\")) # Unicode可直接转化为utf-8" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "b'\\xce\\xd2\\xb0\\xae\\xb1\\xb1\\xbe\\xa9\\xcc\\xec\\xb0\\xb2\\xc3\\xc5'\n" ] } ], "source": [ "print(s.encode(\"utf-8\").decode(\"utf-8\").encode(\"gb2312\"))\n", "# 此时s.encode(\"utf-8\")即转为utf-8了,然后转为gb2312,则需要先告诉Unicode你原先的编码是什么,即s.encode(\"utf-8\").decode(\"utf-8\"),再对其进行编码为gb2312,即最终为s.encode(\"utf-8\").decode(\"utf-8\").encode(\"gb2312\")\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2.文件" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000我爱中华\n" ] } ], "source": [ "f=open('ly.txt','r',encoding='utf-8') # 文件句柄 'w'为创建文件,之前的数据就没了\n", "data=f.read()\n", "print(data)\n", "f.close()" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "f=open('test','a',encoding='utf-8') # 文件句柄 'a'为追加文件 append\n", "f.write(\"\\n阿斯达所,\\n天安门上太阳升\")\n", "f.close()" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "f = open('ly.txt', 'r', encoding='utf-8') # 文件句柄" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000我爱中华\n", "\n", "\n", "\n", "\n", "0\n", "\u0000\u0000\u0000\u0000\u0000\n", "5\n", "\u0000\u0000\u0000\u0000\u0000\n", "utf-8\n", "<_io.BufferedReader name='ly.txt'>\n", "5\n", "None\n", "##################################################\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\n", "\n", "\n", "\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000我爱中华\n" ] } ], "source": [ "for i in range(5):\n", " print(f.readline().strip()) # strip()去掉空格和回车\n", "\n", "for line in f.readlines():\n", " print(line.strip())\n", "\n", "# 到第十行不打印\n", "\n", "for index, line in enumerate(f.readlines()):\n", " if index == 9:\n", " print('----我是分隔符-----')\n", " continue\n", " print(line.strip())\n", "# 到第十行不打印\n", "count = 0\n", "for line in f:\n", "\n", " if count == 9:\n", " print('----我是分隔符-----')\n", " count += 1\n", " continue\n", " print(line.strip())\n", " count += 1\n", "f = open('ly.txt', 'r', encoding='utf-8') # 文件句柄\n", "print(f.tell())\n", "print(f.readline(5))\n", "print(f.tell())\n", "f.seek(0)\n", "print(f.readline(5))\n", "print(f.encoding)\n", "print(f.buffer)\n", "print(f.fileno())\n", "print(f.flush()) # 刷新缓冲区\n", "# 进度条\n", "import sys, time\n", "for i in range(50):\n", " sys.stdout.write('#')\n", " sys.stdout.flush()\n", " time.sleep(0.5)\n", "f = open('ly.txt', 'a', encoding='utf-8') # 文件句柄\n", "f.seek(10)\n", "f.truncate(20) # 指定10到20个字符,10个字符前面留着,后面20字符清除\n", "f = open('ly.txt', 'r+', encoding='utf-8') # 文件句柄\n", "print(f.readline().strip())\n", "print(f.readline().strip())\n", "print(f.readline().strip())\n", "f.write(\"我爱中华\")\n", "f.close()\n", "\n", "# 实现简单的shell sed替换功能\n", "\n", "f = open(\"ly.txt\", \"r\", encoding=\"utf-8\")\n", "f_new = open(\"ly2.txt\", \"w\", encoding=\"utf-8\")\n", "\n", "for line in f:\n", " if \"肆意的快乐\" in line:\n", " line = line.replace(\"肆意的快乐\", \"肆意的happy\")\n", " f_new.write(line)\n", "\n", "f.close()\n", "f_new.close()\n", "\n", "import sys\n", "f = open(\"ly.txt\", \"r\", encoding=\"utf-8\")\n", "f_new = open(\"ly2.txt\", \"w\", encoding=\"utf-8\")\n", "find_str = sys.argv[1]\n", "replace_str = sys.argv[2]\n", "for line in f:\n", " if find_str in line:\n", " line = line.replace(find_str, replace_str)\n", " f_new.write(line)\n", "f.close()\n", "f_new.close()\n", "\n", "# with语句---为了避免打开文件后忘记关闭,可以通过管理上下文\n", "with open('ly.txt', 'r', encoding='utf-8') as f:\n", " for line in f:\n", " print(line.strip())\n", "# python2.7后,with又支持同时对多个文件的上下文进行管理,即:\n", "with open('ly.txt', 'r', encoding='utf-8') as f1, open('ly2.txt',\n", " 'r',\n", " encoding='utf-8'):\n", " pass" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 3.全局变量" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "inside func ['金角大王', 'Jack', 'Rain']\n", "['金角大王', 'Jack', 'Rain']\n" ] } ], "source": [ "names = [\"Alex\", \"Jack\", \"Rain\"]\n", "\n", "\n", "# 除了整数和字符串在函数内不能改,列表,字典这些可以改\n", "def change_name():\n", " names[0] = \"金角大王\"\n", " print(\"inside func\", names)\n", "\n", "\n", "change_name()\n", "print(names)\n", "\n", "# 当全局变量与局部变量同名时,在定义局部变量的子程序内,局部变量起作用,在其它地方全局变量起作用。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 4.list操作" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "__author__=\"Alex Li\"\n", "names=\"zhang Gu Xiang Xu\"\n", "names=[\"zhang\",\"Gu\",\"Xiang\",\"Xu\"]" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "zhang Gu Xiang\n" ] } ], "source": [ "# 1.切片\n", "print(names[0],names[1],names[2])" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['Gu', 'Xiang']\n" ] } ], "source": [ "print(names[1:3]) # 顾头不顾尾,切片" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Xu\n" ] } ], "source": [ "print(names[-1]) # 在不知道多长情况下,取最后一个位置" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[]\n" ] } ], "source": [ "print(names[-1:-3]) # 切片是从左往右,此时不输出" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['Gu', 'Xiang']\n" ] } ], "source": [ "print(names[-3:-1]) # 顾头顾尾,取最后三个" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['Xiang', 'Xu']\n" ] } ], "source": [ "print(names[-2:]) # 取最后两个" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['zhang', 'Gu', 'Xiang']\n" ] } ], "source": [ "print(names[0:3]) # 切片 等价于 print(names[:3])" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['zhang', 'Gu', 'Xiang', 'Xu', 'Lei']\n" ] } ], "source": [ "# 2.追加\n", "names.append(\"Lei\")\n", "print(names)" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['zhang', 'Chen', 'Gu', 'Xiang', 'Xu', 'Lei']\n" ] } ], "source": [ "# 3.指定位置插入\n", "names.insert(1,\"Chen\") # Gu前面插入\n", "print(names)" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['zhang', 'Chen', 'Xie', 'Xiang', 'Xu', 'Lei']\n" ] } ], "source": [ "# 4.修改\n", "names[2]=\"Xie\"\n", "print(names)" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['zhang', 'Xie', 'Xiang', 'Xu', 'Lei']\n" ] } ], "source": [ "# 5.删除\n", "# 第一种删除方法\n", "names.remove(\"Chen\")\n", "print(names)" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['zhang', 'Xiang', 'Xu', 'Lei']\n" ] } ], "source": [ "# 第二种删除方法\n", "del names[1]\n", "print(names)" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['zhang', 'Xiang', 'Xu']\n" ] } ], "source": [ "# 第三种删除方法\n", "names.pop() # 默认删除最后一个\n", "print(names)" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['zhang', 'Xu']\n" ] } ], "source": [ "names.pop(1) #删除第二个元素\n", "print(names)" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1\n" ] } ], "source": [ "print(names.index(\"Xu\")) # 1" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Xu\n" ] } ], "source": [ "print(names[names.index(\"Xu\")]) #打印出找出的元素值3" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2\n" ] } ], "source": [ "# 6.统计\n", "names.append(\"zhang\") #再加一个用于学习统计\"zhang\"的个数\n", "print(names.count(\"zhang\"))" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['Xu', 'zhang', 'zhang']\n" ] } ], "source": [ "# 7.排序\n", "names.sort() #按照ASCII码排序\n", "print(names)" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['zhang', 'zhang', 'Xu']\n" ] } ], "source": [ "names.reverse() # 逆序\n", "print(names)" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['zhang', 'zhang', 'Xu', 1, 2, 3, 4] [1, 2, 3, 4]\n" ] } ], "source": [ "# 8.合并\n", "names2=[1,2,3,4]\n", "names.extend(names2)\n", "print(names,names2)" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1, 2, 3, 4]\n" ] } ], "source": [ "# 9.删掉names2\n", "'''del names2'''\n", "print(names2) # NameError: name 'names2' is not defined,表示已删除" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['zhang', 'zhang', 'Xu', 1, 2, 3, 4] ['zhang', 'zhang', 'Xu', 1, 2, 3, 4]\n" ] } ], "source": [ "# 10.浅copy\n", "names2=names.copy()\n", "print(names,names2) # 此时names2与names指向相同" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['zhang', 'zhang', '大张', 1, 2, 3, 4] ['zhang', 'zhang', 'Xu', 1, 2, 3, 4]\n" ] } ], "source": [ "names[2]=\"大张\"\n", "print(names,names2) # 此时names改变,names2不变" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1, 2, 3, 4, ['zhang', 'Gu'], 5]\n" ] } ], "source": [ "# 11.浅copy在列表嵌套应用\n", "names=[1,2,3,4,[\"zhang\",\"Gu\"],5]\n", "print(names)" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1, 2, 3, '斯', ['张改', 'Gu'], 5] [1, 2, 3, 4, ['张改', 'Gu'], 5]\n" ] } ], "source": [ "names2=names.copy()\n", "names[3]=\"斯\"\n", "names[4][0]=\"张改\"\n", "print(names,names2) # copy为浅copy,第一层copy不变,后面的嵌套全部都变,修改names2与names都一样\n" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1, 2, 3, '斯', ['张改', 'Gu'], 5] [1, 2, 3, 4, ['zhang', 'Gu'], 5]\n" ] } ], "source": [ "# 12.完整克隆\n", "import copy\n", "# 浅copy与深copy\n", "'''浅copy与深copy区别就是浅copy只copy一层,而深copy就是完全克隆'''\n", "names = [1, 2, 3, 4, [\"zhang\", \"Gu\"], 5]\n", "# names2=copy.copy(names) # 这个跟列表的浅copy一样\n", "names2 = copy.deepcopy(names) #深copy\n", "names[3] = \"斯\"\n", "names[4][0] = \"张改\"\n", "print(names, names2)" ] }, { "cell_type": "code", "execution_count": 36, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1\n", "2\n", "3\n", "斯\n", "['张改', 'Gu']\n", "5\n", "[1, 3, ['张改', 'Gu']]\n" ] } ], "source": [ "# 13.列表循环\n", "for i in names:\n", " print(i)\n", "print(names[0:-1:2]) # 步长为2进行切片" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 5.Tuple操作" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2\n", "1\n" ] } ], "source": [ "names=('alex','jack','alex')\n", "\n", "print(names.count('alex'))\n", "print(names.index('jack'))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Input your salary:8000\n", "0 ('Iphone', 5800)\n", "1 ('Mac Pro', 9800)\n", "2 ('Bike', 5800)\n", "3 ('Watch', 10600)\n", "4 ('Coffee', 31)\n", "5 ('Alex Python', 120)\n", "选择要买嘛?>>:\n", "invalid option\n", "0 ('Iphone', 5800)\n", "1 ('Mac Pro', 9800)\n", "2 ('Bike', 5800)\n", "3 ('Watch', 10600)\n", "4 ('Coffee', 31)\n", "5 ('Alex Python', 120)\n", "选择要买嘛?>>:1\n", "\u001b[41;1m你的余额只剩[8000]啦,还买个毛线\u001b[0m\n", "0 ('Iphone', 5800)\n", "1 ('Mac Pro', 9800)\n", "2 ('Bike', 5800)\n", "3 ('Watch', 10600)\n", "4 ('Coffee', 31)\n", "5 ('Alex Python', 120)\n", "选择要买嘛?>>:0\n", "Added ('Iphone', 5800) into shopping cart, your current balance is \u001b[31;1m2200\u001b[0m\n", "0 ('Iphone', 5800)\n", "1 ('Mac Pro', 9800)\n", "2 ('Bike', 5800)\n", "3 ('Watch', 10600)\n", "4 ('Coffee', 31)\n", "5 ('Alex Python', 120)\n", "选择要买嘛?>>:6\n", "product code[6] is not exist!\n", "0 ('Iphone', 5800)\n", "1 ('Mac Pro', 9800)\n", "2 ('Bike', 5800)\n", "3 ('Watch', 10600)\n", "4 ('Coffee', 31)\n", "5 ('Alex Python', 120)\n", "选择要买嘛?>>:q\n", "-----------shopping list----------------\n", "('Iphone', 5800)\n", "Your current balance: 2200\n", "0 ('Iphone', 5800)\n", "1 ('Mac Pro', 9800)\n", "2 ('Bike', 5800)\n", "3 ('Watch', 10600)\n", "4 ('Coffee', 31)\n", "5 ('Alex Python', 120)\n", "选择要买嘛?>>:p\n", "invalid option\n", "0 ('Iphone', 5800)\n", "1 ('Mac Pro', 9800)\n", "2 ('Bike', 5800)\n", "3 ('Watch', 10600)\n", "4 ('Coffee', 31)\n", "5 ('Alex Python', 120)\n", "选择要买嘛?>>:no\n", "invalid option\n", "0 ('Iphone', 5800)\n", "1 ('Mac Pro', 9800)\n", "2 ('Bike', 5800)\n", "3 ('Watch', 10600)\n", "4 ('Coffee', 31)\n", "5 ('Alex Python', 120)\n", "选择要买嘛?>>:4\n", "Added ('Coffee', 31) into shopping cart, your current balance is \u001b[31;1m2169\u001b[0m\n", "0 ('Iphone', 5800)\n", "1 ('Mac Pro', 9800)\n", "2 ('Bike', 5800)\n", "3 ('Watch', 10600)\n", "4 ('Coffee', 31)\n", "5 ('Alex Python', 120)\n", "选择要买嘛?>>:4\n", "Added ('Coffee', 31) into shopping cart, your current balance is \u001b[31;1m2138\u001b[0m\n", "0 ('Iphone', 5800)\n", "1 ('Mac Pro', 9800)\n", "2 ('Bike', 5800)\n", "3 ('Watch', 10600)\n", "4 ('Coffee', 31)\n", "5 ('Alex Python', 120)\n", "选择要买嘛?>>:4\n", "Added ('Coffee', 31) into shopping cart, your current balance is \u001b[31;1m2107\u001b[0m\n", "0 ('Iphone', 5800)\n", "1 ('Mac Pro', 9800)\n", "2 ('Bike', 5800)\n", "3 ('Watch', 10600)\n", "4 ('Coffee', 31)\n", "5 ('Alex Python', 120)\n", "选择要买嘛?>>:43\n", "product code[43] is not exist!\n", "0 ('Iphone', 5800)\n", "1 ('Mac Pro', 9800)\n", "2 ('Bike', 5800)\n", "3 ('Watch', 10600)\n", "4 ('Coffee', 31)\n", "5 ('Alex Python', 120)\n", "选择要买嘛?>>:2\n", "\u001b[41;1m你的余额只剩[2107]啦,还买个毛线\u001b[0m\n", "0 ('Iphone', 5800)\n", "1 ('Mac Pro', 9800)\n", "2 ('Bike', 5800)\n", "3 ('Watch', 10600)\n", "4 ('Coffee', 31)\n", "5 ('Alex Python', 120)\n", "选择要买嘛?>>:1\n", "\u001b[41;1m你的余额只剩[2107]啦,还买个毛线\u001b[0m\n", "0 ('Iphone', 5800)\n", "1 ('Mac Pro', 9800)\n", "2 ('Bike', 5800)\n", "3 ('Watch', 10600)\n", "4 ('Coffee', 31)\n", "5 ('Alex Python', 120)\n", "选择要买嘛?>>:2\n", "\u001b[41;1m你的余额只剩[2107]啦,还买个毛线\u001b[0m\n", "0 ('Iphone', 5800)\n", "1 ('Mac Pro', 9800)\n", "2 ('Bike', 5800)\n", "3 ('Watch', 10600)\n", "4 ('Coffee', 31)\n", "5 ('Alex Python', 120)\n", "选择要买嘛?>>:3\n", "\u001b[41;1m你的余额只剩[2107]啦,还买个毛线\u001b[0m\n", "0 ('Iphone', 5800)\n", "1 ('Mac Pro', 9800)\n", "2 ('Bike', 5800)\n", "3 ('Watch', 10600)\n", "4 ('Coffee', 31)\n", "5 ('Alex Python', 120)\n", "选择要买嘛?>>:4\n", "Added ('Coffee', 31) into shopping cart, your current balance is \u001b[31;1m2076\u001b[0m\n", "0 ('Iphone', 5800)\n", "1 ('Mac Pro', 9800)\n", "2 ('Bike', 5800)\n", "3 ('Watch', 10600)\n", "4 ('Coffee', 31)\n", "5 ('Alex Python', 120)\n", "选择要买嘛?>>:5\n", "Added ('Alex Python', 120) into shopping cart, your current balance is \u001b[31;1m1956\u001b[0m\n", "0 ('Iphone', 5800)\n", "1 ('Mac Pro', 9800)\n", "2 ('Bike', 5800)\n", "3 ('Watch', 10600)\n", "4 ('Coffee', 31)\n", "5 ('Alex Python', 120)\n" ] } ], "source": [ "# 购物篮程序\n", "\n", "product_list = [\n", " ('Iphone', 5800),\n", " ('Mac Pro', 9800),\n", " ('Bike', 5800),\n", " ('Watch', 10600),\n", " ('Coffee', 31),\n", " ('Alex Python', 120),\n", "]\n", "shopping_list = []\n", "salary = input(\"Input your salary:\")\n", "\n", "if salary.isdigit():\n", " salary = int(salary)\n", " while True:\n", " '''for item in product_list:\n", " print(product_list.index(item),item)\n", " '''\n", " for index, item in enumerate(product_list):\n", " print(index, item)\n", " user_choice = input(\"选择要买嘛?>>:\")\n", " if user_choice.isdigit():\n", " user_choice = int(user_choice)\n", " if user_choice < len(product_list) and user_choice >= 0:\n", " p_item = product_list[user_choice]\n", " if p_item[1] <= salary:\n", " shopping_list.append(p_item)\n", " salary -= p_item[1]\n", " print(\n", " \"Added %s into shopping cart, your current balance is \\033[31;1m%s\\033[0m\"\n", " % (p_item, salary))\n", " else:\n", " print(\"\\033[41;1m你的余额只剩[%s]啦,还买个毛线\\033[0m\" % salary)\n", " else:\n", " print(\"product code[%s] is not exist!\" % user_choice)\n", " elif user_choice == 'q':\n", " print('-----------shopping list----------------')\n", " for p in shopping_list:\n", " print(p)\n", " print(\"Your current balance:\", salary)\n", " exit()\n", " else:\n", " print(\"invalid option\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 6.Set操作" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{1, 3, 4, 5, 6, 7, 9} \n" ] } ], "source": [ "# 集合set 集合关系测试\n", "list_1=[1,4,5,7,3,6,7,9]\n", "list_1=set(list_1)\n", "print(list_1,type(list_1))" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{0, 2, 4, 6, 8, 22} \n" ] } ], "source": [ "list_2=set([2,6,0,6,22,8,4])\n", "print(list_2,type(list_2))" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "--------------------------------\n", "方法一\n", "{4, 6}\n" ] } ], "source": [ "print(\"--------------------------------\")\n", "# 取交集\n", "print(\"方法一\")\n", "print(list_1.intersection(list_2))" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "方法二\n", "{4, 6}\n", "--------------------------------\n" ] } ], "source": [ "print(\"方法二\")\n", "print(list_1&list_2)\n", "print(\"--------------------------------\")" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "方法一\n", "{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 22}\n" ] } ], "source": [ "# 取并集\n", "print(\"方法一\")\n", "print(list_1.union(list_2))" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "方法二\n", "{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 22}\n", "--------------------------------\n" ] } ], "source": [ "print(\"方法二\")\n", "print(list_1|list_2)\n", "print(\"--------------------------------\")" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{1, 3, 5, 7, 9}\n", "{1, 3, 5, 7, 9}\n", "--------------------------------\n" ] } ], "source": [ "# 差集 in list_1 but not in list_2\n", "print(list_1.difference(list_2))\n", "print(list_1-list_2)\n", "print(\"--------------------------------\")" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "True\n" ] } ], "source": [ "# 子集\n", "list_3=[1,4,6]\n", "list_4=[1,4,6,7]\n", "list_3=set(list_3)\n", "list_4=set(list_4)\n", "print(list_3.issubset(list_4))" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "True\n", "--------------------------------\n" ] } ], "source": [ "print(list_4.issuperset(list_3))\n", "print(\"--------------------------------\")" ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{0, 1, 2, 3, 5, 7, 8, 9, 22}\n", "{0, 1, 2, 3, 5, 7, 8, 9, 22}\n", "--------------------------------\n" ] } ], "source": [ "# 对称差集 把list_1与list_2互相都没有的元素放在一块,其实就是去掉重复元素\n", "print(list_1.symmetric_difference(list_2))\n", "print(list_1^list_2)\n", "print(\"--------------------------------\")" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "True\n", "--------------------------------\n" ] } ], "source": [ "# 是否没有交集 Return True if two sets have a null intersection.\n", "list_5=set([1,2,3,4])\n", "list_6=set([5,6,7])\n", "print(list_5.isdisjoint(list_6))\n", "print(\"--------------------------------\")" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{1, 3, 4, 5, 6, 7, 'x', 9}\n" ] } ], "source": [ "# 基本操作\n", "# 添加一项\n", "list_1.add('x')\n", "print(list_1)" ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{1, 3, 4, 5, 6, 7, 'x', 9, 10, 37, 42}\n" ] } ], "source": [ "# 添加多项\n", "list_1.update([10,37,42])\n", "print(list_1)" ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{1, 3, 4, 5, 6, 7, 'x', 9, 37, 42}\n" ] } ], "source": [ "# 删除一项\n", "list_1.remove(10)\n", "print(list_1)" ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "10\n" ] } ], "source": [ "# set长度\n", "print(len(list_1))" ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "True\n" ] } ], "source": [ "# 测试9是否是list_1的成员\n", "print(9 in list_1)" ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1\n" ] } ], "source": [ "# pop()删除并且返回一个任意的元素\n", "print(list_1.pop())" ] }, { "cell_type": "code", "execution_count": 55, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{3, 4, 5, 6, 7, 9, 37, 42}\n" ] } ], "source": [ "# 删除一个指定的值\n", "list_1.discard('x')\n", "print(list_1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 7.字符串操作" ] }, { "cell_type": "code", "execution_count": 56, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Alex\n" ] } ], "source": [ "name=\"alex\"\n", "print(name.capitalize()) # 首字母大写" ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1\n" ] } ], "source": [ "print(name.count(\"a\")) # 统计字母个数" ] }, { "cell_type": "code", "execution_count": 58, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "-----------------------alex-----------------------\n" ] } ], "source": [ "print(name.center(50,\"-\")) #总共打印50个字符,并把nam放在中间,不够的用-补上" ] }, { "cell_type": "code", "execution_count": 59, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "True\n" ] } ], "source": [ "print(name.endswith(\"ex\")) # 判断字符串以什么结尾" ] }, { "cell_type": "code", "execution_count": 60, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "alex name is alex\n" ] } ], "source": [ "name=\"alex \\tname is alex\"\n", "print(name.expandtabs(tabsize=30)) # 将name中\\t转为30个空格" ] }, { "cell_type": "code", "execution_count": 61, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "3\n" ] } ], "source": [ "print(name.find(\"x\")) # 取索引" ] }, { "cell_type": "code", "execution_count": 62, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "x \tname is alex\n" ] } ], "source": [ "print(name[name.find(\"x\"):]) # 字符串切片" ] }, { "cell_type": "code", "execution_count": 63, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "my \tname is alex and i am 23 old\n" ] } ], "source": [ "name=\"my \\tname is {name} and i am {year} old\"\n", "print(name.format(name=\"alex\",year=23))" ] }, { "cell_type": "code", "execution_count": 64, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "my \tname is alex and i am 23 old\n" ] } ], "source": [ "print(name.format_map({'name':'alex','year':23}))" ] }, { "cell_type": "code", "execution_count": 65, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "True\n" ] } ], "source": [ "print('ab123'.isalnum()) #isalnum()包含所有字母及数字,如果不是这两个,则为False" ] }, { "cell_type": "code", "execution_count": 66, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "False\n" ] } ], "source": [ "print('ab123'.isalpha()) # False isalpha()包含纯英文字符" ] }, { "cell_type": "code", "execution_count": 67, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "False\n" ] } ], "source": [ "print('1A'.isdecimal()) # 是否是十进制 False" ] }, { "cell_type": "code", "execution_count": 68, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "False\n" ] } ], "source": [ "print('1A'.isdigit()) # 是否是整数 False" ] }, { "cell_type": "code", "execution_count": 69, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "True\n" ] } ], "source": [ "print('_'.isidentifier()) #判断是否是合法的标识符,实质是否为合法变量名 True" ] }, { "cell_type": "code", "execution_count": 70, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "True\n" ] } ], "source": [ "print('aasd'.islower()) # 判断是否是小写 True" ] }, { "cell_type": "code", "execution_count": 71, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "False\n" ] } ], "source": [ "print(''.isspace()) # 是否是空格 False" ] }, { "cell_type": "code", "execution_count": 72, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "False\n" ] } ], "source": [ "print('My name is'.istitle()) # 字符串首字母大写为title,否则不是" ] }, { "cell_type": "code", "execution_count": 73, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1+2+3\n" ] } ], "source": [ "print('+'.join(['1','2','3'])) # 对一列表中所有元素进行join操作" ] }, { "cell_type": "code", "execution_count": 74, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "my \tname is {name} and i am {year} old************\n" ] } ], "source": [ "print(name.ljust(50,'*')) # 左对齐字符串,多余位用*补全" ] }, { "cell_type": "code", "execution_count": 75, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "------------my \tname is {name} and i am {year} old\n" ] } ], "source": [ "print(name.rjust(50,'-')) # 右对齐字符串,多余位用*-补全" ] }, { "cell_type": "code", "execution_count": 76, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Alex\n" ] } ], "source": [ "print('\\n Alex'.lstrip()) # 去掉左边的空格/回车" ] }, { "cell_type": "code", "execution_count": 77, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Alex\n" ] } ], "source": [ "print('\\nAlex\\n'.rstrip()) # 去掉右边的空格/回车" ] }, { "cell_type": "code", "execution_count": 78, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Alex\n" ] } ], "source": [ "print('\\nAlex\\n'.strip()) # 去掉左边和右边的空格/回车" ] }, { "cell_type": "code", "execution_count": 79, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Alex\n" ] } ], "source": [ "print('Alex')" ] }, { "cell_type": "code", "execution_count": 80, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1l5x li\n" ] } ], "source": [ "p=str.maketrans(\"abcdef\",\"123456\")\n", "print(\"alex li\".translate(p)) #把alex li换成上一行对应的值" ] }, { "cell_type": "code", "execution_count": 81, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "aLex li\n" ] } ], "source": [ "print(\"alex li\".replace('l','L',1)) # 替换 1表示替换几个l,从左到右计算替换个数" ] }, { "cell_type": "code", "execution_count": 82, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "5\n" ] } ], "source": [ "print(\"alex li\".rfind('l')) # 找到的最右边的下标返回" ] }, { "cell_type": "code", "execution_count": 83, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['a', 'ex ', 'i']\n" ] } ], "source": [ "print(\"alex li\".split('l')) \n", "# 默认将字符串按照空格分隔成列表,也可以在()中填写相应的分隔符,比如以字符l分隔,print(\"alex li\".split(‘l’)),而且分隔符在列表中不会出现" ] }, { "cell_type": "code", "execution_count": 84, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['1', '2', '3', '4']\n" ] } ], "source": [ "print(\"1+2+3+4\".split('+')) # ['1', '2', '3', '4']" ] }, { "cell_type": "code", "execution_count": 85, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['1+2', '+3+4']\n" ] } ], "source": [ "print(\"1+2\\n+3+4\".splitlines()) # ['1+2', '+3+4']" ] }, { "cell_type": "code", "execution_count": 86, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "aLEX lI\n" ] } ], "source": [ "print(\"Alex Li\".swapcase()) # aLEX lI" ] }, { "cell_type": "code", "execution_count": 87, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Lex Li\n" ] } ], "source": [ "print('lex li'.title()) # Lex Li" ] }, { "cell_type": "code", "execution_count": 88, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "00000000000000000000000000000000000000000000lex li\n", "---\n" ] } ], "source": [ "print('lex li'.zfill(50)) #不够以0填充\n", "print('---')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 8.字典" ] }, { "cell_type": "code", "execution_count": 89, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'stu1101': 'tengxun', 'stu1102': 'baidu', 'stu1103': 'ali'}\n" ] } ], "source": [ "# 字典无序\n", "info={\n", " 'stu1101':\"tengxun\",\n", " 'stu1102':\"baidu\",\n", " 'stu1103':\"ali\",\n", "}\n", "\n", "print(info)" ] }, { "cell_type": "code", "execution_count": 90, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "tengxun\n" ] } ], "source": [ "# 0.查找\n", "# 方法一:确定存在\n", "print(info[\"stu1101\"]) # 查找若不在,则报错" ] }, { "cell_type": "code", "execution_count": 91, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "None\n" ] } ], "source": [ "print(info.get(\"stu11004\")) # 查找不在不会报错,直接返回None,若有直接返回" ] }, { "cell_type": "code", "execution_count": 92, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "True\n" ] } ], "source": [ "print('stu1103' in info) # True" ] }, { "cell_type": "code", "execution_count": 93, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'stu1101': '腾讯', 'stu1102': 'baidu', 'stu1103': 'ali'}\n" ] } ], "source": [ "# 1.修改\n", "info[\"stu1101\"]=\"腾讯\"\n", "print(info)" ] }, { "cell_type": "code", "execution_count": 94, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'stu1101': '腾讯', 'stu1102': 'baidu', 'stu1103': 'ali', 'stu1104': 'zhubajie'}\n" ] } ], "source": [ "# 2.增加\n", "info[\"stu1104\"]=\"zhubajie\"\n", "print(info)" ] }, { "cell_type": "code", "execution_count": 95, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'stu1102': 'baidu', 'stu1103': 'ali', 'stu1104': 'zhubajie'}\n" ] } ], "source": [ "# 3.删除\n", "# 方法一\n", "del info[\"stu1101\"]\n", "print(info)" ] }, { "cell_type": "code", "execution_count": 96, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'stu1103': 'ali', 'stu1104': 'zhubajie'}\n" ] }, { "data": { "text/plain": [ "'\\n# 随机删除\\ninfo.popitem()\\nprint(info)\\n'" ] }, "execution_count": 96, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 方法二\n", "info.pop(\"stu1102\")\n", "print(info)\n", "'''\n", "# 随机删除\n", "info.popitem()\n", "print(info)\n", "'''" ] }, { "cell_type": "code", "execution_count": 97, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'stu1103': 'ali', 'stu1104': 'zhubajie', 'stu1101': 'Alex', 1: 3, 2: 5}\n" ] } ], "source": [ "# 4.多级字典嵌套及操作\n", "av_catalog = {\n", " \"A\":{\n", " \"www.yo333.com\": [\"aaa\",\"111\"],\n", " \"www.po333.com\": [\"bbb\",\"222\"],\n", " \"333you.com\": [\"ccc\",\"333\"],\n", " \"333art.com\":[\"ddd\",\"444\"]\n", " },\n", " \"B\":{\n", " \"tokyo-lot\":[\"eee\",\"555\"]\n", " },\n", " \"C\":{\n", " \"1022\":[\"fff\",\"666\"]\n", " }\n", "}\n", "b={\n", " 'stu1101':\"Alex\",\n", " 1:3,\n", " 2:5\n", "}\n", "info.update(b) #将两个字典合并,存在key,则更新value,不存在key,则合并\n", "print(info)" ] }, { "cell_type": "code", "execution_count": 98, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "dict_items([('stu1103', 'ali'), ('stu1104', 'zhubajie'), ('stu1101', 'Alex'), (1, 3), (2, 5)])\n" ] } ], "source": [ "print(info.items()) #把一个字典转成列表" ] }, { "cell_type": "code", "execution_count": 99, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{6: 'test', 7: 'test', 8: 'test'}\n" ] } ], "source": [ "c=info.fromkeys([6,7,8],\"test\")\n", "print(c)" ] }, { "cell_type": "code", "execution_count": 100, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{6: [1, {'name': 'alex'}, 444], 7: [1, {'name': 'alex'}, 444], 8: [1, {'name': 'alex'}, 444]}\n" ] } ], "source": [ "c=info.fromkeys([6,7,8],[1,{'name':'alex'},444])\n", "print(c)" ] }, { "cell_type": "code", "execution_count": 101, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{6: [1, {'name': 'Jack Chen'}, 444], 7: [1, {'name': 'Jack Chen'}, 444], 8: [1, {'name': 'Jack Chen'}, 444]}\n" ] } ], "source": [ "c[7][1]['name']='Jack Chen' # 3个key共用一个value,修改一个则所有的都修改了\n", "print(c)" ] }, { "cell_type": "code", "execution_count": 106, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "--------\n", "{'A': {'www.yo333.com': ['aaa', '111'], 'www.po333.com': ['bbb', '222'], '333you.com': ['ccc', '可以在国内做镜像'], '333art.com': ['ddd', '444']}, 'B': {'tokyo-lot': ['eee', '555']}, 'C': {'1022': ['fff', '666']}, 'taiwan': {'www.baidu.com': [1, 2]}}\n" ] } ], "source": [ "print(\"--------\")\n", "av_catalog[\"A\"][\"333you.com\"][1]=\"可以在国内做镜像\" # 二级字典替换\n", "av_catalog.setdefault(\"taiwan\",{\"www.baidu.com\":[1,2]}) # 如果不重名,即创建一个新的值,如果重名,将找到的值返回\n", "print(av_catalog)" ] }, { "cell_type": "code", "execution_count": 107, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "dict_keys(['stu1103', 'stu1104', 'stu1101', 1, 2])\n" ] } ], "source": [ "print(info.keys()) # 打印出所有的key" ] }, { "cell_type": "code", "execution_count": 108, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "dict_values(['ali', 'zhubajie', 'Alex', 3, 5])\n" ] } ], "source": [ "print(info.values()) # 打印出所有的value" ] }, { "cell_type": "code", "execution_count": 109, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "---------------\n", "stu1103 ali\n", "stu1104 zhubajie\n", "stu1101 Alex\n", "1 3\n", "2 5\n", "---------------\n" ] } ], "source": [ "print(\"---------------\")\n", "for i in info:\n", " print(i,info[i]) #效率更高点\n", "print(\"---------------\")" ] }, { "cell_type": "code", "execution_count": 110, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "stu1103 ali\n", "stu1104 zhubajie\n", "stu1101 Alex\n", "1 3\n", "2 5\n" ] } ], "source": [ "for k,v in info.items():\n", " print(k,v)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 9.函数" ] }, { "cell_type": "code", "execution_count": 111, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "in the fun1\n", "in the fun2\n", "1\n", "None\n" ] } ], "source": [ "# 1.无参函数\n", "# 定义一个函数\n", "def fun1():\n", " '''testing'''\n", " print('in the fun1')\n", " return 1\n", "\n", "# 定义一个过程 实质就是无返回值的函数\n", "def fun2():\n", " '''testing2'''\n", " print('in the fun2')\n", "\n", "x=fun1()\n", "y=fun2()\n", "print(x)\n", "print(y) # 没有返回值得情况下,python隐式地返回一个None" ] }, { "cell_type": "code", "execution_count": 112, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "in the test1\n", "in the test2\n", "in the test3\n" ] } ], "source": [ "import time\n", "def logger():\n", " time_format='%Y-%m-%d %X %A %B %p %I'\n", " time_current=time.strftime(time_format)\n", " with open('a.txt','a+')as f:\n", " f.write('time %s end action\\n'%time_current)\n", "def test1():\n", " print('in the test1')\n", " logger()\n", "\n", "\n", "def test2():\n", " print('in the test2')\n", " logger()\n", " return 0\n", "\n", "def test3():\n", " print('in the test3')\n", " logger()\n", " return 1,{5:\"sda\",6:\"zad\"},[1,2,3]\n", "\n", "x=test1()\n", "y=test2()\n", "z=test3()" ] }, { "cell_type": "code", "execution_count": 113, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "None\n", "0\n", "(1, {5: 'sda', 6: 'zad'}, [1, 2, 3])\n" ] }, { "data": { "text/plain": [ "'\\n总结:\\n 返回值数=0:返回None\\n 返回值数=1:返回object\\n 返回值数>1:返回tuple\\n'" ] }, "execution_count": 113, "metadata": {}, "output_type": "execute_result" } ], "source": [ "print(x) # None\n", "print(y) # 0\n", "print(z) # (1, {5: 'sda', 6: 'zad'}, [1, 2, 3])\n", "\n", "\n", "'''\n", "总结:\n", " 返回值数=0:返回None\n", " 返回值数=1:返回object\n", " 返回值数>1:返回tuple\n", "'''" ] }, { "cell_type": "code", "execution_count": 114, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1\n", "2\n", "2\n", "1\n", "3\n", "2\n" ] } ], "source": [ "# 2.有参函数\n", "# 默认参数特点:调用函数的时候,默认参数非必须传递\n", "# 用途:1.默认安装值\n", "\n", "def test(x,y):\n", " print(x)\n", " print(y)\n", "\n", "test(1,2) # 位置参数调用 与形参意义对应\n", "test(y=1,x=2) # 关键字调用,与形参顺序无关\n", "test(3,y=2) # 如果既有关键字调用又有位置参数,前面一个一定是位置参数,一句话:关键参数一定不能写在位置参数前面\n" ] }, { "cell_type": "code", "execution_count": 115, "metadata": {}, "outputs": [], "source": [ "'''\n", "比如加入一个参数z\n", "'''\n", "def test1(x,y,z):\n", " print(x)\n", " print(y)\n", " print(z)" ] }, { "cell_type": "code", "execution_count": 116, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "3\n", "4\n", "6\n", "3\n", "4\n", "6\n" ] } ], "source": [ "# 关键参数一定不能放在位置参数前面\n", "test1(3,4,z=6)\n", "test1(3,z=6,y=4)" ] }, { "cell_type": "code", "execution_count": 117, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1\n", "2\n", "2\n" ] } ], "source": [ "# 默认参数,\n", "def test(x,y,z=2):\n", " print(x)\n", " print(y)\n", " print(z)\n", "\n", "test(1,2)" ] }, { "cell_type": "code", "execution_count": 118, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(1, 3, 4, 5, 5, 6)\n", "(1, 3, 4, 5, 5, 6)\n", "1\n", "(2, 3, 4, 5, 6, 7)\n" ] } ], "source": [ "# 用*args传递多个参数,转换成元组的方式 *表示一个功能代号,表示接受的参数不固定,args可以随意起名\n", "def test(*args):\n", " print(args)\n", "test(1,3,4,5,5,6)\n", "test(*[1,3,4,5,5,6]) # args=tuple([1,2,3,4,5])\n", "def test(x,*args):\n", " print(x)\n", " print(args)\n", "test(1,2,3,4,5,6,7) # 1 (2,3,4,5,6,7)" ] }, { "cell_type": "code", "execution_count": 119, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'name': 'alex', 'age': 8, 'id': 10, 'sex': 'M'}\n", "alex 8 10 M\n" ] } ], "source": [ "# 字典传值 **kwagrs:把N个关键字参数,转换成字典的方式\n", "def test(**kwargs):\n", " print(kwargs)\n", " print(kwargs['name'],kwargs['age'],kwargs['id'],kwargs['sex'])\n", "\n", "test(name='alex',age=8,id=10,sex='M') # {'name': 'alex', 'age': 8, 'id': 10, 'sex': 'M'}" ] }, { "cell_type": "code", "execution_count": 120, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'name': 'alex', 'age': 8, 'id': 10, 'sex': 'M'}\n", "alex 8 10 M\n" ] } ], "source": [ "test(**{'name':'alex','age':8,'id':10,'sex':'M'})" ] }, { "cell_type": "code", "execution_count": 121, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "alex\n", "{'age': 18, 'sex': 'M'}\n" ] } ], "source": [ "def test(name,**kwargs):\n", " print(name)\n", " print(kwargs)\n", "test('alex',age=18,sex='M') # 字典 {'age': 18, 'sex': 'M'}" ] }, { "cell_type": "code", "execution_count": 122, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "alex\n", "3\n", "{'sex': 'M', 'hobby': 'tesla'}\n" ] } ], "source": [ "# 默认参数得放在参数组前面\n", "def test(name,age=18,**kwargs):\n", " print(name)\n", " print(age)\n", " print(kwargs)\n", "\n", "test('alex',sex='M',hobby='tesla',age=3)" ] }, { "cell_type": "code", "execution_count": 123, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "alex\n", "3\n", "{'sex': 'M', 'hobby': 'tesla'}\n" ] } ], "source": [ "test('alex',3,sex='M',hobby='tesla')" ] }, { "cell_type": "code", "execution_count": 124, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "alex\n", "18\n", "{}\n" ] } ], "source": [ "test('alex') # 后面的**kwargs不赋值输出为空字典" ] }, { "cell_type": "code", "execution_count": 125, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "alex\n", "34\n", "()\n", "{'sex': 'M', 'hobby': 'tesla'}\n" ] } ], "source": [ "def test(name,age=18,*args,**kwargs):\n", " print(name)\n", " print(age)\n", " print(args)\n", " print(kwargs)\n", "test('alex',age=34,sex='M',hobby='tesla') # alex 34 () {'sex': 'M', 'hobby': 'tesla'}\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 10.高阶函数" ] }, { "cell_type": "code", "execution_count": 126, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "3\n" ] } ], "source": [ "# 高阶函数 变量可以指向函数,函数的参数能接受变量,那么一个函数就可以接受另一个函数作为参数,这个函数就叫做高阶函数\n", "def f(x):\n", " return x\n", "def add(x,y,f):\n", " return f(x)+f(y)\n", "res=add(1,2,f)\n", "print(res) # 3" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.6" } }, "nbformat": 4, "nbformat_minor": 2 } ================================================ FILE: 2.numpy/1.numpy-beginner.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 适合初学者快速入门的Numpy实战全集" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "本文由光城同学整理\n", "\n", "Numpy是一个用python实现的科学计算的扩展程序库,包括:\n", "* 1、一个强大的N维数组对象Array;\n", "* 2、比较成熟的(广播)函数库;\n", "* 3、用于整合C/C++和Fortran代码的工具包;\n", "* 4、实用的线性代数、傅里叶变换和随机数生成函数。numpy和稀疏矩阵运算包scipy配合使用更加方便。\n", "\n", "NumPy(Numeric Python)提供了许多高级的数值编程工具,如:矩阵数据类型、矢量处理,以及精密的运算库。专为进行严格的数字处理而产生。多为很多大型金融公司使用,以及核心的科学计算组织如:Lawrence Livermore,NASA用其处理一些本来使用C++,Fortran或Matlab等所做的任务。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 本文目录\n", "### 1.Numpy基本操作\n", "#### 1.1 列表转为矩阵\n", "#### 1.2 维度\n", "#### 1.3 行数和列数()\n", "#### 1.4 元素个数\n", "### 2.Numpy创建array\n", "#### 2.1 一维array创建\n", "#### 2.2 多维array创建\n", "#### 2.3 创建全零数组\n", "#### 2.4 创建全1数据\n", "#### 2.5 创建全空数组\n", "#### 2.6 创建连续数组\n", "#### 2.7 reshape操作\n", "#### 2.8 创建连续型数据\n", "#### 2.9 linspace的reshape操作\n", "### 3.Numpy基本运算\n", "#### 3.1 一维矩阵运算\n", "#### 3.2 多维矩阵运算\n", "#### 3.3 基本计算\n", "### 4.Numpy索引与切片\n", "### 5.Numpy array合并\n", "#### 5.1 数组合并\n", "#### 5.2 数组转置为矩阵\n", "#### 5.3 多个矩阵合并\n", "#### 5.4 合并例子2\n", "### 6.Numpy array分割\n", "#### 6.1 构造3行4列矩阵\n", "#### 6.2 等量分割\n", "#### 6.3 不等量分割\n", "#### 6.4 其他的分割方式\n", "### 7.Numpy copy与 =\n", "#### 7.1 =赋值方式会带有关联性\n", "#### 7.2 copy()赋值方式没有关联性\n", "### 8.广播机制\n", "### 9.常用函数" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1.Numpy基本操作" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 1.1 列表转为矩阵" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[1 3 5]\n", " [4 6 9]]\n" ] } ], "source": [ "import numpy as np\n", "array = np.array([\n", " [1,3,5],\n", " [4,6,9]\n", "])\n", "\n", "print(array)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 1.2 维度" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "number of dim: 2\n" ] } ], "source": [ "print('number of dim:', array.ndim)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 1.3 行数和列数()" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "shape: (2, 3)\n" ] } ], "source": [ "print('shape:',array.shape)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 1.4 元素个数" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "size: 6\n" ] } ], "source": [ "print('size:',array.size)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2.Numpy创建array" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 2.1 一维array创建" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 2 23 4]\n", "int32\n" ] } ], "source": [ "import numpy as np\n", "# 一维array\n", "a = np.array([2,23,4], dtype=np.int32) # np.int默认为int32\n", "print(a)\n", "print(a.dtype)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 2.2 多维array创建" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[2 3 4]\n", " [3 4 5]]\n" ] } ], "source": [ "# 多维array\n", "a = np.array([[2,3,4],\n", " [3,4,5]])\n", "print(a) # 生成2行3列的矩阵" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 2.3 创建全零数组" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[0. 0. 0. 0.]\n", " [0. 0. 0. 0.]\n", " [0. 0. 0. 0.]]\n" ] } ], "source": [ "a = np.zeros((3,4))\n", "print(a) # 生成3行4列的全零矩阵" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 2.4 创建全1数据" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[1 1 1 1]\n", " [1 1 1 1]\n", " [1 1 1 1]]\n" ] } ], "source": [ "# 创建全一数据,同时指定数据类型\n", "a = np.ones((3,4),dtype=np.int)\n", "print(a)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 2.5 创建全空数组" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[0. 0. 0. 0.]\n", " [0. 0. 0. 0.]\n", " [0. 0. 0. 0.]]\n" ] } ], "source": [ "# 创建全空数组,其实每个值都是接近于零的数\n", "a = np.empty((3,4))\n", "print(a)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 2.6 创建连续数组" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[10 12 14 16 18 20]\n" ] } ], "source": [ "# 创建连续数组\n", "a = np.arange(10,21,2) # 10-20的数据,步长为2\n", "print(a)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 2.7 reshape操作" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[10 12 14]\n", " [16 18 20]]\n" ] } ], "source": [ "# 使用reshape改变上述数据的形状\n", "b = a.reshape((2,3))\n", "print(b)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 2.8 创建连续型数据" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 1. 1.47368421 1.94736842 2.42105263 2.89473684 3.36842105\n", " 3.84210526 4.31578947 4.78947368 5.26315789 5.73684211 6.21052632\n", " 6.68421053 7.15789474 7.63157895 8.10526316 8.57894737 9.05263158\n", " 9.52631579 10. ]\n" ] } ], "source": [ "# 创建线段型数据\n", "a = np.linspace(1,10,20) # 开始端1,结束端10,且分割成20个数据,生成线段\n", "print(a)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 2.9 linspace的reshape操作" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[ 1. 1.47368421 1.94736842 2.42105263]\n", " [ 2.89473684 3.36842105 3.84210526 4.31578947]\n", " [ 4.78947368 5.26315789 5.73684211 6.21052632]\n", " [ 6.68421053 7.15789474 7.63157895 8.10526316]\n", " [ 8.57894737 9.05263158 9.52631579 10. ]]\n" ] } ], "source": [ "# 同时也可以reshape\n", "b = a.reshape((5,4))\n", "print(b)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3.Numpy基本运算" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 3.1 一维矩阵运算" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[10 20 30 40] [0 1 2 3]\n" ] } ], "source": [ "import numpy as np\n", "# 一维矩阵运算\n", "a = np.array([10,20,30,40])\n", "b = np.arange(4)\n", "print(a,b)" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[10 19 28 37]\n" ] } ], "source": [ "c = a - b\n", "print(c)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 0 20 60 120]\n" ] } ], "source": [ "print(a*b) # 若用a.dot(b),则为各维之和" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0 1 4 9]\n" ] } ], "source": [ "# 在Numpy中,想要求出矩阵中各个元素的乘方需要依赖双星符号 **,以二次方举例,即:\n", "c = b**2\n", "print(c)" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[-0.54402111 0.91294525 -0.98803162 0.74511316]\n" ] } ], "source": [ "# Numpy中具有很多的数学函数工具\n", "c = np.sin(a)\n", "print(c)" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ True True False False]\n" ] } ], "source": [ "print(b<2)" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[False True False True]\n" ] } ], "source": [ "a = np.array([1,1,4,3])\n", "b = np.arange(4)\n", "print(a==b)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 3.2 多维矩阵运算" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[1 1]\n", " [0 1]]\n" ] } ], "source": [ "a = np.array([[1,1],[0,1]])\n", "b = np.arange(4).reshape((2,2))\n", "print(a)" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[0 1]\n", " [2 3]]\n" ] } ], "source": [ "print(b)" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[2 4]\n", " [2 3]]\n" ] } ], "source": [ "# 多维度矩阵乘法\n", "# 第一种乘法方式:\n", "c = a.dot(b)\n", "print(c)" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[2 4]\n", " [2 3]]\n" ] } ], "source": [ "# 第二种乘法:\n", "c = np.dot(a,b)\n", "print(c)" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "3.825517216750851\n" ] } ], "source": [ "# 多维矩阵乘法不能直接使用'*'号\n", "\n", "a = np.random.random((2,4))\n", "\n", "print(np.sum(a)) " ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.09623355767721398\n" ] } ], "source": [ "print(np.min(a))" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.7420428188342583\n" ] } ], "source": [ "print(np.max(a))" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "a= [[0.48634962 0.74204282 0.09623356 0.69074812]\n", " [0.60218881 0.52734181 0.41434585 0.26626662]]\n" ] } ], "source": [ "print(\"a=\",a)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "如果你需要对行或者列进行查找运算,\n", "\n", "就需要在上述代码中为 axis 进行赋值。\n", "\n", "当axis的值为0的时候,将会以列作为查找单元,\n", "\n", "当axis的值为1的时候,将会以行作为查找单元。" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "sum= [2.01537412 1.8101431 ]\n" ] } ], "source": [ "print(\"sum=\",np.sum(a,axis=1))" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "min= [0.48634962 0.52734181 0.09623356 0.26626662]\n" ] } ], "source": [ "print(\"min=\",np.min(a,axis=0))" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "max= [0.74204282 0.60218881]\n" ] } ], "source": [ "print(\"max=\",np.max(a,axis=1))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 3.3 基本计算" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[ 2 3 4 5]\n", " [ 6 7 8 9]\n", " [10 11 12 13]]\n" ] } ], "source": [ "import numpy as np\n", "\n", "A = np.arange(2,14).reshape((3,4))\n", "print(A)" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0\n" ] } ], "source": [ "# 最小元素索引\n", "print(np.argmin(A)) # 0" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "11\n" ] } ], "source": [ "# 最大元素索引\n", "print(np.argmax(A)) # 11" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "7.5\n" ] } ], "source": [ "# 求整个矩阵的均值\n", "print(np.mean(A)) # 7.5" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "7.5\n" ] } ], "source": [ "print(np.average(A)) # 7.5" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "7.5\n" ] } ], "source": [ "print(A.mean()) # 7.5" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "7.5\n" ] } ], "source": [ "# 中位数\n", "print(np.median(A)) # 7.5" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 2 5 9 14 20 27 35 44 54 65 77 90]\n" ] } ], "source": [ "# 累加\n", "print(np.cumsum(A))" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[2 4]\n", " [4 2]]\n" ] } ], "source": [ "# 累差运算\n", "B = np.array([[3,5,9],\n", " [4,8,10]])\n", "print(np.diff(B))" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(array([0, 0, 0, 1, 1, 1], dtype=int64), array([0, 1, 2, 0, 1, 2], dtype=int64))\n", "(array([0, 0, 1, 1], dtype=int64), array([1, 2, 0, 2], dtype=int64))\n" ] } ], "source": [ "C = np.array([[0,5,9],\n", " [4,0,10]])\n", "print(np.nonzero(B))\n", "print(np.nonzero(C))" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[14 13 12 11]\n", " [10 9 8 7]\n", " [ 6 5 4 3]]\n" ] } ], "source": [ "# 仿照列表排序\n", "A = np.arange(14,2,-1).reshape((3,4)) # -1表示反向递减一个步长\n", "print(A)" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[11 12 13 14]\n", " [ 7 8 9 10]\n", " [ 3 4 5 6]]\n" ] } ], "source": [ "print(np.sort(A))" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[14 10 6]\n", " [13 9 5]\n", " [12 8 4]\n", " [11 7 3]]\n" ] } ], "source": [ "# 矩阵转置\n", "print(np.transpose(A))" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[14 10 6]\n", " [13 9 5]\n", " [12 8 4]\n", " [11 7 3]]\n" ] } ], "source": [ "print(A.T)" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[14 13 12 11]\n", " [10 9 8 7]\n", " [ 6 5 4 3]]\n" ] } ], "source": [ "print(A)" ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[9 9 9 9]\n", " [9 9 8 7]\n", " [6 5 5 5]]\n" ] } ], "source": [ "print(np.clip(A,5,9))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "clip(Array,Array_min,Array_max)\n", "\n", "将Array_minArray_max,则将矩阵中X变为Array_max." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4.Numpy索引与切片" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 3 4 5 6 7 8 9 10 11 12 13 14]\n" ] } ], "source": [ "import numpy as np\n", "A = np.arange(3,15)\n", "print(A)" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "6\n" ] } ], "source": [ "print(A[3])" ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[ 3 4 5 6]\n", " [ 7 8 9 10]\n", " [11 12 13 14]]\n" ] } ], "source": [ "B = A.reshape(3,4)\n", "print(B)" ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[11 12 13 14]\n" ] } ], "source": [ "print(B[2])" ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "5\n" ] } ], "source": [ "print(B[0][2])" ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "5\n" ] } ], "source": [ "print(B[0,2])" ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[8 9]\n" ] } ], "source": [ "# list切片操作\n", "print(B[1,1:3]) # [8 9] 1:3表示1-2不包含3" ] }, { "cell_type": "code", "execution_count": 55, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[3 4 5 6]\n", "[ 7 8 9 10]\n", "[11 12 13 14]\n" ] } ], "source": [ "for row in B:\n", " print(row)" ] }, { "cell_type": "code", "execution_count": 56, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 3 7 11]\n", "[ 4 8 12]\n", "[ 5 9 13]\n", "[ 6 10 14]\n" ] } ], "source": [ "# 如果要打印列,则进行转置即可\n", "for column in B.T:\n", " print(column)" ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 3 4 5 6 7 8 9 10 11 12 13 14]\n" ] } ], "source": [ "# 多维转一维\n", "A = np.arange(3,15).reshape((3,4))\n", "# print(A)\n", "print(A.flatten())\n", "# flat是一个迭代器,本身是一个object属性" ] }, { "cell_type": "code", "execution_count": 58, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "3\n", "4\n", "5\n", "6\n", "7\n", "8\n", "9\n", "10\n", "11\n", "12\n", "13\n", "14\n" ] } ], "source": [ "for item in A.flat:\n", " print(item)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "我们一起来来总结一下,看下面切片取值方式(对应颜色是取出来的结果):\n", "\n", "![](images/1.png)\n", "\n", "![](images/2.png)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 5.Numpy array合并" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 5.1 数组合并" ] }, { "cell_type": "code", "execution_count": 59, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[1 1 1]\n", " [2 2 2]]\n" ] } ], "source": [ "import numpy as np\n", "A = np.array([1,1,1])\n", "B = np.array([2,2,2])\n", "print(np.vstack((A,B)))\n", "# vertical stack 上下合并,对括号的两个整体操作。" ] }, { "cell_type": "code", "execution_count": 60, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[1 1 1]\n", " [2 2 2]]\n" ] } ], "source": [ "C = np.vstack((A,B))\n", "print(C)" ] }, { "cell_type": "code", "execution_count": 61, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(3,) (3,) (2, 3)\n" ] } ], "source": [ "print(A.shape,B.shape,C.shape)# 从shape中看出A,B均为拥有3项的数组(数列)" ] }, { "cell_type": "code", "execution_count": 62, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1 1 1 2 2 2]\n" ] } ], "source": [ "# horizontal stack左右合并\n", "D = np.hstack((A,B))\n", "print(D)" ] }, { "cell_type": "code", "execution_count": 63, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(3,) (3,) (6,)\n" ] } ], "source": [ "print(A.shape,B.shape,D.shape)\n", "# (3,) (3,) (6,)\n", "# 对于A,B这种,为数组或数列,无法进行转置,需要借助其他函数进行转置" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 5.2 数组转置为矩阵" ] }, { "cell_type": "code", "execution_count": 64, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[1 1 1]]\n" ] } ], "source": [ "print(A[np.newaxis,:]) # [1 1 1]变为[[1 1 1]]" ] }, { "cell_type": "code", "execution_count": 65, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(1, 3)\n" ] } ], "source": [ "print(A[np.newaxis,:].shape) # (3,)变为(1, 3)" ] }, { "cell_type": "code", "execution_count": 66, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[1]\n", " [1]\n", " [1]]\n" ] } ], "source": [ "print(A[:,np.newaxis])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 5.3 多个矩阵合并" ] }, { "cell_type": "code", "execution_count": 67, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "------------\n", "(3, 1)\n" ] } ], "source": [ "# concatenate的第一个例子\n", "print(\"------------\")\n", "print(A[:,np.newaxis].shape) # (3,1)" ] }, { "cell_type": "code", "execution_count": 68, "metadata": {}, "outputs": [], "source": [ "A = A[:,np.newaxis] # 数组转为矩阵\n", "B = B[:,np.newaxis] # 数组转为矩阵" ] }, { "cell_type": "code", "execution_count": 69, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[1]\n", " [1]\n", " [1]]\n" ] } ], "source": [ "print(A)" ] }, { "cell_type": "code", "execution_count": 70, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[2]\n", " [2]\n", " [2]]\n" ] } ], "source": [ "print(B)" ] }, { "cell_type": "code", "execution_count": 71, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[1]\n", " [1]\n", " [1]\n", " [2]\n", " [2]\n", " [2]\n", " [2]\n", " [2]\n", " [2]\n", " [1]\n", " [1]\n", " [1]]\n" ] } ], "source": [ "# axis=0纵向合并\n", "C = np.concatenate((A,B,B,A),axis=0)\n", "print(C)" ] }, { "cell_type": "code", "execution_count": 72, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[1 2]\n", " [1 2]\n", " [1 2]]\n" ] } ], "source": [ "# axis=1横向合并\n", "C = np.concatenate((A,B),axis=1)\n", "print(C)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 5.4 合并例子2" ] }, { "cell_type": "code", "execution_count": 73, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "-------------\n", "[[0 1 2 3]\n", " [4 5 6 7]]\n", "[[0 1 2 3]\n", " [4 5 6 7]]\n", "-------------\n" ] } ], "source": [ "# concatenate的第二个例子\n", "print(\"-------------\")\n", "a = np.arange(8).reshape(2,4)\n", "b = np.arange(8).reshape(2,4)\n", "print(a)\n", "print(b)\n", "print(\"-------------\")" ] }, { "cell_type": "code", "execution_count": 74, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[0 1 2 3]\n", " [4 5 6 7]\n", " [0 1 2 3]\n", " [4 5 6 7]]\n" ] } ], "source": [ "# axis=0多个矩阵纵向合并\n", "c = np.concatenate((a,b),axis=0)\n", "print(c)" ] }, { "cell_type": "code", "execution_count": 75, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[0 1 2 3 0 1 2 3]\n", " [4 5 6 7 4 5 6 7]]\n" ] } ], "source": [ "# axis=1多个矩阵横向合并\n", "c = np.concatenate((a,b),axis=1)\n", "print(c)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 6.Numpy array分割" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 6.1 构造3行4列矩阵" ] }, { "cell_type": "code", "execution_count": 76, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[ 0 1 2 3]\n", " [ 4 5 6 7]\n", " [ 8 9 10 11]]\n" ] } ], "source": [ "import numpy as np\n", "A = np.arange(12).reshape((3,4))\n", "print(A)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 6.2 等量分割" ] }, { "cell_type": "code", "execution_count": 77, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[array([[0, 1],\n", " [4, 5],\n", " [8, 9]]), array([[ 2, 3],\n", " [ 6, 7],\n", " [10, 11]])]\n" ] } ], "source": [ "# 等量分割\n", "# 纵向分割同横向合并的axis\n", "print(np.split(A, 2, axis=1))" ] }, { "cell_type": "code", "execution_count": 78, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]])]\n" ] } ], "source": [ "# 横向分割同纵向合并的axis\n", "print(np.split(A,3,axis=0))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 6.3 不等量分割" ] }, { "cell_type": "code", "execution_count": 79, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[array([[0, 1],\n", " [4, 5],\n", " [8, 9]]), array([[ 2],\n", " [ 6],\n", " [10]]), array([[ 3],\n", " [ 7],\n", " [11]])]\n" ] } ], "source": [ "print(np.array_split(A,3,axis=1))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 6.4 其他的分割方式" ] }, { "cell_type": "code", "execution_count": 80, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]])]\n" ] } ], "source": [ "# 横向分割\n", "print(np.vsplit(A,3)) # 等价于print(np.split(A,3,axis=0))" ] }, { "cell_type": "code", "execution_count": 81, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[array([[0, 1],\n", " [4, 5],\n", " [8, 9]]), array([[ 2, 3],\n", " [ 6, 7],\n", " [10, 11]])]\n" ] } ], "source": [ "# 纵向分割\n", "print(np.hsplit(A,2)) # 等价于print(np.split(A,2,axis=1))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 7.Numpy copy与 =" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 7.1 =赋值方式会带有关联性" ] }, { "cell_type": "code", "execution_count": 82, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0 1 2 3]\n" ] } ], "source": [ "import numpy as np\n", "# `=`赋值方式会带有关联性\n", "a = np.arange(4)\n", "print(a) # [0 1 2 3]" ] }, { "cell_type": "code", "execution_count": 83, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[11 1 2 3]\n" ] } ], "source": [ "b = a\n", "c = a\n", "d = b\n", "a[0] = 11\n", "print(a) # [11 1 2 3]" ] }, { "cell_type": "code", "execution_count": 84, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[11 1 2 3]\n" ] } ], "source": [ "print(b) # [11 1 2 3]" ] }, { "cell_type": "code", "execution_count": 85, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[11 1 2 3]\n" ] } ], "source": [ "print(c) # [11 1 2 3]" ] }, { "cell_type": "code", "execution_count": 86, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[11 1 2 3]\n" ] } ], "source": [ "print(d) # [11 1 2 3]" ] }, { "cell_type": "code", "execution_count": 87, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "True\n" ] } ], "source": [ "print(b is a) # True" ] }, { "cell_type": "code", "execution_count": 88, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "True\n" ] } ], "source": [ "print(c is a) # True" ] }, { "cell_type": "code", "execution_count": 89, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "True\n" ] } ], "source": [ "print(d is a) # True" ] }, { "cell_type": "code", "execution_count": 90, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[11 22 33 3]\n" ] } ], "source": [ "d[1:3] = [22,33]\n", "print(a) # [11 22 33 3]" ] }, { "cell_type": "code", "execution_count": 91, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[11 22 33 3]\n" ] } ], "source": [ "print(b) # [11 22 33 3]" ] }, { "cell_type": "code", "execution_count": 92, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[11 22 33 3]\n" ] } ], "source": [ "print(c) # [11 22 33 3]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 7.2 copy()赋值方式没有关联性" ] }, { "cell_type": "code", "execution_count": 93, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0 1 2 3]\n" ] } ], "source": [ "a = np.arange(4)\n", "print(a) # [0 1 2 3]" ] }, { "cell_type": "code", "execution_count": 94, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0 1 2 3]\n" ] } ], "source": [ "b =a.copy() # deep copy\n", "print(b) # [0 1 2 3]" ] }, { "cell_type": "code", "execution_count": 95, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 0 1 2 44]\n", "[0 1 2 3]\n" ] } ], "source": [ "a[3] = 44\n", "print(a) # [ 0 1 2 44]\n", "print(b) # [0 1 2 3]\n", "\n", "# 此时a与b已经没有关联" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 8.广播机制" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "numpy数组间的基础运算是一对一,也就是`a.shape==b.shape`,但是当两者不一样的时候,就会自动触发广播机制,如下例子:" ] }, { "cell_type": "code", "execution_count": 96, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[ 0 1 2]\n", " [10 11 12]\n", " [20 21 22]\n", " [30 31 32]]\n" ] } ], "source": [ "from numpy import array\n", "a = array([[ 0, 0, 0],\n", " [10,10,10],\n", " [20,20,20],\n", " [30,30,30]])\n", "b = array([0,1,2])\n", "print(a+b)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "为什么是这个样子?\n", "\n", "这里以tile模拟上述操作,来回到`a.shape==b.shape`情况!" ] }, { "cell_type": "code", "execution_count": 97, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[ 0 1 2]\n", " [10 11 12]\n", " [20 21 22]\n", " [30 31 32]]\n" ] } ], "source": [ "# 对[0,1,2]行重复3次,列重复1次\n", "b = np.tile([0,1,2],(4,1))\n", "print(a+b)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "到这里,我们来给出一张图\n", "\n", "![](images/3.png)\n", "\n", "也可以看这张图:\n", "![](images/4.png)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "是不是任何情况都可以呢?\n", "\n", "当然不是,只有当两个数组的`trailing dimensions compatible`时才会触发广播,否则报错`ValueError: frames are not aligned exception`。\n", "\n", "上面表达意思是尾部维度必须兼容!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 9.常用函数" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 9.1 np.bincount()" ] }, { "cell_type": "code", "execution_count": 98, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([1, 2, 1, 2, 1], dtype=int64)" ] }, "execution_count": 98, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x = np.array([1, 2, 3, 3, 0, 1, 4])\n", "np.bincount(x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "统计索引出现次数:索引0出现1次,1出现2次,2出现1次,3出现2次,4出现1次\n", "\n", "因此通过bincount计算出索引出现次数如下:\n", "\n", "上面怎么得到的?\n", "\n", "对于bincount计算吗,bin的数量比x中最大数多1,例如x最大为4,那么bin数量为5(index从0到4),也就会bincount输出的一维数组为5个数,bincount中的数又代表什么?代表的是它的索引值在x中出现的次数!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "还是以上述x为例子,当我们设置weights参数时候,结果又是什么?\n", "\n", "这里假定:" ] }, { "cell_type": "code", "execution_count": 99, "metadata": {}, "outputs": [], "source": [ "w = np.array([0.3,0.5,0.7,0.6,0.1,-0.9,1])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "那么设置这个w权重后,结果为多少?" ] }, { "cell_type": "code", "execution_count": 100, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 0.1, -0.6, 0.5, 1.3, 1. ])" ] }, "execution_count": 100, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.bincount(x,weights=w)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "怎么计算的?\n", "\n", "先对x与w抽取出来:\n", "\n", "`x ---> [1, 2, 3, 3, 0, 1, 4]`\n", "\n", "`w ---> [0.3,0.5,0.7,0.6,0.1,-0.9,1]`\n", "索引 0 出现在x中index=4位置,那么在w中访问index=4的位置即可,w[4]=0.1\n", "\n", "索引 1 出现在x中index=0与index=5位置,那么在w中访问`index=0`与`index=5`的位置即可,然后将两这个加和,计算得:`w[0]+w[5]=-0.6`\n", "其余的按照上面的方法即可!\n", "\n", "bincount的另外一个参数为minlength,这个参数简单,可以这么理解,当所给的bin数量多于实际从x中得到的bin数量后,后面没有访问到的设置为0即可。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "还是上述x为例:\n", "\n", "这里我们直接设置minlength=7参数,并输出!" ] }, { "cell_type": "code", "execution_count": 101, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 0.1, -0.6, 0.5, 1.3, 1. , 0. , 0. ])" ] }, "execution_count": 101, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.bincount(x,weights=w,minlength=7)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "与上面相比多了两个0,这两个怎么会多?\n", "\n", "上面知道,这个bin数量为5,index从0到4,那么当minlength为7的时候,也就是总长为7,index从0到6,多了后面两位,直接补位为0即可!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 9.2 np.argmax()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "函数原型为:`numpy.argmax(a, axis=None, out=None)`.\n", "\n", "函数表示返回沿轴axis最大值的索引。" ] }, { "cell_type": "code", "execution_count": 102, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "3\n" ] } ], "source": [ "x = [[1,3,3],\n", " [7,5,2]]\n", "print(np.argmax(x))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "对于这个例子我们知道,7最大,索引位置为3(这个索引按照递增顺序)!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "axis属性\n", "\n", "axis=0表示按列操作,也就是对比当前列,找出最大值的索引!" ] }, { "cell_type": "code", "execution_count": 103, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1 1 0]\n" ] } ], "source": [ "x = [[1,3,3],\n", " [7,5,2]]\n", "print(np.argmax(x,axis=0))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "axis=1表示按行操作,也就是对比当前行,找出最大值的索引!" ] }, { "cell_type": "code", "execution_count": 104, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1 1 0]\n" ] } ], "source": [ "x = [[1,3,3],\n", " [7,5,2]]\n", "print(np.argmax(x,axis=0))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "那如果碰到重复最大元素?\n", "\n", "返回第一个最大值索引即可!\n", "\n", "例如:" ] }, { "cell_type": "code", "execution_count": 105, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1\n" ] } ], "source": [ "x = np.array([1, 3, 2, 3, 0, 1, 0])\n", "print(x.argmax())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 9.3 上述合并实例" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "这里来融合上述两个函数,举个例子:" ] }, { "cell_type": "code", "execution_count": 106, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1\n" ] } ], "source": [ "x = np.array([1, 2, 3, 3, 0, 1, 4])\n", "print(np.argmax(np.bincount(x)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "最终结果为1,为什么?\n", "\n", "首先通过`np.bincount(x)`得到的结果是:`[1 2 1 2 1]`,再根据最后的遇到重复最大值项,则返回第一个最大值的index即可!2的index为1,所以返回1。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 9.4 求取精度" ] }, { "cell_type": "code", "execution_count": 107, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([-1., 1., 2., 10., 13.])" ] }, "execution_count": 107, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.around([-0.6,1.2798,2.357,9.67,13], decimals=0)#取指定位置的精度" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "看到没,负数进位取绝对值大的!" ] }, { "cell_type": "code", "execution_count": 108, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 1.3, 2.4, 9.7, 13. ])" ] }, "execution_count": 108, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.around([1.2798,2.357,9.67,13], decimals=1)" ] }, { "cell_type": "code", "execution_count": 109, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 1.28, 2.36, 9.67, 13. ])" ] }, "execution_count": 109, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.around([1.2798,2.357,9.67,13], decimals=2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "从上面可以看出,decimals表示指定保留有效数的位数,当超过5就会进位(此时包含5)!\n", "\n", "但是,如果这个参数设置为负数,又表示什么?" ] }, { "cell_type": "code", "execution_count": 110, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 0, 0, 0, 10, 60])" ] }, "execution_count": 110, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.around([1,2,5,6,56], decimals=-1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "发现没,当超过5时候(不包含5),才会进位!-1表示看一位数进位即可,那么如果改为-2呢,那就得看两位!" ] }, { "cell_type": "code", "execution_count": 111, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 0, 0, 0, 0, 100, 200])" ] }, "execution_count": 111, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.around([1,2,5,50,56,190], decimals=-2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "看到没,必须看两位,超过50才会进位,190的话,就看后面两位,后两位90超过50,进位,那么为200!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "计算沿指定轴第N维的离散差值" ] }, { "cell_type": "code", "execution_count": 112, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[ 1 2 3 4 5]\n", " [ 6 7 8 9 10]\n", " [11 12 13 14 15]]\n" ] } ], "source": [ "x = np.arange(1 , 16).reshape((3 , 5))\n", "print(x)" ] }, { "cell_type": "code", "execution_count": 113, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[1, 1, 1, 1],\n", " [1, 1, 1, 1],\n", " [1, 1, 1, 1]])" ] }, "execution_count": 113, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.diff(x,axis=1) #默认axis=1" ] }, { "cell_type": "code", "execution_count": 114, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[5, 5, 5, 5, 5],\n", " [5, 5, 5, 5, 5]])" ] }, "execution_count": 114, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.diff(x,axis=0) " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "取整" ] }, { "cell_type": "code", "execution_count": 115, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([-1., -2., -1., -2., 0., 1., 1.])" ] }, "execution_count": 115, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.floor([-0.6,-1.4,-0.1,-1.8,0,1.4,1.7])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "看到没,负数取整,跟上述的around一样,是向左!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "取上限" ] }, { "cell_type": "code", "execution_count": 116, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 2., 2., 2., 3., 2., -0., -0., -0.])" ] }, "execution_count": 116, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.ceil([1.2,1.5,1.8,2.1,2.0,-0.5,-0.6,-0.3])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "取上限!找这个小数的最大整数即可!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "查找" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "利用np.where实现小于0的值用0填充吗,大于0的数不变!" ] }, { "cell_type": "code", "execution_count": 117, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[ 1 0]\n", " [ 2 -2]\n", " [-2 1]]\n" ] } ], "source": [ "x = np.array([[1, 0],\n", " [2, -2],\n", " [-2, 1]])\n", "print(x)" ] }, { "cell_type": "code", "execution_count": 118, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[1, 0],\n", " [2, 0],\n", " [0, 1]])" ] }, "execution_count": 118, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.where(x>0,x,0)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.2" } }, "nbformat": 4, "nbformat_minor": 2 } ================================================ FILE: 2.numpy/2.numpy.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 1.Numpy简易入门" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1.1 认识NumPy数组对象" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "Numpy是一个用python实现的科学计算的扩展程序库,包括:\n", "* 1、一个强大的N维数组对象Array;\n", "* 2、比较成熟的(广播)函数库;\n", "* 3、用于整合C/C++和Fortran代码的工具包;\n", "* 4、实用的线性代数、傅里叶变换和随机数生成函数。numpy和稀疏矩阵运算包scipy配合使用更加方便。\n", "\n", "NumPy(Numeric Python)提供了许多高级的数值编程工具,如:矩阵数据类型、矢量处理,以及精密的运算库。专为进行严格的数字处理而产生。多为很多大型金融公司使用,以及核心的科学计算组织如:Lawrence Livermore,NASA用其处理一些本来使用C++,Fortran或Matlab等所做的任务。" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy as np # 导入NumPy工具包" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "data = np.arange(12).reshape(3, 4) # 创建一个3行4列的数组" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 0, 1, 2, 3],\n", " [ 4, 5, 6, 7],\n", " [ 8, 9, 10, 11]])" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data " ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "numpy.ndarray" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type(data)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.ndim # 数组维度的个数,输出结果2,表示二维数组" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(3, 4)" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.shape # 数组的维度,输出结果(3,4),表示3行4列" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "12" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.size # 数组元素的个数,输出结果12,表示总共有12个元素" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "dtype('int32')" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.dtype # 数组元素的类型,输出结果dtype('int64'),表示元素类型都是int64" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1.2 创建NumPy数组" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "import numpy as np" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "data1 = np.array([1, 2, 3]) # 创建一个一维数组" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([1, 2, 3])" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data1" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "data2 = np.array([[1, 2, 3], [4, 5, 6]]) # 创建一个二维数组" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[1, 2, 3],\n", " [4, 5, 6]])" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data2" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[0., 0., 0., 0.],\n", " [0., 0., 0., 0.],\n", " [0., 0., 0., 0.]])" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.zeros((3, 4))#创建一个全0数组" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[1., 1., 1., 1.],\n", " [1., 1., 1., 1.],\n", " [1., 1., 1., 1.]])" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.ones((3, 4))#创建全一数组" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 6.95312756e-310, 2.12199579e-314],\n", " [ 2.12199579e-314, 4.94065646e-324],\n", " [ 0.00000000e+000, -7.06252554e-311],\n", " [ 0.00000000e+000, -8.12021073e-313],\n", " [ 1.29923372e-311, 2.07507571e-322]])" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.empty((5, 2))# 创建全空数组,其实每个值都是接近于零的数" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 1, 6, 11, 16])" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.arange(1, 20, 5)" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([1., 2., 3., 4.])" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.array([1, 2, 3, 4], float)" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[1., 1., 1.],\n", " [1., 1., 1.]])" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.ones((2, 3), dtype='float64')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1.3 ndarry对象的数据类型" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1.3.1 查看数据类型" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [], "source": [ "data_one = np.array([[1, 2, 3], [4, 5, 6]])" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'int32'" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data_one.dtype.name" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1.3.2 转换数据类型" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [], "source": [ "data = np.array([[1, 2, 3], [4, 5, 6]]) " ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "dtype('int32')" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.dtype" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [], "source": [ "float_data = data.astype(np.float64) # 数据类型转换为float64" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "dtype('float64')" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "float_data.dtype" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [], "source": [ "float_data = np.array([1.2, 2.3, 3.5])" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([1.2, 2.3, 3.5])" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "float_data" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [], "source": [ "int_data = float_data.astype(np.int64) # 数据类型转换为int64" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([1, 2, 3], dtype=int64)" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "int_data" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [], "source": [ "str_data = np.array(['1', '2', '3'])" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [], "source": [ "int_data = str_data.astype(np.int64)" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([1, 2, 3], dtype=int64)" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "int_data" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1.4 数组运算" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1.4.1向量化运算" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [], "source": [ "import numpy as np" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [], "source": [ "data1 = np.array([[1, 2, 3], [4, 5, 6]])" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [], "source": [ "data2 = np.array([[1, 2, 3], [4, 5, 6]])" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 2, 4, 6],\n", " [ 8, 10, 12]])" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data1 + data2 # 数组相加" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 1, 4, 9],\n", " [16, 25, 36]])" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data1 * data2 # 数组相乘" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[0, 0, 0],\n", " [0, 0, 0]])" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data1 - data2 # 数组相减" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[1., 1., 1.],\n", " [1., 1., 1.]])" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data1 / data2 # 数组相除" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1.4.2 数组广播" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "numpy数组间的基础运算是一对一,也就是`a.shape==b.shape`,但是当两者不一样的时候,就会自动触发广播机制,如下例子:" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [], "source": [ "import numpy as np" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [], "source": [ "arr1 = np.array([[0], [1], [2], [3]])" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(4, 1)" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr1.shape" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [], "source": [ "arr2 = np.array([1, 2, 3])" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(3,)" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr2.shape" ] }, { "cell_type": "code", "execution_count": 45, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "array([[1, 2, 3],\n", " [2, 3, 4],\n", " [3, 4, 5],\n", " [4, 5, 6]])" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr1 + arr2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "到这里,我们来给出一张图\n", "\n", "![](images/3.png)\n", "\n", "也可以看这张图:\n", "![](images/4.png)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1.4.3 数组与标量间的运算" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [], "source": [ "import numpy as np" ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [], "source": [ "data1 = np.array([[1, 2, 3], [4, 5, 6]])" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [], "source": [ "data2 = 10" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[11, 12, 13],\n", " [14, 15, 16]])" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data1 + data2 # 数组相加" ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[10, 20, 30],\n", " [40, 50, 60]])" ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data1 * data2 # 数组相乘" ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[-9, -8, -7],\n", " [-6, -5, -4]])" ] }, "execution_count": 51, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data1 - data2 # 数组相减" ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[0.1, 0.2, 0.3],\n", " [0.4, 0.5, 0.6]])" ] }, "execution_count": 52, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data1 / data2 # 数组相除" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1.5 ndarray的索引和切片" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1.5.1 整数索引和切片的基本使用" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "我们一起来来总结一下,看下面切片取值方式(对应颜色是取出来的结果):\n", "\n", "![](images/1.png)\n", "\n", "![](images/2.png)" ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [], "source": [ "import numpy as np" ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [], "source": [ "arr = np.arange(8) # 创建一个一维数组" ] }, { "cell_type": "code", "execution_count": 55, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([0, 1, 2, 3, 4, 5, 6, 7])" ] }, "execution_count": 55, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr" ] }, { "cell_type": "code", "execution_count": 56, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "5" ] }, "execution_count": 56, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr[5] # 获取索引为5的元素" ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([3, 4])" ] }, "execution_count": 57, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr[3:5] # 获取索引为3~5的元素,但不包括5" ] }, { "cell_type": "code", "execution_count": 58, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([1, 3, 5])" ] }, "execution_count": 58, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr[1:6:2] # 获取索引为1~6的元素,步长为2" ] }, { "cell_type": "code", "execution_count": 59, "metadata": {}, "outputs": [], "source": [ "import numpy as np" ] }, { "cell_type": "code", "execution_count": 60, "metadata": {}, "outputs": [], "source": [ "arr2d = np.array([[1, 2, 3],[4, 5, 6],[7, 8, 9]]) # 创建二维数组" ] }, { "cell_type": "code", "execution_count": 61, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[1, 2, 3],\n", " [4, 5, 6],\n", " [7, 8, 9]])" ] }, "execution_count": 61, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr2d" ] }, { "cell_type": "code", "execution_count": 62, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([4, 5, 6])" ] }, "execution_count": 62, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr2d[1] # 获取索引为1的元素" ] }, { "cell_type": "code", "execution_count": 63, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2" ] }, "execution_count": 63, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr2d[0, 1] # 获取位于第0行第1列的元素" ] }, { "cell_type": "code", "execution_count": 64, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[1, 2, 3],\n", " [4, 5, 6]])" ] }, "execution_count": 64, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr2d[:2]" ] }, { "cell_type": "code", "execution_count": 65, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[1, 2],\n", " [4, 5]])" ] }, "execution_count": 65, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr2d[0:2, 0:2]" ] }, { "cell_type": "code", "execution_count": 66, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([4, 5])" ] }, "execution_count": 66, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr2d[1, :2]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1.5.2 花式(数组)索引的基本使用" ] }, { "cell_type": "code", "execution_count": 67, "metadata": {}, "outputs": [], "source": [ "import numpy as np" ] }, { "cell_type": "code", "execution_count": 68, "metadata": {}, "outputs": [], "source": [ "demo_arr = np.empty((4, 4)) # 创建一个空数组\n", "for i in range(4):\n", " demo_arr[i] = np.arange(i, i + 4) # 动态地为数组添加元素" ] }, { "cell_type": "code", "execution_count": 69, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[0., 1., 2., 3.],\n", " [1., 2., 3., 4.],\n", " [2., 3., 4., 5.],\n", " [3., 4., 5., 6.]])" ] }, "execution_count": 69, "metadata": {}, "output_type": "execute_result" } ], "source": [ "demo_arr" ] }, { "cell_type": "code", "execution_count": 70, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[0., 1., 2., 3.],\n", " [2., 3., 4., 5.]])" ] }, "execution_count": 70, "metadata": {}, "output_type": "execute_result" } ], "source": [ "demo_arr[[0, 2]] # 获取索引为[0,2]的元素" ] }, { "cell_type": "code", "execution_count": 71, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([2., 5.])" ] }, "execution_count": 71, "metadata": {}, "output_type": "execute_result" } ], "source": [ "demo_arr[[1, 3], [1, 2]] # 获取索引为(1,1)和(3,2)的元素" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1.5.3 布尔型" ] }, { "cell_type": "code", "execution_count": 72, "metadata": {}, "outputs": [], "source": [ "# 存储学生姓名的数组\n", "student_name = np.array(['Tom', 'Lily', 'Jack', 'Rose'])" ] }, { "cell_type": "code", "execution_count": 73, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array(['Tom', 'Lily', 'Jack', 'Rose'], dtype='0,x,0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1.8.3 数组排序" ] }, { "cell_type": "code", "execution_count": 118, "metadata": {}, "outputs": [], "source": [ "arr = np.array([[6, 2, 7], [3, 6, 2], [4, 3, 2]])" ] }, { "cell_type": "code", "execution_count": 119, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[6, 2, 7],\n", " [3, 6, 2],\n", " [4, 3, 2]])" ] }, "execution_count": 119, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr" ] }, { "cell_type": "code", "execution_count": 120, "metadata": {}, "outputs": [], "source": [ "arr.sort()" ] }, { "cell_type": "code", "execution_count": 121, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[2, 6, 7],\n", " [2, 3, 6],\n", " [2, 3, 4]])" ] }, "execution_count": 121, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr" ] }, { "cell_type": "code", "execution_count": 122, "metadata": {}, "outputs": [], "source": [ "arr = np.array([[6, 2, 7], [3, 6, 2], [4, 3, 2]])" ] }, { "cell_type": "code", "execution_count": 123, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[6, 2, 7],\n", " [3, 6, 2],\n", " [4, 3, 2]])" ] }, "execution_count": 123, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr" ] }, { "cell_type": "code", "execution_count": 124, "metadata": {}, "outputs": [], "source": [ "arr.sort(0) # 沿着编号为0的轴对元素排序" ] }, { "cell_type": "code", "execution_count": 125, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[3, 2, 2],\n", " [4, 3, 2],\n", " [6, 6, 7]])" ] }, "execution_count": 125, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1.8.4 检索数组元素" ] }, { "cell_type": "code", "execution_count": 126, "metadata": {}, "outputs": [], "source": [ "arr = np.array([[1, -2, -7], [-3, 6, 2], [-4, 3, 2]])" ] }, { "cell_type": "code", "execution_count": 127, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 1, -2, -7],\n", " [-3, 6, 2],\n", " [-4, 3, 2]])" ] }, "execution_count": 127, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr" ] }, { "cell_type": "code", "execution_count": 128, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 128, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.any(arr > 0) # arr的所有元素是否有一个大于0" ] }, { "cell_type": "code", "execution_count": 129, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "False" ] }, "execution_count": 129, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.all(arr > 0) # arr的所有元素是否都大于0" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1.8.5 唯一化及其他集合逻辑" ] }, { "cell_type": "code", "execution_count": 130, "metadata": {}, "outputs": [], "source": [ "arr = np.array([12, 11, 34, 23, 12, 8, 11])" ] }, { "cell_type": "code", "execution_count": 131, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 8, 11, 12, 23, 34])" ] }, "execution_count": 131, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.unique(arr)" ] }, { "cell_type": "code", "execution_count": 132, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ True, True, False, False, True, False, True])" ] }, "execution_count": 132, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.in1d(arr, [11, 12])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1.9 线性代数模块" ] }, { "cell_type": "code", "execution_count": 133, "metadata": {}, "outputs": [], "source": [ "arr_x = np.array([[1, 2, 3], [4, 5, 6]])" ] }, { "cell_type": "code", "execution_count": 134, "metadata": {}, "outputs": [], "source": [ "arr_y = np.array([[1, 2], [3, 4], [5, 6]])" ] }, { "cell_type": "code", "execution_count": 135, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[22, 28],\n", " [49, 64]])" ] }, "execution_count": 135, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr_x.dot(arr_y) # 等价于np.dot(arr_x, arr_y)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1.10随机数模块" ] }, { "cell_type": "code", "execution_count": 136, "metadata": {}, "outputs": [], "source": [ "import numpy as np" ] }, { "cell_type": "code", "execution_count": 137, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[0.90422833, 0.57874299, 0.36084718],\n", " [0.46674697, 0.59189161, 0.88876503],\n", " [0.51836003, 0.30765097, 0.79668824]])" ] }, "execution_count": 137, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.random.rand(3, 3) # 随机生成一个二维数组" ] }, { "cell_type": "code", "execution_count": 138, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[[0.21438832, 0.58877977, 0.86120009],\n", " [0.15222229, 0.53060997, 0.0562486 ],\n", " [0.88035435, 0.32505223, 0.9045713 ]],\n", "\n", " [[0.32907094, 0.88987195, 0.34523123],\n", " [0.90645746, 0.61257549, 0.83944649],\n", " [0.2015535 , 0.84522463, 0.87759584]]])" ] }, "execution_count": 138, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.random.rand(2, 3, 3) # 随机生成一个三维数组" ] }, { "cell_type": "code", "execution_count": 139, "metadata": {}, "outputs": [], "source": [ "import numpy as np" ] }, { "cell_type": "code", "execution_count": 140, "metadata": {}, "outputs": [], "source": [ "np.random.seed(0) # 生成随机数的种子" ] }, { "cell_type": "code", "execution_count": 141, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([0.5488135 , 0.71518937, 0.60276338, 0.54488318, 0.4236548 ])" ] }, "execution_count": 141, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.random.rand(5) # 随机生成包含5个元素的浮点数组" ] }, { "cell_type": "code", "execution_count": 142, "metadata": {}, "outputs": [], "source": [ "np.random.seed(0)" ] }, { "cell_type": "code", "execution_count": 143, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([0.5488135 , 0.71518937, 0.60276338, 0.54488318, 0.4236548 ])" ] }, "execution_count": 143, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.random.rand(5)" ] }, { "cell_type": "code", "execution_count": 144, "metadata": {}, "outputs": [], "source": [ "np.random.seed()" ] }, { "cell_type": "code", "execution_count": 145, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([0.19299506, 0.41434116, 0.90011257, 0.37469705, 0.69775797])" ] }, "execution_count": 145, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.random.rand(5)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.3" } }, "nbformat": 4, "nbformat_minor": 2 } ================================================ FILE: 2.numpy/README.md ================================================ ## Numpy简介 Numpy是一个用python实现的科学计算的扩展程序库,包括: - 1、一个强大的N维数组对象Array; - 2、比较成熟的(广播)函数库; - 3、用于整合C/C++和Fortran代码的工具包; - 4、实用的线性代数、傅里叶变换和随机数生成函数。numpy和稀疏矩阵运算包scipy配合使用更加方便。 NumPy(Numeric Python)提供了许多高级的数值编程工具,如:矩阵数据类型、矢量处理,以及精密的运算库。专为进行严格的数字处理而产生。多为很多大型金融公司使用,以及核心的科学计算组织如:Lawrence Livermore,NASA用其处理一些本来使用C++,Fortran或Matlab等所做的任务。 ## 一、适合初学者快速入门的Numpy实战全集 本文由光城同学整理 ### 本文目录 ​ 1.Numpy基本操作 - 1.1 列表转为矩阵 - 1.2 维度 - 1.3 行数和列数() - 1.4 元素个数 2.Numpy创建array - 2.1 一维array创建 - 2.2 多维array创建 - 2.3 创建全零数组 - 2.4 创建全1数据 - 2.5 创建全空数组 - 2.6 创建连续数组 - 2.7 reshape操作 - 2.8 创建连续型数据 - 2.9 linspace的reshape操作 3.Numpy基本运算 - 3.1 一维矩阵运算 - 3.2 多维矩阵运算 - 3.3 基本计算 4.Numpy索引与切片 5.Numpy array合并 - 5.1 数组合并 - 5.2 数组转置为矩阵 - 5.3 多个矩阵合并 - 5.4 合并例子2 6.Numpy array分割 - 6.1 构造3行4列矩阵 - 6.2 等量分割 - 6.3 不等量分割 - 6.4 其他的分割方式 7.Numpy copy与 = - 7.1 =赋值方式会带有关联性 - 7.2 copy()赋值方式没有关联性 8.广播机制 9.常用函数 # 二.Numpy简易入门 - 1.Numpy简易入门 1.1 认识NumPy数组对象 ​ 1.2 创建NumPy数组 ​ 1.3 ndarry对象的数据类型 ​ 1.3.1 查看数据类型 ​ 1.3.2 转换数据类型 ​ 1.4 数组运算 ​ 1.4.1向量化运算 ​ 1.4.2 数组广播 ​ 1.4.3 数组与标量间的运算 ​ 1.5 ndarray的索引和切片 ​ 1.5.1 整数索引和切片的基本使用 ​ 1.5.2 花式(数组)索引的基本使用 ​ 1.5.3 布尔型 ​ 1.6 数组的转置和轴对称 ​ 1.7 NumPy通用函数 ​ 1.8 利用NumPy数组进行数据处理 ​ 1.8.1 将条件逻辑转为数组运算 ​ 1.8.2 数组统计运算 ​ 1.8.3 数组排序 ​ 1.8.4 检索数组元素 ​ 1.8.5 唯一化及其他集合逻辑 ​ 1.9 线性代数模块 ​ 1.10随机数模块 ## 三、Numpy练习题100题-提高你的数据分析技能 本文总结了Numpy的常用操作,并做成练习题,练习题附答案建议读者把练习题完成。作者认为,做完练习题,Numpy的基本操作没有问题了,以后碰到问题也可以查这些习题。 网上可以搜到大量的Numpy教程和官方文档,但没有简单的方法来练习。教程是很好的资源,但要付诸实践。 只有实践,才能更好的加深学习。 本站从github搜索到了一些Numpy的练习题100题,含答案,并进行整理: 原代码作者:**Nicolas P. Rougier**(https://github.com/rougier/numpy-100) **本练习代码可以在github下载:** [numpy-100](numpy-100) **使用方法** 文件夹有三个不同的ipynb文件: - **100_Numpy_exercises_no_solution.ipynb** 没有答案代码的文件,这个是你做的练习 - **100_Numpy_exercises_with_hint.ipynb** 没有答案代码的文件,但有提示,这个你也可以用来练习 - **100_Numpy_exercises.ipynb** 有答案代码和注释的文件 你可以在**100_Numpy_exercises_no_solution.ipynb** 里输入代码,看看运行结果是否和**100_Numpy_exercises.ipynb** 里面的内容一致。 ## 四、Numpy练习题 整理了一个Numpy的练习题,总结了Numpy的常用操作,可以测试下自己对Numpy的掌握程度,有答案哦。 ### 试题目录 * Array creation routines(数组创建) * Array manipulation routines(数组操作) * String operations(字符串操作) * Numpy-specific help functions(Numpy特定帮助函数) * Input and output(输入和输出) * Linear algebra(线性代数) * Discrete Fourier Transform(离散傅里叶变换) * Logic functions(逻辑函数) * Mathematical functions(数学函数) * Random sampling (numpy.random)(随机抽样) * Set routines(集合操作) * Sorting, searching, and counting(排序、搜索和计数) * Statistics(统计) ### 试题内容 试题分为13个练习,每个练习分为两个ipynb文件,文件名带`_Solutions` 的是带答案的文件,建议初学者先练习下不带答案的文件,做不出来再看看答案。 **本练习代码可以在github下载:** [numpy_exercises](numpy_exercises) ### 作者及来源 - 作者: Kyubyong - 来源:https://github.com/Kyubyong/numpy_exercises ================================================ FILE: 2.numpy/numpy-100/100_Numpy_exercises.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", " 100 numpy exercises\n", "\n", "This is a collection of exercises that have been collected in the numpy mailing list, on stack overflow and in the numpy documentation. The goal of this collection is to offer a quick reference for both old and new users but also to provide a set of exercises for those who teach.\n", "\n", "\n", "If you find an error or think you've a better way to solve some of them, feel free to open an issue at " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 1. Import the numpy package under the name `np` (★☆☆)" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 2. Print the numpy version and the configuration (★☆☆)" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1.14.2\n", "mkl_info:\n", " libraries = ['mkl_rt']\n", " library_dirs = ['C:/ProgramData/Anaconda3\\\\Library\\\\lib']\n", " define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]\n", " include_dirs = ['C:\\\\Program Files (x86)\\\\IntelSWTools\\\\compilers_and_libraries_2016.4.246\\\\windows\\\\mkl', 'C:\\\\Program Files (x86)\\\\IntelSWTools\\\\compilers_and_libraries_2016.4.246\\\\windows\\\\mkl\\\\include', 'C:\\\\Program Files (x86)\\\\IntelSWTools\\\\compilers_and_libraries_2016.4.246\\\\windows\\\\mkl\\\\lib', 'C:/ProgramData/Anaconda3\\\\Library\\\\include']\n", "blas_mkl_info:\n", " libraries = ['mkl_rt']\n", " library_dirs = ['C:/ProgramData/Anaconda3\\\\Library\\\\lib']\n", " define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]\n", " include_dirs = ['C:\\\\Program Files (x86)\\\\IntelSWTools\\\\compilers_and_libraries_2016.4.246\\\\windows\\\\mkl', 'C:\\\\Program Files (x86)\\\\IntelSWTools\\\\compilers_and_libraries_2016.4.246\\\\windows\\\\mkl\\\\include', 'C:\\\\Program Files (x86)\\\\IntelSWTools\\\\compilers_and_libraries_2016.4.246\\\\windows\\\\mkl\\\\lib', 'C:/ProgramData/Anaconda3\\\\Library\\\\include']\n", "blas_opt_info:\n", " libraries = ['mkl_rt']\n", " library_dirs = ['C:/ProgramData/Anaconda3\\\\Library\\\\lib']\n", " define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]\n", " include_dirs = ['C:\\\\Program Files (x86)\\\\IntelSWTools\\\\compilers_and_libraries_2016.4.246\\\\windows\\\\mkl', 'C:\\\\Program Files (x86)\\\\IntelSWTools\\\\compilers_and_libraries_2016.4.246\\\\windows\\\\mkl\\\\include', 'C:\\\\Program Files (x86)\\\\IntelSWTools\\\\compilers_and_libraries_2016.4.246\\\\windows\\\\mkl\\\\lib', 'C:/ProgramData/Anaconda3\\\\Library\\\\include']\n", "lapack_mkl_info:\n", " libraries = ['mkl_rt']\n", " library_dirs = ['C:/ProgramData/Anaconda3\\\\Library\\\\lib']\n", " define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]\n", " include_dirs = ['C:\\\\Program Files (x86)\\\\IntelSWTools\\\\compilers_and_libraries_2016.4.246\\\\windows\\\\mkl', 'C:\\\\Program Files (x86)\\\\IntelSWTools\\\\compilers_and_libraries_2016.4.246\\\\windows\\\\mkl\\\\include', 'C:\\\\Program Files (x86)\\\\IntelSWTools\\\\compilers_and_libraries_2016.4.246\\\\windows\\\\mkl\\\\lib', 'C:/ProgramData/Anaconda3\\\\Library\\\\include']\n", "lapack_opt_info:\n", " libraries = ['mkl_rt']\n", " library_dirs = ['C:/ProgramData/Anaconda3\\\\Library\\\\lib']\n", " define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]\n", " include_dirs = ['C:\\\\Program Files (x86)\\\\IntelSWTools\\\\compilers_and_libraries_2016.4.246\\\\windows\\\\mkl', 'C:\\\\Program Files (x86)\\\\IntelSWTools\\\\compilers_and_libraries_2016.4.246\\\\windows\\\\mkl\\\\include', 'C:\\\\Program Files (x86)\\\\IntelSWTools\\\\compilers_and_libraries_2016.4.246\\\\windows\\\\mkl\\\\lib', 'C:/ProgramData/Anaconda3\\\\Library\\\\include']\n" ] } ], "source": [ "print(np.__version__)\n", "np.show_config()\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 3. Create a null vector of size 10 (★☆☆)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n" ] } ], "source": [ "Z = np.zeros(10)\n", "print(Z)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 4. How to find the memory size of any array (★☆☆)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "800 bytes\n" ] } ], "source": [ "Z = np.zeros((10,10))\n", "print(\"%d bytes\" % (Z.size * Z.itemsize))\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 5. How to get the documentation of the numpy add function from the command line? (★☆☆)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "ERROR:root:File `'`python.py'` not found.\n" ] } ], "source": [ "%run `python -c \"import numpy; numpy.info(numpy.add)\"`" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 6. Create a null vector of size 10 but the fifth value which is 1 (★☆☆)" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "pycharm": { "is_executing": false } }, "outputs": [ { "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)", "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mZ\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mzeros\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m10\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 2\u001b[0m \u001b[0mZ\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m4\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;36m1\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mZ\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;31mNameError\u001b[0m: name 'np' is not defined" ], "ename": "NameError", "evalue": "name 'np' is not defined", "output_type": "error" } ], "source": [ "Z = np.zeros(10)\n", "Z[4] = 1\n", "print(Z)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 7. Create a vector with values ranging from 10 to 49 (★☆☆)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33\n", " 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49]\n" ] } ], "source": [ "Z = np.arange(10,50)\n", "print(Z)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 8. Reverse a vector (first element becomes last) (★☆☆)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[49 48 47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26\n", " 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2\n", " 1 0]\n" ] } ], "source": [ "Z = np.arange(50)\n", "Z = Z[::-1]\n", "print(Z)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 9. Create a 3x3 matrix with values ranging from 0 to 8 (★☆☆)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[0 1 2]\n", " [3 4 5]\n", " [6 7 8]]\n" ] } ], "source": [ "Z = np.arange(9).reshape(3,3)\n", "print(Z)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 10. Find indices of non-zero elements from \\[1,2,0,0,4,0\\] (★☆☆)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(array([0, 1, 4], dtype=int64),)\n" ] } ], "source": [ "nz = np.nonzero([1,2,0,0,4,0])\n", "print(nz)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 11. Create a 3x3 identity matrix (★☆☆)" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[1. 0. 0.]\n", " [0. 1. 0.]\n", " [0. 0. 1.]]\n" ] } ], "source": [ "Z = np.eye(3)\n", "print(Z)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 12. Create a 3x3x3 array with random values (★☆☆)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[[0.38623687 0.72860689 0.11861256]\n", " [0.87583184 0.75984112 0.92027858]\n", " [0.15569262 0.24601167 0.40514924]]\n", "\n", " [[0.23179978 0.41058658 0.97117928]\n", " [0.76418077 0.5534301 0.52208481]\n", " [0.6620278 0.92392492 0.58433957]]\n", "\n", " [[0.14777566 0.83096875 0.20888782]\n", " [0.94630753 0.14862539 0.88969933]\n", " [0.10930963 0.13027745 0.41575222]]]\n" ] } ], "source": [ "Z = np.random.random((3,3,3))\n", "print(Z)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 13. Create a 10x10 array with random values and find the minimum and maximum values (★☆☆)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.004334784341918696 0.9914238367397242\n" ] } ], "source": [ "Z = np.random.random((10,10))\n", "Zmin, Zmax = Z.min(), Z.max()\n", "print(Zmin, Zmax)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 14. Create a random vector of size 30 and find the mean value (★☆☆)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.5720815414833132\n" ] } ], "source": [ "Z = np.random.random(30)\n", "m = Z.mean()\n", "print(m)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 15. Create a 2d array with 1 on the border and 0 inside (★☆☆)" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]\n", " [1. 0. 0. 0. 0. 0. 0. 0. 0. 1.]\n", " [1. 0. 0. 0. 0. 0. 0. 0. 0. 1.]\n", " [1. 0. 0. 0. 0. 0. 0. 0. 0. 1.]\n", " [1. 0. 0. 0. 0. 0. 0. 0. 0. 1.]\n", " [1. 0. 0. 0. 0. 0. 0. 0. 0. 1.]\n", " [1. 0. 0. 0. 0. 0. 0. 0. 0. 1.]\n", " [1. 0. 0. 0. 0. 0. 0. 0. 0. 1.]\n", " [1. 0. 0. 0. 0. 0. 0. 0. 0. 1.]\n", " [1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]]\n" ] } ], "source": [ "Z = np.ones((10,10))\n", "Z[1:-1,1:-1] = 0\n", "print(Z)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 16. How to add a border (filled with 0's) around an existing array? (★☆☆)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[0. 0. 0. 0. 0. 0. 0.]\n", " [0. 1. 1. 1. 1. 1. 0.]\n", " [0. 1. 1. 1. 1. 1. 0.]\n", " [0. 1. 1. 1. 1. 1. 0.]\n", " [0. 1. 1. 1. 1. 1. 0.]\n", " [0. 1. 1. 1. 1. 1. 0.]\n", " [0. 0. 0. 0. 0. 0. 0.]]\n" ] } ], "source": [ "Z = np.ones((5,5))\n", "Z = np.pad(Z, pad_width=1, mode='constant', constant_values=0)\n", "print(Z)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 17. What is the result of the following expression? (★☆☆)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "nan\n", "False\n", "False\n", "nan\n", "True\n", "False\n" ] } ], "source": [ "print(0 * np.nan)\n", "print(np.nan == np.nan)\n", "print(np.inf > np.nan)\n", "print(np.nan - np.nan)\n", "print(np.nan in set([np.nan]))\n", "print(0.3 == 3 * 0.1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 18. Create a 5x5 matrix with values 1,2,3,4 just below the diagonal (★☆☆)" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[0 0 0 0 0]\n", " [1 0 0 0 0]\n", " [0 2 0 0 0]\n", " [0 0 3 0 0]\n", " [0 0 0 4 0]]\n" ] } ], "source": [ "Z = np.diag(1+np.arange(4),k=-1)\n", "print(Z)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 19. Create a 8x8 matrix and fill it with a checkerboard pattern (★☆☆)" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[0 1 0 1 0 1 0 1]\n", " [1 0 1 0 1 0 1 0]\n", " [0 1 0 1 0 1 0 1]\n", " [1 0 1 0 1 0 1 0]\n", " [0 1 0 1 0 1 0 1]\n", " [1 0 1 0 1 0 1 0]\n", " [0 1 0 1 0 1 0 1]\n", " [1 0 1 0 1 0 1 0]]\n" ] } ], "source": [ "Z = np.zeros((8,8),dtype=int)\n", "Z[1::2,::2] = 1\n", "Z[::2,1::2] = 1\n", "print(Z)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 20. Consider a (6,7,8) shape array, what is the index (x,y,z) of the 100th element?" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(1, 5, 4)\n" ] } ], "source": [ "print(np.unravel_index(100,(6,7,8)))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 21. Create a checkerboard 8x8 matrix using the tile function (★☆☆)" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[0 1 0 1 0 1 0 1]\n", " [1 0 1 0 1 0 1 0]\n", " [0 1 0 1 0 1 0 1]\n", " [1 0 1 0 1 0 1 0]\n", " [0 1 0 1 0 1 0 1]\n", " [1 0 1 0 1 0 1 0]\n", " [0 1 0 1 0 1 0 1]\n", " [1 0 1 0 1 0 1 0]]\n" ] } ], "source": [ "Z = np.tile( np.array([[0,1],[1,0]]), (4,4))\n", "print(Z)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 22. Normalize a 5x5 random matrix (★☆☆)" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[ 0.60460987 1.57268218 -0.89575026 0.39473056 -1.03035535]\n", " [ 0.48811681 0.27544473 -0.44867393 0.29267064 -0.68241891]\n", " [-0.3952934 -1.05912252 -1.38505776 0.35666151 0.27154967]\n", " [-1.11291754 -1.55657621 1.41843066 1.9689818 0.90553902]\n", " [-0.50662642 -0.47622473 -1.01864733 0.07395656 1.94429034]]\n" ] } ], "source": [ "Z = np.random.random((5,5))\n", "Z = (Z - np.mean (Z)) / (np.std (Z))\n", "print(Z)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 23. Create a custom dtype that describes a color as four unsigned bytes (RGBA) (★☆☆)" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [], "source": [ "color = np.dtype([(\"r\", np.ubyte, 1),\n", " (\"g\", np.ubyte, 1),\n", " (\"b\", np.ubyte, 1),\n", " (\"a\", np.ubyte, 1)])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 24. Multiply a 5x3 matrix by a 3x2 matrix (real matrix product) (★☆☆)" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[3. 3.]\n", " [3. 3.]\n", " [3. 3.]\n", " [3. 3.]\n", " [3. 3.]]\n" ] } ], "source": [ "Z = np.dot(np.ones((5,3)), np.ones((3,2)))\n", "print(Z)\n", "\n", "# Alternative solution, in Python 3.5 and above\n", "Z = np.ones((5,3)) @ np.ones((3,2))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 25. Given a 1D array, negate all elements which are between 3 and 8, in place. (★☆☆)" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 0 1 2 3 -4 -5 -6 -7 -8 9 10]\n" ] } ], "source": [ "# Author: Evgeni Burovski\n", "\n", "Z = np.arange(11)\n", "Z[(3 < Z) & (Z <= 8)] *= -1\n", "print(Z)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 26. What is the output of the following script? (★☆☆)" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "9\n", "10\n" ] } ], "source": [ "# Author: Jake VanderPlas\n", "\n", "print(sum(range(5),-1))\n", "from numpy import *\n", "print(sum(range(5),-1))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 27. Consider an integer vector Z, which of these expressions are legal? (★☆☆)" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "ename": "ValueError", "evalue": "Integers to negative integer powers are not allowed.", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mValueError\u001b[0m Traceback (most recent call last)", "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mZ\u001b[0m\u001b[1;33m**\u001b[0m\u001b[0mZ\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 2\u001b[0m \u001b[1;36m2\u001b[0m \u001b[1;33m<<\u001b[0m \u001b[0mZ\u001b[0m \u001b[1;33m>>\u001b[0m \u001b[1;36m2\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3\u001b[0m \u001b[0mZ\u001b[0m \u001b[1;33m<\u001b[0m\u001b[1;33m-\u001b[0m \u001b[0mZ\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 4\u001b[0m \u001b[1;36m1j\u001b[0m\u001b[1;33m*\u001b[0m\u001b[0mZ\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5\u001b[0m \u001b[0mZ\u001b[0m\u001b[1;33m/\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m/\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;31mValueError\u001b[0m: Integers to negative integer powers are not allowed." ] } ], "source": [ "Z**Z\n", "2 << Z >> 2\n", "Z <- Z\n", "1j*Z\n", "Z/1/1\n", "ZZ" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 28. What are the result of the following expressions?" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "nan\n", "0\n", "[-2.14748365e+09]\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\ipykernel_launcher.py:1: RuntimeWarning: invalid value encountered in true_divide\n", " \"\"\"Entry point for launching an IPython kernel.\n", "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\ipykernel_launcher.py:2: RuntimeWarning: divide by zero encountered in floor_divide\n", " \n" ] } ], "source": [ "print(np.array(0) / np.array(0))\n", "print(np.array(0) // np.array(0))\n", "print(np.array([np.nan]).astype(int).astype(float))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 29. How to round away from zero a float array ? (★☆☆)" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 6. 6. 8. -9. 7. -9. 9. 8. 2. 4.]\n" ] } ], "source": [ "# Author: Charles R Harris\n", "\n", "Z = np.random.uniform(-10,+10,10)\n", "print (np.copysign(np.ceil(np.abs(Z)), Z))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 30. How to find common values between two arrays? (★☆☆)" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0 2]\n" ] } ], "source": [ "Z1 = np.random.randint(0,10,10)\n", "Z2 = np.random.randint(0,10,10)\n", "print(np.intersect1d(Z1,Z2))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 31. How to ignore all numpy warnings (not recommended)? (★☆☆)" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "ename": "SyntaxError", "evalue": "invalid syntax (, line 8)", "output_type": "error", "traceback": [ "\u001b[1;36m File \u001b[1;32m\"\"\u001b[1;36m, line \u001b[1;32m8\u001b[0m\n\u001b[1;33m An equivalent way, with a context manager:\u001b[0m\n\u001b[1;37m ^\u001b[0m\n\u001b[1;31mSyntaxError\u001b[0m\u001b[1;31m:\u001b[0m invalid syntax\n" ] } ], "source": [ "# Suicide mode on\n", "defaults = np.seterr(all=\"ignore\")\n", "Z = np.ones(1) / 0\n", "\n", "# Back to sanity\n", "_ = np.seterr(**defaults)\n", "\n", "An equivalent way, with a context manager:\n", "\n", "with np.errstate(divide='ignore'):\n", " Z = np.ones(1) / 0" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 32. Is the following expressions true? (★☆☆)" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\ipykernel_launcher.py:1: RuntimeWarning: invalid value encountered in sqrt\n", " \"\"\"Entry point for launching an IPython kernel.\n" ] }, { "data": { "text/plain": [ "False" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.sqrt(-1) == np.emath.sqrt(-1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 33. How to get the dates of yesterday, today and tomorrow? (★☆☆)" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [], "source": [ "yesterday = np.datetime64('today', 'D') - np.timedelta64(1, 'D')\n", "today = np.datetime64('today', 'D')\n", "tomorrow = np.datetime64('today', 'D') + np.timedelta64(1, 'D')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 34. How to get all the dates corresponding to the month of July 2016? (★★☆)" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['2016-07-01' '2016-07-02' '2016-07-03' '2016-07-04' '2016-07-05'\n", " '2016-07-06' '2016-07-07' '2016-07-08' '2016-07-09' '2016-07-10'\n", " '2016-07-11' '2016-07-12' '2016-07-13' '2016-07-14' '2016-07-15'\n", " '2016-07-16' '2016-07-17' '2016-07-18' '2016-07-19' '2016-07-20'\n", " '2016-07-21' '2016-07-22' '2016-07-23' '2016-07-24' '2016-07-25'\n", " '2016-07-26' '2016-07-27' '2016-07-28' '2016-07-29' '2016-07-30'\n", " '2016-07-31']\n" ] } ], "source": [ "Z = np.arange('2016-07', '2016-08', dtype='datetime64[D]')\n", "print(Z)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 35. How to compute ((A+B)\\*(-A/2)) in place (without copy)? (★★☆)" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([-1.5, -1.5, -1.5])" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A = np.ones(3)*1\n", "B = np.ones(3)*2\n", "C = np.ones(3)*3\n", "np.add(A,B,out=B)\n", "np.divide(A,2,out=A)\n", "np.negative(A,out=A)\n", "np.multiply(A,B,out=A)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 36. Extract the integer part of a random array using 5 different methods (★★☆)" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0. 9. 9. 7. 4. 5. 8. 7. 9. 6.]\n", "[0. 9. 9. 7. 4. 5. 8. 7. 9. 6.]\n", "[0. 9. 9. 7. 4. 5. 8. 7. 9. 6.]\n", "[0 9 9 7 4 5 8 7 9 6]\n", "[0. 9. 9. 7. 4. 5. 8. 7. 9. 6.]\n" ] } ], "source": [ "Z = np.random.uniform(0,10,10)\n", "\n", "print (Z - Z%1)\n", "print (np.floor(Z))\n", "print (np.ceil(Z)-1)\n", "print (Z.astype(int))\n", "print (np.trunc(Z))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 37. Create a 5x5 matrix with row values ranging from 0 to 4 (★★☆)" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[0. 1. 2. 3. 4.]\n", " [0. 1. 2. 3. 4.]\n", " [0. 1. 2. 3. 4.]\n", " [0. 1. 2. 3. 4.]\n", " [0. 1. 2. 3. 4.]]\n" ] } ], "source": [ "Z = np.zeros((5,5))\n", "Z += np.arange(5)\n", "print(Z)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 38. Consider a generator function that generates 10 integers and use it to build an array (★☆☆)" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0. 1. 2. 3. 4. 5. 6. 7. 8. 9.]\n" ] } ], "source": [ "def generate():\n", " for x in range(10):\n", " yield x\n", "Z = np.fromiter(generate(),dtype=float,count=-1)\n", "print(Z)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 39. Create a vector of size 10 with values ranging from 0 to 1, both excluded (★★☆)" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0.09090909 0.18181818 0.27272727 0.36363636 0.45454545 0.54545455\n", " 0.63636364 0.72727273 0.81818182 0.90909091]\n" ] } ], "source": [ "Z = np.linspace(0,1,11,endpoint=False)[1:]\n", "print(Z)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 40. Create a random vector of size 10 and sort it (★★☆)" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0.10181103 0.26965266 0.28134397 0.39484134 0.41394065 0.4810561\n", " 0.62636945 0.74893964 0.88528826 0.97455845]\n" ] } ], "source": [ "Z = np.random.random(10)\n", "Z.sort()\n", "print(Z)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 41. How to sum a small array faster than np.sum? (★★☆)" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "45" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Author: Evgeni Burovski\n", "\n", "Z = np.arange(10)\n", "np.add.reduce(Z)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 42. Consider two random array A and B, check if they are equal (★★☆)" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "False\n", "False\n" ] } ], "source": [ "A = np.random.randint(0,2,5)\n", "B = np.random.randint(0,2,5)\n", "\n", "# Assuming identical shape of the arrays and a tolerance for the comparison of values\n", "equal = np.allclose(A,B)\n", "print(equal)\n", "\n", "# Checking both the shape and the element values, no tolerance (values have to be exactly equal)\n", "equal = np.array_equal(A,B)\n", "print(equal)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 43. Make an array immutable (read-only) (★★☆)" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "ename": "ValueError", "evalue": "assignment destination is read-only", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mValueError\u001b[0m Traceback (most recent call last)", "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[0mZ\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mzeros\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m10\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[0mZ\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mflags\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mwriteable\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;32mFalse\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 3\u001b[1;33m \u001b[0mZ\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m]\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;36m1\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[1;31mValueError\u001b[0m: assignment destination is read-only" ] } ], "source": [ "Z = np.zeros(10)\n", "Z.flags.writeable = False\n", "Z[0] = 1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 44. Consider a random 10x2 matrix representing cartesian coordinates, convert them to polar coordinates (★★☆)" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0.90871086 0.46968371 0.33413258 0.71420399 0.59422443 1.05019902\n", " 0.83054677 0.79518205 0.86608232 1.03318804]\n", "[1.39381095 0.5465867 0.38210814 0.60935469 0.126408 0.87938679\n", " 1.28469889 1.51565796 0.02201551 0.36169143]\n" ] } ], "source": [ "Z = np.random.random((10,2))\n", "X,Y = Z[:,0], Z[:,1]\n", "R = np.sqrt(X**2+Y**2)\n", "T = np.arctan2(Y,X)\n", "print(R)\n", "print(T)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 45. Create random vector of size 10 and replace the maximum value by 0 (★★☆)" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0.50581524 0.25651855 0.01674091 0.88347224 0.73571427 0.44169975\n", " 0.65173587 0.84419501 0. 0.70272942]\n" ] } ], "source": [ "Z = np.random.random(10)\n", "Z[Z.argmax()] = 0\n", "print(Z)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 46. Create a structured array with `x` and `y` coordinates covering the \\[0,1\\]x\\[0,1\\] area (★★☆)" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[(0. , 0. ) (0.25, 0. ) (0.5 , 0. ) (0.75, 0. ) (1. , 0. )]\n", " [(0. , 0.25) (0.25, 0.25) (0.5 , 0.25) (0.75, 0.25) (1. , 0.25)]\n", " [(0. , 0.5 ) (0.25, 0.5 ) (0.5 , 0.5 ) (0.75, 0.5 ) (1. , 0.5 )]\n", " [(0. , 0.75) (0.25, 0.75) (0.5 , 0.75) (0.75, 0.75) (1. , 0.75)]\n", " [(0. , 1. ) (0.25, 1. ) (0.5 , 1. ) (0.75, 1. ) (1. , 1. )]]\n" ] } ], "source": [ "Z = np.zeros((5,5), [('x',float),('y',float)])\n", "Z['x'], Z['y'] = np.meshgrid(np.linspace(0,1,5),\n", " np.linspace(0,1,5))\n", "print(Z)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 47. Given two arrays, X and Y, construct the Cauchy matrix C (Cij =1/(xi - yj))" ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "3638.1636371179666\n" ] } ], "source": [ "# Author: Evgeni Burovski\n", "\n", "X = np.arange(8)\n", "Y = X + 0.5\n", "C = 1.0 / np.subtract.outer(X, Y)\n", "print(np.linalg.det(C))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 48. Print the minimum and maximum representable value for each numpy scalar type (★★☆)" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "-128\n", "127\n", "-2147483648\n", "2147483647\n", "-9223372036854775808\n", "9223372036854775807\n", "-3.4028235e+38\n", "3.4028235e+38\n", "1.1920929e-07\n", "-1.7976931348623157e+308\n", "1.7976931348623157e+308\n", "2.220446049250313e-16\n" ] } ], "source": [ "for dtype in [np.int8, np.int32, np.int64]:\n", " print(np.iinfo(dtype).min)\n", " print(np.iinfo(dtype).max)\n", "for dtype in [np.float32, np.float64]:\n", " print(np.finfo(dtype).min)\n", " print(np.finfo(dtype).max)\n", " print(np.finfo(dtype).eps)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 49. How to print all the values of an array? (★★☆)" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n", " [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n", " [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n", " [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n", " [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n", " [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n", " [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n", " [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n", " [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n", " [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n", " [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n", " [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n", " [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n", " [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n", " [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n", " [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]]\n" ] } ], "source": [ "np.set_printoptions(threshold=np.nan)\n", "Z = np.zeros((16,16))\n", "print(Z)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 50. How to find the closest value (to a given scalar) in a vector? (★★☆)" ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "39\n" ] } ], "source": [ "Z = np.arange(100)\n", "v = np.random.uniform(0,100)\n", "index = (np.abs(Z-v)).argmin()\n", "print(Z[index])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 51. Create a structured array representing a position (x,y) and a color (r,g,b) (★★☆)" ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[((0., 0.), (0., 0., 0.)) ((0., 0.), (0., 0., 0.))\n", " ((0., 0.), (0., 0., 0.)) ((0., 0.), (0., 0., 0.))\n", " ((0., 0.), (0., 0., 0.)) ((0., 0.), (0., 0., 0.))\n", " ((0., 0.), (0., 0., 0.)) ((0., 0.), (0., 0., 0.))\n", " ((0., 0.), (0., 0., 0.)) ((0., 0.), (0., 0., 0.))]\n" ] } ], "source": [ "Z = np.zeros(10, [ ('position', [ ('x', float, 1),\n", " ('y', float, 1)]),\n", " ('color', [ ('r', float, 1),\n", " ('g', float, 1),\n", " ('b', float, 1)])])\n", "print(Z)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 52. Consider a random vector with shape (100,2) representing coordinates, find point by point distances (★★☆)" ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[0. 0.70858175 0.65599073 0.78907021 0.03919281 0.58217916\n", " 0.33731228 0.7468501 0.81072821 0.34085638]\n", " [0.70858175 0. 0.59344529 0.09512034 0.71317592 0.25956344\n", " 0.80803137 0.53153655 0.36521195 0.63714484]\n", " [0.65599073 0.59344529 0. 0.68051235 0.62827887 0.33895441\n", " 0.46987665 0.13920127 0.34746751 0.3316422 ]\n", " [0.78907021 0.09512034 0.68051235 0. 0.79617326 0.35163036\n", " 0.90195864 0.60906462 0.4231078 0.73188727]\n", " [0.03919281 0.71317592 0.62827887 0.79617326 0. 0.5731727\n", " 0.29812293 0.72361492 0.79714149 0.30801574]\n", " [0.58217916 0.25956344 0.33895441 0.35163036 0.5731727 0.\n", " 0.58754608 0.30460826 0.24114521 0.40949401]\n", " [0.33731228 0.80803137 0.46987665 0.90195864 0.29812293 0.58754608\n", " 0. 0.59944019 0.75065963 0.17852171]\n", " [0.7468501 0.53153655 0.13920127 0.60906462 0.72361492 0.30460826\n", " 0.59944019 0. 0.22570191 0.44636568]\n", " [0.81072821 0.36521195 0.34746751 0.4231078 0.79714149 0.24114521\n", " 0.75065963 0.22570191 0. 0.57714969]\n", " [0.34085638 0.63714484 0.3316422 0.73188727 0.30801574 0.40949401\n", " 0.17852171 0.44636568 0.57714969 0. ]]\n", "[[0. 0.21528274 0.6433255 0.33437612 0.28776324 0.14819688\n", " 0.34321379 0.54524259 0.68307656 0.0830019 ]\n", " [0.21528274 0. 0.44712729 0.27403285 0.32591639 0.28524061\n", " 0.33478698 0.35128389 0.49450395 0.16691601]\n", " [0.6433255 0.44712729 0. 0.41503631 0.74613255 0.73233626\n", " 0.49409743 0.41928663 0.49963719 0.61255203]\n", " [0.33437612 0.27403285 0.41503631 0. 0.57318081 0.47403049\n", " 0.08658329 0.56115111 0.70031091 0.35760984]\n", " [0.28776324 0.32591639 0.74613255 0.57318081 0. 0.16110392\n", " 0.60777831 0.46777708 0.57012915 0.22441559]\n", " [0.14819688 0.28524061 0.73233626 0.47403049 0.16110392 0.\n", " 0.49018431 0.54358417 0.66733094 0.12437018]\n", " [0.34321379 0.33478698 0.49409743 0.08658329 0.60777831 0.49018431\n", " 0. 0.64241387 0.78297501 0.38468325]\n", " [0.54524259 0.35128389 0.41928663 0.56115111 0.46777708 0.54358417\n", " 0.64241387 0. 0.14386424 0.470974 ]\n", " [0.68307656 0.49450395 0.49963719 0.70031091 0.57012915 0.66733094\n", " 0.78297501 0.14386424 0. 0.60610333]\n", " [0.0830019 0.16691601 0.61255203 0.35760984 0.22441559 0.12437018\n", " 0.38468325 0.470974 0.60610333 0. ]]\n" ] } ], "source": [ "Z = np.random.random((10,2))\n", "X,Y = np.atleast_2d(Z[:,0], Z[:,1])\n", "D = np.sqrt( (X-X.T)**2 + (Y-Y.T)**2)\n", "print(D)\n", "\n", "# Much faster with scipy\n", "import scipy\n", "# Thanks Gavin Heverly-Coulson (#issue 1)\n", "import scipy.spatial\n", "\n", "Z = np.random.random((10,2))\n", "D = scipy.spatial.distance.cdist(Z,Z)\n", "print(D)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 53. How to convert a float (32 bits) array into an integer (32 bits) in place?" ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0 1 2 3 4 5 6 7 8 9]\n" ] } ], "source": [ "Z = np.arange(10, dtype=np.float32)\n", "Z = Z.astype(np.int32, copy=False)\n", "print(Z)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 54. How to read the following file? (★★☆)" ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[ 1 2 3 4 5]\n", " [ 6 -1 -1 7 8]\n", " [-1 -1 9 10 11]]\n" ] } ], "source": [ "from io import StringIO\n", "\n", "# Fake file \n", "s = StringIO(\"\"\"1, 2, 3, 4, 5\\n\n", " 6, , , 7, 8\\n\n", " , , 9,10,11\\n\"\"\")\n", "Z = np.genfromtxt(s, delimiter=\",\", dtype=np.int)\n", "print(Z)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 55. What is the equivalent of enumerate for numpy arrays? (★★☆)" ] }, { "cell_type": "code", "execution_count": 55, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(0, 0) 0\n", "(0, 1) 1\n", "(0, 2) 2\n", "(1, 0) 3\n", "(1, 1) 4\n", "(1, 2) 5\n", "(2, 0) 6\n", "(2, 1) 7\n", "(2, 2) 8\n", "(0, 0) 0\n", "(0, 1) 1\n", "(0, 2) 2\n", "(1, 0) 3\n", "(1, 1) 4\n", "(1, 2) 5\n", "(2, 0) 6\n", "(2, 1) 7\n", "(2, 2) 8\n" ] } ], "source": [ "Z = np.arange(9).reshape(3,3)\n", "for index, value in np.ndenumerate(Z):\n", " print(index, value)\n", "for index in np.ndindex(Z.shape):\n", " print(index, Z[index])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 56. Generate a generic 2D Gaussian-like array (★★☆)" ] }, { "cell_type": "code", "execution_count": 56, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[0.36787944 0.44822088 0.51979489 0.57375342 0.60279818 0.60279818\n", " 0.57375342 0.51979489 0.44822088 0.36787944]\n", " [0.44822088 0.54610814 0.63331324 0.69905581 0.73444367 0.73444367\n", " 0.69905581 0.63331324 0.54610814 0.44822088]\n", " [0.51979489 0.63331324 0.73444367 0.81068432 0.85172308 0.85172308\n", " 0.81068432 0.73444367 0.63331324 0.51979489]\n", " [0.57375342 0.69905581 0.81068432 0.89483932 0.9401382 0.9401382\n", " 0.89483932 0.81068432 0.69905581 0.57375342]\n", " [0.60279818 0.73444367 0.85172308 0.9401382 0.98773022 0.98773022\n", " 0.9401382 0.85172308 0.73444367 0.60279818]\n", " [0.60279818 0.73444367 0.85172308 0.9401382 0.98773022 0.98773022\n", " 0.9401382 0.85172308 0.73444367 0.60279818]\n", " [0.57375342 0.69905581 0.81068432 0.89483932 0.9401382 0.9401382\n", " 0.89483932 0.81068432 0.69905581 0.57375342]\n", " [0.51979489 0.63331324 0.73444367 0.81068432 0.85172308 0.85172308\n", " 0.81068432 0.73444367 0.63331324 0.51979489]\n", " [0.44822088 0.54610814 0.63331324 0.69905581 0.73444367 0.73444367\n", " 0.69905581 0.63331324 0.54610814 0.44822088]\n", " [0.36787944 0.44822088 0.51979489 0.57375342 0.60279818 0.60279818\n", " 0.57375342 0.51979489 0.44822088 0.36787944]]\n" ] } ], "source": [ "X, Y = np.meshgrid(np.linspace(-1,1,10), np.linspace(-1,1,10))\n", "D = np.sqrt(X*X+Y*Y)\n", "sigma, mu = 1.0, 0.0\n", "G = np.exp(-( (D-mu)**2 / ( 2.0 * sigma**2 ) ) )\n", "print(G)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 57. How to randomly place p elements in a 2D array? (★★☆)" ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]\n", " [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n", " [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n", " [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n", " [0. 1. 0. 0. 0. 0. 0. 0. 0. 0.]\n", " [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n", " [0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]\n", " [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n", " [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]\n", " [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]]\n" ] } ], "source": [ "# Author: Divakar\n", "\n", "n = 10\n", "p = 3\n", "Z = np.zeros((n,n))\n", "np.put(Z, np.random.choice(range(n*n), p, replace=False),1)\n", "print(Z)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 58. Subtract the mean of each row of a matrix (★★☆)" ] }, { "cell_type": "code", "execution_count": 58, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[ 0.08728985 0.34574179 -0.07096404 -0.35665903 0.27195823 -0.21226241\n", " -0.05786562 0.46226838 -0.51113477 0.04162763]\n", " [ 0.15769693 -0.00687416 -0.23088468 -0.27531393 -0.15748372 0.49855641\n", " -0.29182386 0.23153223 0.1335274 -0.05893261]\n", " [-0.19887161 -0.08551958 0.13483777 0.4249683 0.32140219 -0.01568819\n", " -0.25863495 -0.19687856 0.0745396 -0.20015498]\n", " [ 0.05544274 0.23450517 -0.25309467 0.00991447 -0.50428326 -0.09024474\n", " 0.01610101 0.4324277 0.13499273 -0.03576114]\n", " [ 0.08014561 0.44307603 -0.54198293 -0.15386254 0.377373 0.24122398\n", " -0.4620369 -0.03100136 0.21078297 -0.16371787]]\n" ] } ], "source": [ "# Author: Warren Weckesser\n", "\n", "X = np.random.rand(5, 10)\n", "\n", "# Recent versions of numpy\n", "Y = X - X.mean(axis=1, keepdims=True)\n", "\n", "# Older versions of numpy\n", "Y = X - X.mean(axis=1).reshape(-1, 1)\n", "\n", "print(Y)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 59. How to sort an array by the nth column? (★★☆)" ] }, { "cell_type": "code", "execution_count": 59, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[2 9 2]\n", " [5 7 9]\n", " [0 8 1]]\n", "[[5 7 9]\n", " [0 8 1]\n", " [2 9 2]]\n" ] } ], "source": [ "# Author: Steve Tjoa\n", "\n", "Z = np.random.randint(0,10,(3,3))\n", "print(Z)\n", "print(Z[Z[:,1].argsort()])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 60. How to tell if a given 2D array has null columns? (★★☆)" ] }, { "cell_type": "code", "execution_count": 60, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "False\n" ] } ], "source": [ "# Author: Warren Weckesser\n", "\n", "Z = np.random.randint(0,3,(3,10))\n", "print((~Z.any(axis=0)).any())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 61. Find the nearest value from a given value in an array (★★☆)" ] }, { "cell_type": "code", "execution_count": 61, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.3388283390062511\n" ] } ], "source": [ "Z = np.random.uniform(0,1,10)\n", "z = 0.5\n", "m = Z.flat[np.abs(Z - z).argmin()]\n", "print(m)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 62. Considering two arrays with shape (1,3) and (3,1), how to compute their sum using an iterator? (★★☆)" ] }, { "cell_type": "code", "execution_count": 62, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[0 1 2]\n", " [1 2 3]\n", " [2 3 4]]\n" ] } ], "source": [ "A = np.arange(3).reshape(3,1)\n", "B = np.arange(3).reshape(1,3)\n", "it = np.nditer([A,B,None])\n", "for x,y,z in it: z[...] = x + y\n", "print(it.operands[2])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 63. Create an array class that has a name attribute (★★☆)" ] }, { "cell_type": "code", "execution_count": 63, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "range_10\n" ] } ], "source": [ "class NamedArray(np.ndarray):\n", " def __new__(cls, array, name=\"no name\"):\n", " obj = np.asarray(array).view(cls)\n", " obj.name = name\n", " return obj\n", " def __array_finalize__(self, obj):\n", " if obj is None: return\n", " self.info = getattr(obj, 'name', \"no name\")\n", "\n", "Z = NamedArray(np.arange(10), \"range_10\")\n", "print (Z.name)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 64. Consider a given vector, how to add 1 to each element indexed by a second vector (be careful with repeated indices)? (★★★)" ] }, { "cell_type": "code", "execution_count": 64, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[2. 5. 4. 1. 1. 4. 3. 2. 5. 3.]\n", "[3. 9. 7. 1. 1. 7. 5. 3. 9. 5.]\n" ] } ], "source": [ "# Author: Brett Olsen\n", "\n", "Z = np.ones(10)\n", "I = np.random.randint(0,len(Z),20)\n", "Z += np.bincount(I, minlength=len(Z))\n", "print(Z)\n", "\n", "# Another solution\n", "# Author: Bartosz Telenczuk\n", "np.add.at(Z, I, 1)\n", "print(Z)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 65. How to accumulate elements of a vector (X) to an array (F) based on an index list (I)? (★★★)" ] }, { "cell_type": "code", "execution_count": 65, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0. 7. 0. 6. 5. 0. 0. 0. 0. 3.]\n" ] } ], "source": [ "# Author: Alan G Isaac\n", "\n", "X = [1,2,3,4,5,6]\n", "I = [1,3,9,3,4,1]\n", "F = np.bincount(I,X)\n", "print(F)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 66. Considering a (w,h,3) image of (dtype=ubyte), compute the number of unique colors (★★★)" ] }, { "cell_type": "code", "execution_count": 66, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "8\n" ] } ], "source": [ "# Author: Nadav Horesh\n", "\n", "w,h = 16,16\n", "I = np.random.randint(0,2,(h,w,3)).astype(np.ubyte)\n", "#Note that we should compute 256*256 first. \n", "#Otherwise numpy will only promote F.dtype to 'uint16' and overfolw will occur\n", "F = I[...,0]*(256*256) + I[...,1]*256 +I[...,2]\n", "n = len(np.unique(F))\n", "print(n)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 67. Considering a four dimensions array, how to get sum over the last two axis at once? (★★★)" ] }, { "cell_type": "code", "execution_count": 67, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[67 54 59 65]\n", " [71 59 49 46]\n", " [40 46 48 44]]\n", "[[67 54 59 65]\n", " [71 59 49 46]\n", " [40 46 48 44]]\n" ] } ], "source": [ "A = np.random.randint(0,10,(3,4,3,4))\n", "# solution by passing a tuple of axes (introduced in numpy 1.7.0)\n", "sum = A.sum(axis=(-2,-1))\n", "print(sum)\n", "# solution by flattening the last two dimensions into one\n", "# (useful for functions that don't accept tuples for axis argument)\n", "sum = A.reshape(A.shape[:-2] + (-1,)).sum(axis=-1)\n", "print(sum)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 68. Considering a one-dimensional vector D, how to compute means of subsets of D using a vector S of same size describing subset indices? (★★★)" ] }, { "cell_type": "code", "execution_count": 68, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0.36435063 0.49399621 0.41187814 0.55834713 0.50337821 0.59980105\n", " 0.54636651 0.62150694 0.46052147 0.55536347]\n", "0 0.364351\n", "1 0.493996\n", "2 0.411878\n", "3 0.558347\n", "4 0.503378\n", "5 0.599801\n", "6 0.546367\n", "7 0.621507\n", "8 0.460521\n", "9 0.555363\n", "dtype: float64\n" ] } ], "source": [ "# Author: Jaime Fernández del Río\n", "\n", "D = np.random.uniform(0,1,100)\n", "S = np.random.randint(0,10,100)\n", "D_sums = np.bincount(S, weights=D)\n", "D_counts = np.bincount(S)\n", "D_means = D_sums / D_counts\n", "print(D_means)\n", "\n", "# Pandas solution as a reference due to more intuitive code\n", "import pandas as pd\n", "print(pd.Series(D).groupby(S).mean())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 69. How to get the diagonal of a dot product? (★★★)" ] }, { "cell_type": "code", "execution_count": 69, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([1.43740433, 1.30533245, 1.32379824, 2.46896817, 0.67545867])" ] }, "execution_count": 69, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Author: Mathieu Blondel\n", "\n", "A = np.random.uniform(0,1,(5,5))\n", "B = np.random.uniform(0,1,(5,5))\n", "\n", "# Slow version \n", "np.diag(np.dot(A, B))\n", "\n", "# Fast version\n", "np.sum(A * B.T, axis=1)\n", "\n", "# Faster version\n", "np.einsum(\"ij,ji->i\", A, B)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 70. Consider the vector \\[1, 2, 3, 4, 5\\], how to build a new vector with 3 consecutive zeros interleaved between each value? (★★★)" ] }, { "cell_type": "code", "execution_count": 70, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1. 0. 0. 0. 2. 0. 0. 0. 3. 0. 0. 0. 4. 0. 0. 0. 5.]\n" ] } ], "source": [ "# Author: Warren Weckesser\n", "\n", "Z = np.array([1,2,3,4,5])\n", "nz = 3\n", "Z0 = np.zeros(len(Z) + (len(Z)-1)*(nz))\n", "Z0[::nz+1] = Z\n", "print(Z0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 71. Consider an array of dimension (5,5,3), how to mulitply it by an array with dimensions (5,5)? (★★★)" ] }, { "cell_type": "code", "execution_count": 71, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[[2. 2. 2.]\n", " [2. 2. 2.]\n", " [2. 2. 2.]\n", " [2. 2. 2.]\n", " [2. 2. 2.]]\n", "\n", " [[2. 2. 2.]\n", " [2. 2. 2.]\n", " [2. 2. 2.]\n", " [2. 2. 2.]\n", " [2. 2. 2.]]\n", "\n", " [[2. 2. 2.]\n", " [2. 2. 2.]\n", " [2. 2. 2.]\n", " [2. 2. 2.]\n", " [2. 2. 2.]]\n", "\n", " [[2. 2. 2.]\n", " [2. 2. 2.]\n", " [2. 2. 2.]\n", " [2. 2. 2.]\n", " [2. 2. 2.]]\n", "\n", " [[2. 2. 2.]\n", " [2. 2. 2.]\n", " [2. 2. 2.]\n", " [2. 2. 2.]\n", " [2. 2. 2.]]]\n" ] } ], "source": [ "A = np.ones((5,5,3))\n", "B = 2*np.ones((5,5))\n", "print(A * B[:,:,None])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 72. How to swap two rows of an array? (★★★)" ] }, { "cell_type": "code", "execution_count": 72, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[ 5 6 7 8 9]\n", " [ 0 1 2 3 4]\n", " [10 11 12 13 14]\n", " [15 16 17 18 19]\n", " [20 21 22 23 24]]\n" ] } ], "source": [ "# Author: Eelco Hoogendoorn\n", "\n", "A = np.arange(25).reshape(5,5)\n", "A[[0,1]] = A[[1,0]]\n", "print(A)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 73. Consider a set of 10 triplets describing 10 triangles (with shared vertices), find the set of unique line segments composing all the triangles (★★★)" ] }, { "cell_type": "code", "execution_count": 73, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[( 0, 9) ( 0, 11) ( 0, 59) ( 0, 91) ( 1, 8) ( 1, 47) ( 1, 69) ( 1, 82)\n", " ( 3, 40) ( 3, 97) ( 5, 9) ( 5, 73) ( 8, 47) ( 9, 11) ( 9, 73) (13, 53)\n", " (13, 56) (13, 58) (13, 99) (16, 62) (16, 82) (28, 84) (28, 87) (40, 97)\n", " (53, 99) (56, 58) (59, 91) (62, 82) (69, 82) (84, 87)]\n" ] } ], "source": [ "# Author: Nicolas P. Rougier\n", "\n", "faces = np.random.randint(0,100,(10,3))\n", "F = np.roll(faces.repeat(2,axis=1),-1,axis=1)\n", "F = F.reshape(len(F)*3,2)\n", "F = np.sort(F,axis=1)\n", "G = F.view( dtype=[('p0',F.dtype),('p1',F.dtype)] )\n", "G = np.unique(G)\n", "print(G)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 74. Given an array C that is a bincount, how to produce an array A such that np.bincount(A) == C? (★★★)" ] }, { "cell_type": "code", "execution_count": 74, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1 1 2 3 4 4 6]\n" ] } ], "source": [ "# Author: Jaime Fernández del Río\n", "\n", "C = np.bincount([1,1,2,3,4,4,6])\n", "A = np.repeat(np.arange(len(C)), C)\n", "print(A)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 75. How to compute averages using a sliding window over an array? (★★★)" ] }, { "cell_type": "code", "execution_count": 75, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.]\n" ] } ], "source": [ "# Author: Jaime Fernández del Río\n", "\n", "def moving_average(a, n=3) :\n", " ret = np.cumsum(a, dtype=float)\n", " ret[n:] = ret[n:] - ret[:-n]\n", " return ret[n - 1:] / n\n", "Z = np.arange(20)\n", "print(moving_average(Z, n=3))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 76. Consider a one-dimensional array Z, build a two-dimensional array whose first row is (Z\\[0\\],Z\\[1\\],Z\\[2\\]) and each subsequent row is shifted by 1 (last row should be (Z\\[-3\\],Z\\[-2\\],Z\\[-1\\]) (★★★)" ] }, { "cell_type": "code", "execution_count": 76, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[0 1 2]\n", " [1 2 3]\n", " [2 3 4]\n", " [3 4 5]\n", " [4 5 6]\n", " [5 6 7]\n", " [6 7 8]\n", " [7 8 9]]\n" ] } ], "source": [ "# Author: Joe Kington / Erik Rigtorp\n", "from numpy.lib import stride_tricks\n", "\n", "def rolling(a, window):\n", " shape = (a.size - window + 1, window)\n", " strides = (a.itemsize, a.itemsize)\n", " return stride_tricks.as_strided(a, shape=shape, strides=strides)\n", "Z = rolling(np.arange(10), 3)\n", "print(Z)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 77. How to negate a boolean, or to change the sign of a float inplace? (★★★)" ] }, { "cell_type": "code", "execution_count": 77, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 0.61458663, -0.83229834, 0.15687329, 0.86684934, -0.80418945,\n", " -0.94400753, 0.68204938, -0.40034997, 0.56881214, 0.60763882,\n", " -0.41558119, -0.96786492, -0.29382729, -0.43597838, 0.46867397,\n", " -0.73113098, -0.31367014, 0.50218112, -0.18159377, -0.03321331,\n", " 0.93574029, 0.95764592, 0.83438669, 0.93493816, 0.27413529,\n", " 0.79686667, 0.21453622, -0.34477178, -0.90442065, -0.28982899,\n", " -0.22376251, 0.7821683 , 0.80871286, 0.09547893, 0.65898887,\n", " -0.50329235, 0.70567483, 0.7260582 , 0.29526807, -0.61692596,\n", " -0.06398481, 0.38447694, -0.20192775, -0.776956 , -0.86298302,\n", " 0.62069504, 0.7156818 , -0.16731062, -0.67338785, 0.9475525 ,\n", " 0.78363151, -0.68028943, 0.37714017, 0.99798309, 0.09080988,\n", " 0.22431419, 0.44528906, 0.27134833, -0.17727835, -0.64134425,\n", " -0.26404034, -0.10714442, 0.04077127, 0.76593247, -0.26830685,\n", " 0.81933781, -0.14372722, -0.78525057, -0.03657832, -0.0838801 ,\n", " -0.9998223 , -0.57809221, 0.62441487, -0.91798214, -0.20347455,\n", " 0.89401068, -0.36615874, 0.35508649, -0.988561 , -0.42155252,\n", " -0.79222461, -0.38832939, 0.65991297, 0.09981309, -0.26838381,\n", " -0.61731762, 0.470328 , 0.36521011, -0.04780786, 0.52860473,\n", " 0.44800137, 0.18834723, -0.90079054, -0.03385857, 0.72054287,\n", " 0.98253035, -0.93777418, 0.86997239, 0.98122332, -0.4601323 ])" ] }, "execution_count": 77, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Author: Nathaniel J. Smith\n", "\n", "Z = np.random.randint(0,2,100)\n", "np.logical_not(Z, out=Z)\n", "\n", "Z = np.random.uniform(-1.0,1.0,100)\n", "np.negative(Z, out=Z)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 78. Consider 2 sets of points P0,P1 describing lines (2d) and a point p, how to compute distance from p to each line i (P0\\[i\\],P1\\[i\\])? (★★★)" ] }, { "cell_type": "code", "execution_count": 78, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[3.70672797 7.69612039 2.25784974 4.60168732 1.86333395 0.34324433\n", " 0.81905363 1.00428102 4.4882624 5.52240104]\n" ] } ], "source": [ "def distance(P0, P1, p):\n", " T = P1 - P0\n", " L = (T**2).sum(axis=1)\n", " U = -((P0[:,0]-p[...,0])*T[:,0] + (P0[:,1]-p[...,1])*T[:,1]) / L\n", " U = U.reshape(len(U),1)\n", " D = P0 + U*T - p\n", " return np.sqrt((D**2).sum(axis=1))\n", "\n", "P0 = np.random.uniform(-10,10,(10,2))\n", "P1 = np.random.uniform(-10,10,(10,2))\n", "p = np.random.uniform(-10,10,( 1,2))\n", "print(distance(P0, P1, p))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 79. Consider 2 sets of points P0,P1 describing lines (2d) and a set of points P, how to compute distance from each point j (P\\[j\\]) to each line i (P0\\[i\\],P1\\[i\\])? (★★★)" ] }, { "cell_type": "code", "execution_count": 79, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[ 3.51631169 6.42167595 4.90471349 8.92152608 0.64430522 13.1477316\n", " 4.82647115 14.35803776 2.83869333 5.78536237]\n", " [11.72333193 2.28525701 4.48035411 11.29872486 14.10963053 4.49070061\n", " 6.06173032 5.24835195 3.32272461 11.12005469]\n", " [ 7.68423685 3.99209265 12.25140797 4.74391157 4.67770228 5.40024792\n", " 5.31689533 8.63226702 7.63625936 2.4274878 ]\n", " [ 4.72217595 8.25441437 1.85343282 1.41186727 8.5013649 8.04308066\n", " 3.56471625 7.66668404 3.79347479 1.17033352]\n", " [ 4.61970509 1.82880232 0.88155845 3.87855982 7.49446718 1.13451433\n", " 3.69653461 1.60058913 2.96229578 5.89123061]\n", " [ 1.71064014 2.13236159 2.87428566 0.42743983 4.85508373 3.972235\n", " 2.17049563 4.87642258 2.29807957 3.20458539]\n", " [ 1.10951331 3.52006522 2.73748642 1.39980831 4.49782435 6.00139265\n", " 0.34929072 6.82585741 0.76526847 1.17624526]\n", " [ 0.56577927 0.63802769 4.85499764 1.49919907 3.40600949 1.94224115\n", " 4.85430884 3.39018238 5.08047535 5.36034047]\n", " [ 4.08155314 4.50758583 9.84132717 0.35258316 1.4288174 1.73395701\n", " 7.36540087 4.4413348 8.60583634 5.90988377]\n", " [ 7.15223448 10.7222427 4.64476979 0.81731108 11.09257472 8.63596863\n", " 5.38289103 7.54390954 6.10500134 1.95186145]]\n" ] } ], "source": [ "# Author: Italmassov Kuanysh\n", "\n", "# based on distance function from previous question\n", "P0 = np.random.uniform(-10, 10, (10,2))\n", "P1 = np.random.uniform(-10,10,(10,2))\n", "p = np.random.uniform(-10, 10, (10,2))\n", "print(np.array([distance(P0,P1,p_i) for p_i in p]))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 80. Consider an arbitrary array, write a function that extract a subpart with a fixed shape and centered on a given element (pad with a `fill` value when necessary) (★★★)" ] }, { "cell_type": "code", "execution_count": 80, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[4 3 2 8 2 6 7 3 0 8]\n", " [8 9 7 6 1 5 2 4 6 1]\n", " [1 6 2 0 2 4 0 3 4 8]\n", " [8 0 8 0 8 4 6 3 3 1]\n", " [6 0 4 9 5 3 0 5 3 0]\n", " [6 7 5 4 3 7 9 0 9 6]\n", " [7 1 8 4 1 9 0 8 8 0]\n", " [7 8 4 9 4 0 0 6 5 7]\n", " [9 3 5 8 7 2 6 5 5 7]\n", " [7 9 6 7 8 7 7 8 8 7]]\n", "[[0 0 0 0 0]\n", " [0 4 3 2 8]\n", " [0 8 9 7 6]\n", " [0 1 6 2 0]\n", " [0 8 0 8 0]]\n" ] } ], "source": [ "# Author: Nicolas Rougier\n", "\n", "Z = np.random.randint(0,10,(10,10))\n", "shape = (5,5)\n", "fill = 0\n", "position = (1,1)\n", "\n", "R = np.ones(shape, dtype=Z.dtype)*fill\n", "P = np.array(list(position)).astype(int)\n", "Rs = np.array(list(R.shape)).astype(int)\n", "Zs = np.array(list(Z.shape)).astype(int)\n", "\n", "R_start = np.zeros((len(shape),)).astype(int)\n", "R_stop = np.array(list(shape)).astype(int)\n", "Z_start = (P-Rs//2)\n", "Z_stop = (P+Rs//2)+Rs%2\n", "\n", "R_start = (R_start - np.minimum(Z_start,0)).tolist()\n", "Z_start = (np.maximum(Z_start,0)).tolist()\n", "R_stop = np.maximum(R_start, (R_stop - np.maximum(Z_stop-Zs,0))).tolist()\n", "Z_stop = (np.minimum(Z_stop,Zs)).tolist()\n", "\n", "r = [slice(start,stop) for start,stop in zip(R_start,R_stop)]\n", "z = [slice(start,stop) for start,stop in zip(Z_start,Z_stop)]\n", "R[r] = Z[z]\n", "print(Z)\n", "print(R)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 81. Consider an array Z = \\[1,2,3,4,5,6,7,8,9,10,11,12,13,14\\], how to generate an array R = \\[\\[1,2,3,4\\], \\[2,3,4,5\\], \\[3,4,5,6\\], ..., \\[11,12,13,14\\]\\]? (★★★)" ] }, { "cell_type": "code", "execution_count": 81, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[ 1 2 3 4]\n", " [ 2 3 4 5]\n", " [ 3 4 5 6]\n", " [ 4 5 6 7]\n", " [ 5 6 7 8]\n", " [ 6 7 8 9]\n", " [ 7 8 9 10]\n", " [ 8 9 10 11]\n", " [ 9 10 11 12]\n", " [10 11 12 13]\n", " [11 12 13 14]]\n" ] } ], "source": [ "# Author: Stefan van der Walt\n", "\n", "Z = np.arange(1,15,dtype=np.uint32)\n", "R = stride_tricks.as_strided(Z,(11,4),(4,4))\n", "print(R)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 82. Compute a matrix rank (★★★)" ] }, { "cell_type": "code", "execution_count": 82, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "10\n" ] } ], "source": [ "# Author: Stefan van der Walt\n", "\n", "Z = np.random.uniform(0,1,(10,10))\n", "U, S, V = np.linalg.svd(Z) # Singular Value Decomposition\n", "rank = np.sum(S > 1e-10)\n", "print(rank)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 83. How to find the most frequent value in an array?" ] }, { "cell_type": "code", "execution_count": 83, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0\n" ] } ], "source": [ "Z = np.random.randint(0,10,50)\n", "print(np.bincount(Z).argmax())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 84. Extract all the contiguous 3x3 blocks from a random 10x10 matrix (★★★)" ] }, { "cell_type": "code", "execution_count": 84, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[[[0 0 2]\n", " [4 3 4]\n", " [4 2 4]]\n", "\n", " [[0 2 0]\n", " [3 4 0]\n", " [2 4 3]]\n", "\n", " [[2 0 1]\n", " [4 0 0]\n", " [4 3 3]]\n", "\n", " [[0 1 1]\n", " [0 0 0]\n", " [3 3 2]]\n", "\n", " [[1 1 0]\n", " [0 0 1]\n", " [3 2 4]]\n", "\n", " [[1 0 4]\n", " [0 1 3]\n", " [2 4 1]]\n", "\n", " [[0 4 2]\n", " [1 3 4]\n", " [4 1 1]]\n", "\n", " [[4 2 2]\n", " [3 4 4]\n", " [1 1 3]]]\n", "\n", "\n", " [[[4 3 4]\n", " [4 2 4]\n", " [3 0 3]]\n", "\n", " [[3 4 0]\n", " [2 4 3]\n", " [0 3 0]]\n", "\n", " [[4 0 0]\n", " [4 3 3]\n", " [3 0 3]]\n", "\n", " [[0 0 0]\n", " [3 3 2]\n", " [0 3 4]]\n", "\n", " [[0 0 1]\n", " [3 2 4]\n", " [3 4 2]]\n", "\n", " [[0 1 3]\n", " [2 4 1]\n", " [4 2 2]]\n", "\n", " [[1 3 4]\n", " [4 1 1]\n", " [2 2 0]]\n", "\n", " [[3 4 4]\n", " [1 1 3]\n", " [2 0 2]]]\n", "\n", "\n", " [[[4 2 4]\n", " [3 0 3]\n", " [2 4 3]]\n", "\n", " [[2 4 3]\n", " [0 3 0]\n", " [4 3 0]]\n", "\n", " [[4 3 3]\n", " [3 0 3]\n", " [3 0 3]]\n", "\n", " [[3 3 2]\n", " [0 3 4]\n", " [0 3 3]]\n", "\n", " [[3 2 4]\n", " [3 4 2]\n", " [3 3 1]]\n", "\n", " [[2 4 1]\n", " [4 2 2]\n", " [3 1 2]]\n", "\n", " [[4 1 1]\n", " [2 2 0]\n", " [1 2 1]]\n", "\n", " [[1 1 3]\n", " [2 0 2]\n", " [2 1 3]]]\n", "\n", "\n", " [[[3 0 3]\n", " [2 4 3]\n", " [3 0 4]]\n", "\n", " [[0 3 0]\n", " [4 3 0]\n", " [0 4 1]]\n", "\n", " [[3 0 3]\n", " [3 0 3]\n", " [4 1 1]]\n", "\n", " [[0 3 4]\n", " [0 3 3]\n", " [1 1 4]]\n", "\n", " [[3 4 2]\n", " [3 3 1]\n", " [1 4 1]]\n", "\n", " [[4 2 2]\n", " [3 1 2]\n", " [4 1 3]]\n", "\n", " [[2 2 0]\n", " [1 2 1]\n", " [1 3 0]]\n", "\n", " [[2 0 2]\n", " [2 1 3]\n", " [3 0 1]]]\n", "\n", "\n", " [[[2 4 3]\n", " [3 0 4]\n", " [0 2 2]]\n", "\n", " [[4 3 0]\n", " [0 4 1]\n", " [2 2 0]]\n", "\n", " [[3 0 3]\n", " [4 1 1]\n", " [2 0 4]]\n", "\n", " [[0 3 3]\n", " [1 1 4]\n", " [0 4 3]]\n", "\n", " [[3 3 1]\n", " [1 4 1]\n", " [4 3 4]]\n", "\n", " [[3 1 2]\n", " [4 1 3]\n", " [3 4 0]]\n", "\n", " [[1 2 1]\n", " [1 3 0]\n", " [4 0 2]]\n", "\n", " [[2 1 3]\n", " [3 0 1]\n", " [0 2 1]]]\n", "\n", "\n", " [[[3 0 4]\n", " [0 2 2]\n", " [1 3 4]]\n", "\n", " [[0 4 1]\n", " [2 2 0]\n", " [3 4 1]]\n", "\n", " [[4 1 1]\n", " [2 0 4]\n", " [4 1 0]]\n", "\n", " [[1 1 4]\n", " [0 4 3]\n", " [1 0 1]]\n", "\n", " [[1 4 1]\n", " [4 3 4]\n", " [0 1 0]]\n", "\n", " [[4 1 3]\n", " [3 4 0]\n", " [1 0 1]]\n", "\n", " [[1 3 0]\n", " [4 0 2]\n", " [0 1 4]]\n", "\n", " [[3 0 1]\n", " [0 2 1]\n", " [1 4 1]]]\n", "\n", "\n", " [[[0 2 2]\n", " [1 3 4]\n", " [2 0 1]]\n", "\n", " [[2 2 0]\n", " [3 4 1]\n", " [0 1 2]]\n", "\n", " [[2 0 4]\n", " [4 1 0]\n", " [1 2 2]]\n", "\n", " [[0 4 3]\n", " [1 0 1]\n", " [2 2 0]]\n", "\n", " [[4 3 4]\n", " [0 1 0]\n", " [2 0 0]]\n", "\n", " [[3 4 0]\n", " [1 0 1]\n", " [0 0 4]]\n", "\n", " [[4 0 2]\n", " [0 1 4]\n", " [0 4 0]]\n", "\n", " [[0 2 1]\n", " [1 4 1]\n", " [4 0 1]]]\n", "\n", "\n", " [[[1 3 4]\n", " [2 0 1]\n", " [2 4 2]]\n", "\n", " [[3 4 1]\n", " [0 1 2]\n", " [4 2 3]]\n", "\n", " [[4 1 0]\n", " [1 2 2]\n", " [2 3 1]]\n", "\n", " [[1 0 1]\n", " [2 2 0]\n", " [3 1 4]]\n", "\n", " [[0 1 0]\n", " [2 0 0]\n", " [1 4 2]]\n", "\n", " [[1 0 1]\n", " [0 0 4]\n", " [4 2 0]]\n", "\n", " [[0 1 4]\n", " [0 4 0]\n", " [2 0 3]]\n", "\n", " [[1 4 1]\n", " [4 0 1]\n", " [0 3 3]]]]\n" ] } ], "source": [ "# Author: Chris Barker\n", "\n", "Z = np.random.randint(0,5,(10,10))\n", "n = 3\n", "i = 1 + (Z.shape[0]-3)\n", "j = 1 + (Z.shape[1]-3)\n", "C = stride_tricks.as_strided(Z, shape=(i, j, n, n), strides=Z.strides + Z.strides)\n", "print(C)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 85. Create a 2D array subclass such that Z\\[i,j\\] == Z\\[j,i\\] (★★★)" ] }, { "cell_type": "code", "execution_count": 85, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[ 1 16 6 5 6]\n", " [16 5 13 16 12]\n", " [ 6 13 4 42 2]\n", " [ 5 16 42 2 13]\n", " [ 6 12 2 13 3]]\n" ] } ], "source": [ "# Author: Eric O. Lebigot\n", "# Note: only works for 2d array and value setting using indices\n", "\n", "class Symetric(np.ndarray):\n", " def __setitem__(self, index, value):\n", " i,j = index\n", " super(Symetric, self).__setitem__((i,j), value)\n", " super(Symetric, self).__setitem__((j,i), value)\n", "\n", "def symetric(Z):\n", " return np.asarray(Z + Z.T - np.diag(Z.diagonal())).view(Symetric)\n", "\n", "S = symetric(np.random.randint(0,10,(5,5)))\n", "S[2,3] = 42\n", "print(S)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 86. Consider a set of p matrices wich shape (n,n) and a set of p vectors with shape (n,1). How to compute the sum of of the p matrix products at once? (result has shape (n,1)) (★★★)" ] }, { "cell_type": "code", "execution_count": 86, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[200.]\n", " [200.]\n", " [200.]\n", " [200.]\n", " [200.]\n", " [200.]\n", " [200.]\n", " [200.]\n", " [200.]\n", " [200.]\n", " [200.]\n", " [200.]\n", " [200.]\n", " [200.]\n", " [200.]\n", " [200.]\n", " [200.]\n", " [200.]\n", " [200.]\n", " [200.]]\n" ] } ], "source": [ "# Author: Stefan van der Walt\n", "\n", "p, n = 10, 20\n", "M = np.ones((p,n,n))\n", "V = np.ones((p,n,1))\n", "S = np.tensordot(M, V, axes=[[0, 2], [0, 1]])\n", "print(S)\n", "\n", "# It works, because:\n", "# M is (p,n,n)\n", "# V is (p,n,1)\n", "# Thus, summing over the paired axes 0 and 0 (of M and V independently),\n", "# and 2 and 1, to remain with a (n,1) vector." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 87. Consider a 16x16 array, how to get the block-sum (block size is 4x4)? (★★★)" ] }, { "cell_type": "code", "execution_count": 87, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[16. 16. 16. 16.]\n", " [16. 16. 16. 16.]\n", " [16. 16. 16. 16.]\n", " [16. 16. 16. 16.]]\n" ] } ], "source": [ "# Author: Robert Kern\n", "\n", "Z = np.ones((16,16))\n", "k = 4\n", "S = np.add.reduceat(np.add.reduceat(Z, np.arange(0, Z.shape[0], k), axis=0),\n", " np.arange(0, Z.shape[1], k), axis=1)\n", "print(S)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 88. How to implement the Game of Life using numpy arrays? (★★★)" ] }, { "cell_type": "code", "execution_count": 88, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n", " [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n", " [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n", " [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n", " [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n", " [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n", " [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n", " [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n", " [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n", " [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n", " [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n", " [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n", " [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 1 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n", " [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 1 0\n", " 0 0 0 0 0 1 1 0 0 0 0 0 0 0]\n", " [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0\n", " 0 0 0 0 0 1 1 0 0 0 0 0 0 0]\n", " [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0\n", " 0 0 0 0 0 0 0 0 0 1 1 0 0 0]\n", " [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 1 1 0 0 0 0 0 0 1 1 1 0 0 0]\n", " [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1\n", " 0 0 1 0 0 0 0 0 1 1 0 0 0 0]\n", " [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0\n", " 1 1 0 0 0 0 0 0 1 0 1 0 0 0]\n", " [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 1 0 0 0 0 0 0 0]\n", " [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 1 0 0 0 1 0 0]\n", " [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 1 0 0 0 1 1 1 0 0]\n", " [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 1 0 0 1 0 0]\n", " [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 1 0 0 0]\n", " [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 1 0 0 0 0 0]\n", " [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n", " [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 1 0 1 0 0 1 1 0 0 1 1 0 0]\n", " [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 1 0 0 1 0 0 0 1 1 0 0 0 0]\n", " [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 1 0 0 0 1 0 0 0 0 0 0 0 0]\n", " [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 1 0 0 1 0 0 0 0 0 0 0 0]\n", " [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 1 0 1 1 0 0 0 0 0 0 0 0]\n", " [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 1 0 0 0 0 0 0 0 0 0 0]\n", " [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n", " [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 1 1 1 0 0 0 0 0 0 0 0]\n", " [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 1 0 1 0 0 0 0 0 0 0 0]\n", " [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0\n", " 0 0 1 0 0 1 0 0 0 0 0 0 0 0]\n", " [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n", " [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n", " [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n", " [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n", " [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n", " [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n", " [0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n", " [0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n", " [0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 1 1 0 0 0 0 0 0 0 0 0 0]\n", " [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 1 0 1 0 0 0 0 0 0 0 0 0 0]\n", " [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 1 1 0 0 0 0 0 0 0 0 0 0 0]\n", " [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n", " [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n", " [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]]\n" ] } ], "source": [ "# Author: Nicolas Rougier\n", "\n", "def iterate(Z):\n", " # Count neighbours\n", " N = (Z[0:-2,0:-2] + Z[0:-2,1:-1] + Z[0:-2,2:] +\n", " Z[1:-1,0:-2] + Z[1:-1,2:] +\n", " Z[2: ,0:-2] + Z[2: ,1:-1] + Z[2: ,2:])\n", "\n", " # Apply rules\n", " birth = (N==3) & (Z[1:-1,1:-1]==0)\n", " survive = ((N==2) | (N==3)) & (Z[1:-1,1:-1]==1)\n", " Z[...] = 0\n", " Z[1:-1,1:-1][birth | survive] = 1\n", " return Z\n", "\n", "Z = np.random.randint(0,2,(50,50))\n", "for i in range(100): Z = iterate(Z)\n", "print(Z)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 89. How to get the n largest values of an array (★★★)" ] }, { "cell_type": "code", "execution_count": 89, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[9995 9996 9997 9998 9999]\n", "[9998 9999 9997 9996 9995]\n" ] } ], "source": [ "Z = np.arange(10000)\n", "np.random.shuffle(Z)\n", "n = 5\n", "\n", "# Slow\n", "print (Z[np.argsort(Z)[-n:]])\n", "\n", "# Fast\n", "print (Z[np.argpartition(-Z,n)[:n]])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 90. Given an arbitrary number of vectors, build the cartesian product (every combinations of every item) (★★★)" ] }, { "cell_type": "code", "execution_count": 90, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[1 4 6]\n", " [1 4 7]\n", " [1 5 6]\n", " [1 5 7]\n", " [2 4 6]\n", " [2 4 7]\n", " [2 5 6]\n", " [2 5 7]\n", " [3 4 6]\n", " [3 4 7]\n", " [3 5 6]\n", " [3 5 7]]\n" ] } ], "source": [ "# Author: Stefan Van der Walt\n", "\n", "def cartesian(arrays):\n", " arrays = [np.asarray(a) for a in arrays]\n", " shape = (len(x) for x in arrays)\n", "\n", " ix = np.indices(shape, dtype=int)\n", " ix = ix.reshape(len(arrays), -1).T\n", "\n", " for n, arr in enumerate(arrays):\n", " ix[:, n] = arrays[n][ix[:, n]]\n", "\n", " return ix\n", "\n", "print (cartesian(([1, 2, 3], [4, 5], [6, 7])))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 91. How to create a record array from a regular array? (★★★)" ] }, { "cell_type": "code", "execution_count": 91, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[(b'Hello', 2.5, 3) (b'World', 3.6, 2)]\n" ] } ], "source": [ "Z = np.array([(\"Hello\", 2.5, 3),\n", " (\"World\", 3.6, 2)])\n", "R = np.core.records.fromarrays(Z.T, \n", " names='col1, col2, col3',\n", " formats = 'S8, f8, i8')\n", "print(R)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 92. Consider a large vector Z, compute Z to the power of 3 using 3 different methods (★★★)" ] }, { "cell_type": "code", "execution_count": 92, "metadata": {}, "outputs": [ { "ename": "TypeError", "evalue": "'float' object cannot be interpreted as an integer", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mTypeError\u001b[0m Traceback (most recent call last)", "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;31m# Author: Ryan G.\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 3\u001b[1;33m \u001b[0mx\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrandom\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrand\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m5e7\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 4\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5\u001b[0m \u001b[0mget_ipython\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrun_line_magic\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'timeit'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m'np.power(x,3)'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32mmtrand.pyx\u001b[0m in \u001b[0;36mmtrand.RandomState.rand\u001b[1;34m()\u001b[0m\n", "\u001b[1;32mmtrand.pyx\u001b[0m in \u001b[0;36mmtrand.RandomState.random_sample\u001b[1;34m()\u001b[0m\n", "\u001b[1;32mmtrand.pyx\u001b[0m in \u001b[0;36mmtrand.cont0_array\u001b[1;34m()\u001b[0m\n", "\u001b[1;31mTypeError\u001b[0m: 'float' object cannot be interpreted as an integer" ] } ], "source": [ "# Author: Ryan G.\n", "\n", "x = np.random.rand(5e7)\n", "\n", "%timeit np.power(x,3)\n", "%timeit x*x*x\n", "%timeit np.einsum('i,i,i->i',x,x,x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 93. Consider two arrays A and B of shape (8,3) and (2,2). How to find rows of A that contain elements of each row of B regardless of the order of the elements in B? (★★★)" ] }, { "cell_type": "code", "execution_count": 93, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[]\n" ] } ], "source": [ "# Author: Gabe Schwartz\n", "\n", "A = np.random.randint(0,5,(8,3))\n", "B = np.random.randint(0,5,(2,2))\n", "\n", "C = (A[..., np.newaxis, np.newaxis] == B)\n", "rows = np.where(C.any((3,1)).all(1))[0]\n", "print(rows)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 94. Considering a 10x3 matrix, extract rows with unequal values (e.g. \\[2,2,3\\]) (★★★)" ] }, { "cell_type": "code", "execution_count": 94, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[1 1 1]\n", " [3 4 1]\n", " [0 2 4]\n", " [4 1 4]\n", " [3 4 4]\n", " [3 2 1]\n", " [3 0 3]\n", " [2 1 0]\n", " [3 0 3]\n", " [0 1 2]]\n", "[[3 4 1]\n", " [0 2 4]\n", " [4 1 4]\n", " [3 4 4]\n", " [3 2 1]\n", " [3 0 3]\n", " [2 1 0]\n", " [3 0 3]\n", " [0 1 2]]\n", "[[3 4 1]\n", " [0 2 4]\n", " [4 1 4]\n", " [3 4 4]\n", " [3 2 1]\n", " [3 0 3]\n", " [2 1 0]\n", " [3 0 3]\n", " [0 1 2]]\n" ] } ], "source": [ "# Author: Robert Kern\n", "\n", "Z = np.random.randint(0,5,(10,3))\n", "print(Z)\n", "# solution for arrays of all dtypes (including string arrays and record arrays)\n", "E = np.all(Z[:,1:] == Z[:,:-1], axis=1)\n", "U = Z[~E]\n", "print(U)\n", "# soluiton for numerical arrays only, will work for any number of columns in Z\n", "U = Z[Z.max(axis=1) != Z.min(axis=1),:]\n", "print(U)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 95. Convert a vector of ints into a matrix binary representation (★★★)" ] }, { "cell_type": "code", "execution_count": 95, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[0 0 0 0 0 0 0 0]\n", " [0 0 0 0 0 0 0 1]\n", " [0 0 0 0 0 0 1 0]\n", " [0 0 0 0 0 0 1 1]\n", " [0 0 0 0 1 1 1 1]\n", " [0 0 0 1 0 0 0 0]\n", " [0 0 1 0 0 0 0 0]\n", " [0 1 0 0 0 0 0 0]\n", " [1 0 0 0 0 0 0 0]]\n", "[[0 0 0 0 0 0 0 0]\n", " [0 0 0 0 0 0 0 1]\n", " [0 0 0 0 0 0 1 0]\n", " [0 0 0 0 0 0 1 1]\n", " [0 0 0 0 1 1 1 1]\n", " [0 0 0 1 0 0 0 0]\n", " [0 0 1 0 0 0 0 0]\n", " [0 1 0 0 0 0 0 0]\n", " [1 0 0 0 0 0 0 0]]\n" ] } ], "source": [ "# Author: Warren Weckesser\n", "\n", "I = np.array([0, 1, 2, 3, 15, 16, 32, 64, 128])\n", "B = ((I.reshape(-1,1) & (2**np.arange(8))) != 0).astype(int)\n", "print(B[:,::-1])\n", "\n", "# Author: Daniel T. McDonald\n", "\n", "I = np.array([0, 1, 2, 3, 15, 16, 32, 64, 128], dtype=np.uint8)\n", "print(np.unpackbits(I[:, np.newaxis], axis=1))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 96. Given a two dimensional array, how to extract unique rows? (★★★)" ] }, { "cell_type": "code", "execution_count": 96, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[0 0 1]\n", " [0 1 0]\n", " [1 1 0]]\n", "[[0 0 1]\n", " [0 1 0]\n", " [1 1 0]]\n" ] } ], "source": [ "# Author: Jaime Fernández del Río\n", "\n", "Z = np.random.randint(0,2,(6,3))\n", "T = np.ascontiguousarray(Z).view(np.dtype((np.void, Z.dtype.itemsize * Z.shape[1])))\n", "_, idx = np.unique(T, return_index=True)\n", "uZ = Z[idx]\n", "print(uZ)\n", "\n", "# Author: Andreas Kouzelis\n", "# NumPy >= 1.13\n", "uZ = np.unique(Z, axis=0)\n", "print(uZ)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 97. Considering 2 vectors A & B, write the einsum equivalent of inner, outer, sum, and mul function (★★★)" ] }, { "cell_type": "code", "execution_count": 97, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[0.06728041, 0.05397444, 0.0764441 , 0.22359054, 0.0836961 ,\n", " 0.23600838, 0.01241854, 0.22915715, 0.07803804, 0.18796029],\n", " [0.17717534, 0.14213557, 0.20130688, 0.58880039, 0.22040419,\n", " 0.62150136, 0.03270283, 0.60345942, 0.20550435, 0.49497216],\n", " [0.27189413, 0.21812194, 0.30892651, 0.90357594, 0.33823335,\n", " 0.95375901, 0.05018592, 0.92607176, 0.31536797, 0.75958668],\n", " [0.06789412, 0.05446677, 0.07714139, 0.22563006, 0.08445954,\n", " 0.23816117, 0.01253182, 0.23124745, 0.07874988, 0.1896748 ],\n", " [0.11831111, 0.09491285, 0.13442526, 0.39317904, 0.14717774,\n", " 0.41501553, 0.02183773, 0.40296779, 0.13722817, 0.33052403],\n", " [0.23778707, 0.19076019, 0.27017402, 0.79022918, 0.29580454,\n", " 0.83411717, 0.04389047, 0.80990307, 0.27580745, 0.66430229],\n", " [0.03397511, 0.02725589, 0.03860257, 0.11290827, 0.04226467,\n", " 0.119179 , 0.00627109, 0.11571928, 0.03940748, 0.09491578],\n", " [0.08646755, 0.06936696, 0.09824455, 0.28735447, 0.10756469,\n", " 0.30331365, 0.01596008, 0.29450857, 0.10029306, 0.24156312],\n", " [0.22622413, 0.18148404, 0.25703619, 0.75180248, 0.28142037,\n", " 0.79355631, 0.0417562 , 0.77051968, 0.26239568, 0.63199907],\n", " [0.00686845, 0.00551008, 0.00780394, 0.02282566, 0.00854427,\n", " 0.02409336, 0.00126777, 0.02339393, 0.00796666, 0.01918828]])" ] }, "execution_count": 97, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Author: Alex Riley\n", "# Make sure to read: http://ajcr.net/Basic-guide-to-einsum/\n", "\n", "A = np.random.uniform(0,1,10)\n", "B = np.random.uniform(0,1,10)\n", "\n", "np.einsum('i->', A) # np.sum(A)\n", "np.einsum('i,i->i', A, B) # A * B\n", "np.einsum('i,i', A, B) # np.inner(A, B)\n", "np.einsum('i,j->ij', A, B) # np.outer(A, B)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 98. Considering a path described by two vectors (X,Y), how to sample it using equidistant samples (★★★)?" ] }, { "cell_type": "code", "execution_count": 98, "metadata": {}, "outputs": [], "source": [ "# Author: Bas Swinckels\n", "\n", "phi = np.arange(0, 10*np.pi, 0.1)\n", "a = 1\n", "x = a*phi*np.cos(phi)\n", "y = a*phi*np.sin(phi)\n", "\n", "dr = (np.diff(x)**2 + np.diff(y)**2)**.5 # segment lengths\n", "r = np.zeros_like(x)\n", "r[1:] = np.cumsum(dr) # integrate path\n", "r_int = np.linspace(0, r.max(), 200) # regular spaced path\n", "x_int = np.interp(r_int, r, x) # integrate path\n", "y_int = np.interp(r_int, r, y)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 99. Given an integer n and a 2D array X, select from X the rows which can be interpreted as draws from a multinomial distribution with n degrees, i.e., the rows which only contain integers and which sum to n. (★★★)" ] }, { "cell_type": "code", "execution_count": 99, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[2. 0. 1. 1.]]\n" ] } ], "source": [ "# Author: Evgeni Burovski\n", "\n", "X = np.asarray([[1.0, 0.0, 3.0, 8.0],\n", " [2.0, 0.0, 1.0, 1.0],\n", " [1.5, 2.5, 1.0, 0.0]])\n", "n = 4\n", "M = np.logical_and.reduce(np.mod(X, 1) == 0, axis=-1)\n", "M &= (X.sum(axis=-1) == n)\n", "print(X[M])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 100. Compute bootstrapped 95% confidence intervals for the mean of a 1D array X (i.e., resample the elements of an array with replacement N times, compute the mean of each sample, and then compute percentiles over the means). (★★★)" ] }, { "cell_type": "code", "execution_count": 100, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[-0.30976616 0.02882422]\n" ] } ], "source": [ "# Author: Jessica B. Hamrick\n", "\n", "X = np.random.randn(100) # random 1D array\n", "N = 1000 # number of bootstrap samples\n", "idx = np.random.randint(0, X.size, (N, X.size))\n", "means = X[idx].mean(axis=1)\n", "confint = np.percentile(means, [2.5, 97.5])\n", "print(confint)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.4" }, "pycharm": { "stem_cell": { "cell_type": "raw", "source": [], "metadata": { "collapsed": false } } } }, "nbformat": 4, "nbformat_minor": 1 } ================================================ FILE: 2.numpy/numpy-100/100_Numpy_exercises_no_solution.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 100 numpy exercises\n", "\n", "This is a collection of exercises that have been collected in the numpy mailing list, on stack overflow and in the numpy documentation. The goal of this collection is to offer a quick reference for both old and new users but also to provide a set of exercises for those who teach.\n", "\n", "\n", "If you find an error or think you've a better way to solve some of them, feel free to open an issue at " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 1. Import the numpy package under the name `np` (★☆☆)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 2. Print the numpy version and the configuration (★☆☆)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 3. Create a null vector of size 10 (★☆☆)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 4. How to find the memory size of any array (★☆☆)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 5. How to get the documentation of the numpy add function from the command line? (★☆☆)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 6. Create a null vector of size 10 but the fifth value which is 1 (★☆☆)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 7. Create a vector with values ranging from 10 to 49 (★☆☆)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 8. Reverse a vector (first element becomes last) (★☆☆)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 9. Create a 3x3 matrix with values ranging from 0 to 8 (★☆☆)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 10. Find indices of non-zero elements from \\[1,2,0,0,4,0\\] (★☆☆)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 11. Create a 3x3 identity matrix (★☆☆)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 12. Create a 3x3x3 array with random values (★☆☆)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 13. Create a 10x10 array with random values and find the minimum and maximum values (★☆☆)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 14. Create a random vector of size 30 and find the mean value (★☆☆)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 15. Create a 2d array with 1 on the border and 0 inside (★☆☆)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 16. How to add a border (filled with 0's) around an existing array? (★☆☆)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 17. What is the result of the following expression? (★☆☆)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```python\n", "0 * np.nan\n", "np.nan == np.nan\n", "np.inf > np.nan\n", "np.nan - np.nan\n", "np.nan in set([np.nan])\n", "0.3 == 3 * 0.1\n", "```" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 18. Create a 5x5 matrix with values 1,2,3,4 just below the diagonal (★☆☆)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 19. Create a 8x8 matrix and fill it with a checkerboard pattern (★☆☆)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 20. Consider a (6,7,8) shape array, what is the index (x,y,z) of the 100th element?" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 21. Create a checkerboard 8x8 matrix using the tile function (★☆☆)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 22. Normalize a 5x5 random matrix (★☆☆)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 23. Create a custom dtype that describes a color as four unsigned bytes (RGBA) (★☆☆)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 24. Multiply a 5x3 matrix by a 3x2 matrix (real matrix product) (★☆☆)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 25. Given a 1D array, negate all elements which are between 3 and 8, in place. (★☆☆)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 26. What is the output of the following script? (★☆☆)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```python\n", "# Author: Jake VanderPlas\n", "\n", "print(sum(range(5),-1))\n", "from numpy import *\n", "print(sum(range(5),-1))\n", "```" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 27. Consider an integer vector Z, which of these expressions are legal? (★☆☆)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```python\n", "Z**Z\n", "2 << Z >> 2\n", "Z <- Z\n", "1j*Z\n", "Z/1/1\n", "ZZ\n", "```" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 28. What are the result of the following expressions?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```python\n", "np.array(0) / np.array(0)\n", "np.array(0) // np.array(0)\n", "np.array([np.nan]).astype(int).astype(float)\n", "```" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 29. How to round away from zero a float array ? (★☆☆)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 30. How to find common values between two arrays? (★☆☆)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 31. How to ignore all numpy warnings (not recommended)? (★☆☆)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 32. Is the following expressions true? (★☆☆)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```python\n", "np.sqrt(-1) == np.emath.sqrt(-1)\n", "```" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 33. How to get the dates of yesterday, today and tomorrow? (★☆☆)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 34. How to get all the dates corresponding to the month of July 2016? (★★☆)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 35. How to compute ((A+B)\\*(-A/2)) in place (without copy)? (★★☆)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 36. Extract the integer part of a random array using 5 different methods (★★☆)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 37. Create a 5x5 matrix with row values ranging from 0 to 4 (★★☆)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 38. Consider a generator function that generates 10 integers and use it to build an array (★☆☆)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 39. Create a vector of size 10 with values ranging from 0 to 1, both excluded (★★☆)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 40. Create a random vector of size 10 and sort it (★★☆)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 41. How to sum a small array faster than np.sum? (★★☆)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 42. Consider two random array A and B, check if they are equal (★★☆)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 43. Make an array immutable (read-only) (★★☆)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 44. Consider a random 10x2 matrix representing cartesian coordinates, convert them to polar coordinates (★★☆)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 45. Create random vector of size 10 and replace the maximum value by 0 (★★☆)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 46. Create a structured array with `x` and `y` coordinates covering the \\[0,1\\]x\\[0,1\\] area (★★☆)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 47. Given two arrays, X and Y, construct the Cauchy matrix C (Cij =1/(xi - yj))" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 48. Print the minimum and maximum representable value for each numpy scalar type (★★☆)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 49. How to print all the values of an array? (★★☆)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 50. How to find the closest value (to a given scalar) in a vector? (★★☆)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 51. Create a structured array representing a position (x,y) and a color (r,g,b) (★★☆)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 52. Consider a random vector with shape (100,2) representing coordinates, find point by point distances (★★☆)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 53. How to convert a float (32 bits) array into an integer (32 bits) in place?" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 54. How to read the following file? (★★☆)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```\n", "1, 2, 3, 4, 5\n", "6, , , 7, 8\n", " , , 9,10,11\n", "```" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 55. What is the equivalent of enumerate for numpy arrays? (★★☆)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 56. Generate a generic 2D Gaussian-like array (★★☆)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 57. How to randomly place p elements in a 2D array? (★★☆)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 58. Subtract the mean of each row of a matrix (★★☆)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 59. How to sort an array by the nth column? (★★☆)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 60. How to tell if a given 2D array has null columns? (★★☆)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 61. Find the nearest value from a given value in an array (★★☆)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 62. Considering two arrays with shape (1,3) and (3,1), how to compute their sum using an iterator? (★★☆)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 63. Create an array class that has a name attribute (★★☆)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 64. Consider a given vector, how to add 1 to each element indexed by a second vector (be careful with repeated indices)? (★★★)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 65. How to accumulate elements of a vector (X) to an array (F) based on an index list (I)? (★★★)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 66. Considering a (w,h,3) image of (dtype=ubyte), compute the number of unique colors (★★★)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 67. Considering a four dimensions array, how to get sum over the last two axis at once? (★★★)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 68. Considering a one-dimensional vector D, how to compute means of subsets of D using a vector S of same size describing subset indices? (★★★)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 69. How to get the diagonal of a dot product? (★★★)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 70. Consider the vector \\[1, 2, 3, 4, 5\\], how to build a new vector with 3 consecutive zeros interleaved between each value? (★★★)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 71. Consider an array of dimension (5,5,3), how to mulitply it by an array with dimensions (5,5)? (★★★)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 72. How to swap two rows of an array? (★★★)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 73. Consider a set of 10 triplets describing 10 triangles (with shared vertices), find the set of unique line segments composing all the triangles (★★★)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 74. Given an array C that is a bincount, how to produce an array A such that np.bincount(A) == C? (★★★)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 75. How to compute averages using a sliding window over an array? (★★★)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 76. Consider a one-dimensional array Z, build a two-dimensional array whose first row is (Z\\[0\\],Z\\[1\\],Z\\[2\\]) and each subsequent row is shifted by 1 (last row should be (Z\\[-3\\],Z\\[-2\\],Z\\[-1\\]) (★★★)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 77. How to negate a boolean, or to change the sign of a float inplace? (★★★)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 78. Consider 2 sets of points P0,P1 describing lines (2d) and a point p, how to compute distance from p to each line i (P0\\[i\\],P1\\[i\\])? (★★★)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 79. Consider 2 sets of points P0,P1 describing lines (2d) and a set of points P, how to compute distance from each point j (P\\[j\\]) to each line i (P0\\[i\\],P1\\[i\\])? (★★★)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 80. Consider an arbitrary array, write a function that extract a subpart with a fixed shape and centered on a given element (pad with a `fill` value when necessary) (★★★)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 81. Consider an array Z = \\[1,2,3,4,5,6,7,8,9,10,11,12,13,14\\], how to generate an array R = \\[\\[1,2,3,4\\], \\[2,3,4,5\\], \\[3,4,5,6\\], ..., \\[11,12,13,14\\]\\]? (★★★)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 82. Compute a matrix rank (★★★)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 83. How to find the most frequent value in an array?" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 84. Extract all the contiguous 3x3 blocks from a random 10x10 matrix (★★★)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 85. Create a 2D array subclass such that Z\\[i,j\\] == Z\\[j,i\\] (★★★)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 86. Consider a set of p matrices wich shape (n,n) and a set of p vectors with shape (n,1). How to compute the sum of of the p matrix products at once? (result has shape (n,1)) (★★★)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 87. Consider a 16x16 array, how to get the block-sum (block size is 4x4)? (★★★)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 88. How to implement the Game of Life using numpy arrays? (★★★)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 89. How to get the n largest values of an array (★★★)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 90. Given an arbitrary number of vectors, build the cartesian product (every combinations of every item) (★★★)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 91. How to create a record array from a regular array? (★★★)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 92. Consider a large vector Z, compute Z to the power of 3 using 3 different methods (★★★)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 93. Consider two arrays A and B of shape (8,3) and (2,2). How to find rows of A that contain elements of each row of B regardless of the order of the elements in B? (★★★)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 94. Considering a 10x3 matrix, extract rows with unequal values (e.g. \\[2,2,3\\]) (★★★)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 95. Convert a vector of ints into a matrix binary representation (★★★)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 96. Given a two dimensional array, how to extract unique rows? (★★★)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 97. Considering 2 vectors A & B, write the einsum equivalent of inner, outer, sum, and mul function (★★★)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 98. Considering a path described by two vectors (X,Y), how to sample it using equidistant samples (★★★)?" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 99. Given an integer n and a 2D array X, select from X the rows which can be interpreted as draws from a multinomial distribution with n degrees, i.e., the rows which only contain integers and which sum to n. (★★★)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 100. Compute bootstrapped 95% confidence intervals for the mean of a 1D array X (i.e., resample the elements of an array with replacement N times, compute the mean of each sample, and then compute percentiles over the means). (★★★)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.12" } }, "nbformat": 4, "nbformat_minor": 0 } ================================================ FILE: 2.numpy/numpy-100/100_Numpy_exercises_with_hint.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 100 numpy exercises with hint\n", "\n", "This is a collection of exercises that have been collected in the numpy mailing list, on stack overflow and in the numpy documentation. The goal of this collection is to offer a quick reference for both old and new users but also to provide a set of exercises for those who teach.\n", "\n", "\n", "If you find an error or think you've a better way to solve some of them, feel free to open an issue at " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 1. Import the numpy package under the name `np` (★☆☆) \n", "(**hint**: import … as …)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 2. Print the numpy version and the configuration (★☆☆) \n", "(**hint**: np.\\_\\_version\\_\\_, np.show\\_config)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 3. Create a null vector of size 10 (★☆☆) \n", "(**hint**: np.zeros)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 4. How to find the memory size of any array (★☆☆) \n", "(**hint**: size, itemsize)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 5. How to get the documentation of the numpy add function from the command line? (★☆☆) \n", "(**hint**: np.info)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 6. Create a null vector of size 10 but the fifth value which is 1 (★☆☆) \n", "(**hint**: array\\[4\\])" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 7. Create a vector with values ranging from 10 to 49 (★☆☆) \n", "(**hint**: np.arange)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 8. Reverse a vector (first element becomes last) (★☆☆) \n", "(**hint**: array\\[::-1\\])" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 9. Create a 3x3 matrix with values ranging from 0 to 8 (★☆☆) \n", "(**hint**: reshape)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 10. Find indices of non-zero elements from \\[1,2,0,0,4,0\\] (★☆☆) \n", "(**hint**: np.nonzero)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 11. Create a 3x3 identity matrix (★☆☆) \n", "(**hint**: np.eye)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 12. Create a 3x3x3 array with random values (★☆☆) \n", "(**hint**: np.random.random)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 13. Create a 10x10 array with random values and find the minimum and maximum values (★☆☆) \n", "(**hint**: min, max)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 14. Create a random vector of size 30 and find the mean value (★☆☆) \n", "(**hint**: mean)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 15. Create a 2d array with 1 on the border and 0 inside (★☆☆) \n", "(**hint**: array\\[1:-1, 1:-1\\])" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 16. How to add a border (filled with 0's) around an existing array? (★☆☆) \n", "(**hint**: np.pad)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 17. What is the result of the following expression? (★☆☆) \n", "(**hint**: NaN = not a number, inf = infinity)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```python\n", "0 * np.nan\n", "np.nan == np.nan\n", "np.inf > np.nan\n", "np.nan - np.nan\n", "np.nan in set([np.nan])\n", "0.3 == 3 * 0.1\n", "```" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 18. Create a 5x5 matrix with values 1,2,3,4 just below the diagonal (★☆☆) \n", "(**hint**: np.diag)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 19. Create a 8x8 matrix and fill it with a checkerboard pattern (★☆☆) \n", "(**hint**: array\\[::2\\])" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 20. Consider a (6,7,8) shape array, what is the index (x,y,z) of the 100th element? \n", "(**hint**: np.unravel_index)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 21. Create a checkerboard 8x8 matrix using the tile function (★☆☆) \n", "(**hint**: np.tile)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 22. Normalize a 5x5 random matrix (★☆☆) \n", "(**hint**: (x - mean) / std)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 23. Create a custom dtype that describes a color as four unsigned bytes (RGBA) (★☆☆) \n", "(**hint**: np.dtype)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 24. Multiply a 5x3 matrix by a 3x2 matrix (real matrix product) (★☆☆) \n", "(**hint**: np.dot | @)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 25. Given a 1D array, negate all elements which are between 3 and 8, in place. (★☆☆) \n", "(**hint**: >, <=)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 26. What is the output of the following script? (★☆☆) \n", "(**hint**: np.sum)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```python\n", "# Author: Jake VanderPlas\n", "\n", "print(sum(range(5),-1))\n", "from numpy import *\n", "print(sum(range(5),-1))\n", "```" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 27. Consider an integer vector Z, which of these expressions are legal? (★☆☆)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```python\n", "Z**Z\n", "2 << Z >> 2\n", "Z <- Z\n", "1j*Z\n", "Z/1/1\n", "ZZ\n", "```" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 28. What are the result of the following expressions?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```python\n", "np.array(0) / np.array(0)\n", "np.array(0) // np.array(0)\n", "np.array([np.nan]).astype(int).astype(float)\n", "```" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 29. How to round away from zero a float array ? (★☆☆) \n", "(**hint**: np.uniform, np.copysign, np.ceil, np.abs)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 30. How to find common values between two arrays? (★☆☆) \n", "(**hint**: np.intersect1d)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 31. How to ignore all numpy warnings (not recommended)? (★☆☆) \n", "(**hint**: np.seterr, np.errstate)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 32. Is the following expressions true? (★☆☆) \n", "(**hint**: imaginary number)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```python\n", "np.sqrt(-1) == np.emath.sqrt(-1)\n", "```" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 33. How to get the dates of yesterday, today and tomorrow? (★☆☆) \n", "(**hint**: np.datetime64, np.timedelta64)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 34. How to get all the dates corresponding to the month of July 2016? (★★☆) \n", "(**hint**: np.arange(dtype=datetime64\\['D'\\]))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 35. How to compute ((A+B)\\*(-A/2)) in place (without copy)? (★★☆) \n", "(**hint**: np.add(out=), np.negative(out=), np.multiply(out=), np.divide(out=))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 36. Extract the integer part of a random array using 5 different methods (★★☆) \n", "(**hint**: %, np.floor, np.ceil, astype, np.trunc)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 37. Create a 5x5 matrix with row values ranging from 0 to 4 (★★☆) \n", "(**hint**: np.arange)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 38. Consider a generator function that generates 10 integers and use it to build an array (★☆☆) \n", "(**hint**: np.fromiter)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 39. Create a vector of size 10 with values ranging from 0 to 1, both excluded (★★☆) \n", "(**hint**: np.linspace)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 40. Create a random vector of size 10 and sort it (★★☆) \n", "(**hint**: sort)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 41. How to sum a small array faster than np.sum? (★★☆) \n", "(**hint**: np.add.reduce)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 42. Consider two random array A and B, check if they are equal (★★☆) \n", "(**hint**: np.allclose, np.array\\_equal)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 43. Make an array immutable (read-only) (★★☆) \n", "(**hint**: flags.writeable)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 44. Consider a random 10x2 matrix representing cartesian coordinates, convert them to polar coordinates (★★☆) \n", "(**hint**: np.sqrt, np.arctan2)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 45. Create random vector of size 10 and replace the maximum value by 0 (★★☆) \n", "(**hint**: argmax)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 46. Create a structured array with `x` and `y` coordinates covering the \\[0,1\\]x\\[0,1\\] area (★★☆) \n", "(**hint**: np.meshgrid)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 47. Given two arrays, X and Y, construct the Cauchy matrix C (Cij =1/(xi - yj)) \n", "(**hint**: np.subtract.outer)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 48. Print the minimum and maximum representable value for each numpy scalar type (★★☆) \n", "(**hint**: np.iinfo, np.finfo, eps)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 49. How to print all the values of an array? (★★☆) \n", "(**hint**: np.set\\_printoptions)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 50. How to find the closest value (to a given scalar) in a vector? (★★☆) \n", "(**hint**: argmin)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 51. Create a structured array representing a position (x,y) and a color (r,g,b) (★★☆) \n", "(**hint**: dtype)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 52. Consider a random vector with shape (100,2) representing coordinates, find point by point distances (★★☆) \n", "(**hint**: np.atleast\\_2d, T, np.sqrt)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 53. How to convert a float (32 bits) array into an integer (32 bits) in place? \n", "(**hint**: astype(copy=False))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 54. How to read the following file? (★★☆) \n", "(**hint**: np.genfromtxt)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```\n", "1, 2, 3, 4, 5\n", "6, , , 7, 8\n", " , , 9,10,11\n", "```" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 55. What is the equivalent of enumerate for numpy arrays? (★★☆) \n", "(**hint**: np.ndenumerate, np.ndindex)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 56. Generate a generic 2D Gaussian-like array (★★☆) \n", "(**hint**: np.meshgrid, np.exp)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 57. How to randomly place p elements in a 2D array? (★★☆) \n", "(**hint**: np.put, np.random.choice)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 58. Subtract the mean of each row of a matrix (★★☆) \n", "(**hint**: mean(axis=,keepdims=))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 59. How to sort an array by the nth column? (★★☆) \n", "(**hint**: argsort)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 60. How to tell if a given 2D array has null columns? (★★☆) \n", "(**hint**: any, ~)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 61. Find the nearest value from a given value in an array (★★☆) \n", "(**hint**: np.abs, argmin, flat)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 62. Considering two arrays with shape (1,3) and (3,1), how to compute their sum using an iterator? (★★☆) \n", "(**hint**: np.nditer)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 63. Create an array class that has a name attribute (★★☆) \n", "(**hint**: class method)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 64. Consider a given vector, how to add 1 to each element indexed by a second vector (be careful with repeated indices)? (★★★) \n", "(**hint**: np.bincount | np.add.at)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 65. How to accumulate elements of a vector (X) to an array (F) based on an index list (I)? (★★★) \n", "(**hint**: np.bincount)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 66. Considering a (w,h,3) image of (dtype=ubyte), compute the number of unique colors (★★★) \n", "(**hint**: np.unique)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 67. Considering a four dimensions array, how to get sum over the last two axis at once? (★★★) \n", "(**hint**: sum(axis=(-2,-1)))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 68. Considering a one-dimensional vector D, how to compute means of subsets of D using a vector S of same size describing subset indices? (★★★) \n", "(**hint**: np.bincount)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 69. How to get the diagonal of a dot product? (★★★) \n", "(**hint**: np.diag)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 70. Consider the vector \\[1, 2, 3, 4, 5\\], how to build a new vector with 3 consecutive zeros interleaved between each value? (★★★) \n", "(**hint**: array\\[::4\\])" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 71. Consider an array of dimension (5,5,3), how to mulitply it by an array with dimensions (5,5)? (★★★) \n", "(**hint**: array\\[:, :, None\\])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 72. How to swap two rows of an array? (★★★) \n", "(**hint**: array\\[\\[\\]\\] = array\\[\\[\\]\\])" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 73. Consider a set of 10 triplets describing 10 triangles (with shared vertices), find the set of unique line segments composing all the triangles (★★★) \n", "(**hint**: repeat, np.roll, np.sort, view, np.unique)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 74. Given an array C that is a bincount, how to produce an array A such that np.bincount(A) == C? (★★★) \n", "(**hint**: np.repeat)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 75. How to compute averages using a sliding window over an array? (★★★) \n", "(**hint**: np.cumsum)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 76. Consider a one-dimensional array Z, build a two-dimensional array whose first row is (Z\\[0\\],Z\\[1\\],Z\\[2\\]) and each subsequent row is shifted by 1 (last row should be (Z\\[-3\\],Z\\[-2\\],Z\\[-1\\]) (★★★) \n", "(**hint**: from numpy.lib import stride_tricks)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 77. How to negate a boolean, or to change the sign of a float inplace? (★★★) \n", "(**hint**: np.logical_not, np.negative)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 78. Consider 2 sets of points P0,P1 describing lines (2d) and a point p, how to compute distance from p to each line i (P0\\[i\\],P1\\[i\\])? (★★★)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 79. Consider 2 sets of points P0,P1 describing lines (2d) and a set of points P, how to compute distance from each point j (P\\[j\\]) to each line i (P0\\[i\\],P1\\[i\\])? (★★★)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 80. Consider an arbitrary array, write a function that extract a subpart with a fixed shape and centered on a given element (pad with a `fill` value when necessary) (★★★) \n", "(**hint**: minimum, maximum)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 81. Consider an array Z = \\[1,2,3,4,5,6,7,8,9,10,11,12,13,14\\], how to generate an array R = \\[\\[1,2,3,4\\], \\[2,3,4,5\\], \\[3,4,5,6\\], ..., \\[11,12,13,14\\]\\]? (★★★) \n", "(**hint**: stride\\_tricks.as\\_strided)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 82. Compute a matrix rank (★★★) \n", "(**hint**: np.linalg.svd) (suggestion: np.linalg.svd)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 83. How to find the most frequent value in an array? \n", "(**hint**: np.bincount, argmax)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 84. Extract all the contiguous 3x3 blocks from a random 10x10 matrix (★★★) \n", "(**hint**: stride\\_tricks.as\\_strided)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 85. Create a 2D array subclass such that Z\\[i,j\\] == Z\\[j,i\\] (★★★) \n", "(**hint**: class method)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 86. Consider a set of p matrices wich shape (n,n) and a set of p vectors with shape (n,1). How to compute the sum of of the p matrix products at once? (result has shape (n,1)) (★★★) \n", "(**hint**: np.tensordot)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 87. Consider a 16x16 array, how to get the block-sum (block size is 4x4)? (★★★) \n", "(**hint**: np.add.reduceat)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 88. How to implement the Game of Life using numpy arrays? (★★★)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 89. How to get the n largest values of an array (★★★) \n", "(**hint**: np.argsort | np.argpartition)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 90. Given an arbitrary number of vectors, build the cartesian product (every combinations of every item) (★★★) \n", "(**hint**: np.indices)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 91. How to create a record array from a regular array? (★★★) \n", "(**hint**: np.core.records.fromarrays)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 92. Consider a large vector Z, compute Z to the power of 3 using 3 different methods (★★★) \n", "(**hint**: np.power, \\*, np.einsum)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 93. Consider two arrays A and B of shape (8,3) and (2,2). How to find rows of A that contain elements of each row of B regardless of the order of the elements in B? (★★★) \n", "(**hint**: np.where)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 94. Considering a 10x3 matrix, extract rows with unequal values (e.g. \\[2,2,3\\]) (★★★)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 95. Convert a vector of ints into a matrix binary representation (★★★) \n", "(**hint**: np.unpackbits)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 96. Given a two dimensional array, how to extract unique rows? (★★★) \n", "(**hint**: np.ascontiguousarray | np.unique)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 97. Considering 2 vectors A & B, write the einsum equivalent of inner, outer, sum, and mul function (★★★) \n", "(**hint**: np.einsum)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 98. Considering a path described by two vectors (X,Y), how to sample it using equidistant samples (★★★)? \n", "(**hint**: np.cumsum, np.interp)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 99. Given an integer n and a 2D array X, select from X the rows which can be interpreted as draws from a multinomial distribution with n degrees, i.e., the rows which only contain integers and which sum to n. (★★★) \n", "(**hint**: np.logical\\_and.reduce, np.mod)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 100. Compute bootstrapped 95% confidence intervals for the mean of a 1D array X (i.e., resample the elements of an array with replacement N times, compute the mean of each sample, and then compute percentiles over the means). (★★★) \n", "(**hint**: np.percentile)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.4" } }, "nbformat": 4, "nbformat_minor": 1 } ================================================ FILE: 2.numpy/numpy-100/README.md ================================================ ## Numpy练习题100题-提高你的数据分析技能 本文总结了Numpy的常用操作,并做成练习题,练习题附答案建议读者把练习题完成。作者认为,做完练习题,Numpy的基本操作没有问题了,以后碰到问题也可以查这些习题。(文末提供下载) **NumPy**(Numeric Python)系统是Python的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested list structure)结构要高效的多(该结构也可以用来表示矩阵(matrix))。 **NumPy**提供了许多高级的数值编程工具,如:矩阵数据类型、矢量处理,以及精密的运算库。专为进行严格的数字处理而产生。多为很多大型金融公司使用,以及核心的科学计算组织如:Lawrence Livermore,NASA用其处理一些本来使用C++,Fortran或Matlab等所做的任务。 网上可以搜到大量的Numpy教程和官方文档,但没有简单的方法来练习。教程是很好的资源,但要付诸实践。 只有实践,才能更好的加深学习。 本站从github搜索到了一些Numpy的练习题100题,含答案,并进行整理: 原代码作者:**Nicolas P. Rougier**(https://github.com/rougier/numpy-100) **使用方法** 文件夹有三个不同的ipynb文件: 1.**100_Numpy_exercises_no_solution.ipynb** 没有答案代码的文件,这个是你做的练习 2.**100_Numpy_exercises_with_hint.ipynb** 没有答案代码的文件,但有提示,这个你也可以用来练习 3.**100_Numpy_exercises.ipynb** 有答案代码和注释的文件 你可以在**100_Numpy_exercises_no_solution.ipynb** 里输入代码,看看运行结果是否和**100_Numpy_exercises.ipynb** 里面的内容一致。 ================================================ FILE: 2.numpy/numpy_exercises/10_Random_sampling.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Random Sampling" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import numpy as np" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'1.11.2'" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.__version__" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [], "source": [ "__author__ = 'kyubyong. longinglove@nate.com'" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Simple random data" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q1. Create an array of shape (3, 2) and populate it with random samples from a uniform distribution over [0, 1)." ] }, { "cell_type": "code", "execution_count": 49, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[ 0.13879034, 0.71300174],\n", " [ 0.08121322, 0.00393554],\n", " [ 0.02349471, 0.56677474]])" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q2. Create an array of shape (1000, 1000) and populate it with random samples from a standard normal distribution. And verify that the mean and standard deviation is close enough to 0 and 1 repectively." ] }, { "cell_type": "code", "execution_count": 42, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "-0.00110028519551\n", "0.999683483393\n" ] } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q3. Create an array of shape (3, 2) and populate it with random integers ranging from 0 to 3 (inclusive) from a discrete uniform distribution." ] }, { "cell_type": "code", "execution_count": 44, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[1, 3],\n", " [3, 0],\n", " [0, 0]])" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q4. Extract 1 elements from x randomly such that each of them would be associated with probabilities .3, .5, .2. Then print the result 10 times." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "5 out of 10\n", "2 out of 10\n", "3 out of 10\n", "5 out of 10\n", "2 out of 10\n", "5 out of 10\n", "2 out of 10\n", "2 out of 10\n", "2 out of 10\n", "5 out of 10\n" ] } ], "source": [ "x = [b'3 out of 10', b'5 out of 10', b'2 out of 10']\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q5. Extract 3 different integers from 0 to 9 randomly with the same probabilities." ] }, { "cell_type": "code", "execution_count": 66, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([5, 4, 0])" ] }, "execution_count": 66, "metadata": {}, "output_type": "execute_result" } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Permutations" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q6. Shuffle numbers between 0 and 9 (inclusive)." ] }, { "cell_type": "code", "execution_count": 86, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[2 3 8 4 5 1 0 6 9 7]\n" ] } ], "source": [] }, { "cell_type": "code", "execution_count": 88, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[5 2 7 4 1 0 6 8 9 3]\n" ] } ], "source": [ "# Or\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Random generator" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q7. Assign number 10 to the seed of the random generator so that you can get the same value next time." ] }, { "cell_type": "code", "execution_count": 91, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.10" } }, "nbformat": 4, "nbformat_minor": 0 } ================================================ FILE: 2.numpy/numpy_exercises/10_Random_sampling_Solutions.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Random Sampling" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import numpy as np" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'1.11.2'" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.__version__" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [], "source": [ "__author__ = 'kyubyong. longinglove@nate.com'" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Simple random data" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q1. Create an array of shape (3, 2) and populate it with random samples from a uniform distribution over [0, 1)." ] }, { "cell_type": "code", "execution_count": 49, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[ 0.13879034, 0.71300174],\n", " [ 0.08121322, 0.00393554],\n", " [ 0.02349471, 0.56677474]])" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.random.rand(3, 2) \n", "# Or np.random.random((3,2))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q2. Create an array of shape (1000, 1000) and populate it with random samples from a standard normal distribution. And verify that the mean and standard deviation is close enough to 0 and 1 repectively." ] }, { "cell_type": "code", "execution_count": 42, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "-0.00110028519551\n", "0.999683483393\n" ] } ], "source": [ "out1 = np.random.randn(1000, 1000)\n", "out2 = np.random.standard_normal((1000, 1000))\n", "out3 = np.random.normal(loc=0.0, scale=1.0, size=(1000, 1000))\n", "assert np.allclose(np.mean(out1), np.mean(out2), atol=0.1)\n", "assert np.allclose(np.mean(out1), np.mean(out3), atol=0.1)\n", "assert np.allclose(np.std(out1), np.std(out2), atol=0.1)\n", "assert np.allclose(np.std(out1), np.std(out3), atol=0.1)\n", "print np.mean(out3)\n", "print np.std(out1)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q3. Create an array of shape (3, 2) and populate it with random integers ranging from 0 to 3 (inclusive) from a discrete uniform distribution." ] }, { "cell_type": "code", "execution_count": 44, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[1, 3],\n", " [3, 0],\n", " [0, 0]])" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.random.randint(0, 4, (3, 2))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q4. Extract 1 elements from x randomly such that each of them would be associated with probabilities .3, .5, .2. Then print the result 10 times." ] }, { "cell_type": "code", "execution_count": 58, "metadata": { "collapsed": true }, "outputs": [], "source": [ "x = [b'3 out of 10', b'5 out of 10', b'2 out of 10']" ] }, { "cell_type": "code", "execution_count": 60, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2 out of 10\n", "5 out of 10\n", "3 out of 10\n", "5 out of 10\n", "5 out of 10\n", "5 out of 10\n", "2 out of 10\n", "2 out of 10\n", "5 out of 10\n", "5 out of 10\n" ] } ], "source": [ "for _ in range(10):\n", " print np.random.choice(x, p=[.3, .5, .2])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q5. Extract 3 different integers from 0 to 9 randomly with the same probabilities." ] }, { "cell_type": "code", "execution_count": 66, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([5, 4, 0])" ] }, "execution_count": 66, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.random.choice(10, 3, replace=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Permutations" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q6. Shuffle numbers between 0 and 9 (inclusive)." ] }, { "cell_type": "code", "execution_count": 86, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[2 3 8 4 5 1 0 6 9 7]\n" ] } ], "source": [ "x = np.arange(10)\n", "np.random.shuffle(x)\n", "print x" ] }, { "cell_type": "code", "execution_count": 88, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[5 2 7 4 1 0 6 8 9 3]\n" ] } ], "source": [ "# Or\n", "print np.random.permutation(10)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Random generator" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q7. Assign number 10 to the seed of the random generator so that you can get the same value next time." ] }, { "cell_type": "code", "execution_count": 91, "metadata": { "collapsed": true }, "outputs": [], "source": [ "np.random.seed(10)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.10" } }, "nbformat": 4, "nbformat_minor": 0 } ================================================ FILE: 2.numpy/numpy_exercises/11_Set_routines.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Set routines" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import numpy as np" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'1.11.2'" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.__version__" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "author = 'kyubyong. longinglove@nate.com'" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Making proper sets" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q1. Get unique elements and reconstruction indices from x. And reconstruct x." ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "unique elements = [1 2 3 4 6]\n", "reconstruction indices = [0 1 4 3 1 2 1]\n", "reconstructed = [1 2 6 4 2 3 2]\n" ] } ], "source": [ "x = np.array([1, 2, 6, 4, 2, 3, 2])\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Boolean operations" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q2. Create a boolean array of the same shape as x. If each element of x is present in y, the result will be True, otherwise False." ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ True True False False True]\n" ] } ], "source": [ "x = np.array([0, 1, 2, 5, 0])\n", "y = np.array([0, 1])\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q3. Find the unique intersection of x and y." ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0 1]\n" ] } ], "source": [ "x = np.array([0, 1, 2, 5, 0])\n", "y = np.array([0, 1, 4])\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q4. Find the unique elements of x that are not present in y." ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[2 5]\n" ] } ], "source": [ "x = np.array([0, 1, 2, 5, 0])\n", "y = np.array([0, 1, 4])\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q5. Find the xor elements of x and y." ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[2 4 5]\n" ] } ], "source": [ "x = np.array([0, 1, 2, 5, 0])\n", "y = np.array([0, 1, 4])\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q6. Find the union of x and y." ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0 1 2 4 5]\n" ] } ], "source": [ "x = np.array([0, 1, 2, 5, 0])\n", "y = np.array([0, 1, 4])\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.6" } }, "nbformat": 4, "nbformat_minor": 1 } ================================================ FILE: 2.numpy/numpy_exercises/11_Set_routines_Solutions.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Set routines" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import numpy as np" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'1.11.2'" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.__version__" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [], "source": [ "author = 'kyubyong. longinglove@nate.com'" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Making proper sets" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q1. Get unique elements and reconstruction indices from x. And reconstruct x." ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "unique elements = [1 2 3 4 6]\n", "reconstruction indices = [0 1 4 3 1 2 1]\n", "reconstructed = [1 2 6 4 2 3 2]\n" ] } ], "source": [ "x = np.array([1, 2, 6, 4, 2, 3, 2])\n", "out, indices = np.unique(x, return_inverse=True)\n", "print \"unique elements =\", out\n", "print \"reconstruction indices =\", indices\n", "print \"reconstructed =\", out[indices]\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Boolean operations" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q2. Create a boolean array of the same shape as x. If each element of x is present in y, the result will be True, otherwise False." ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ True True False False True]\n" ] } ], "source": [ "x = np.array([0, 1, 2, 5, 0])\n", "y = np.array([0, 1])\n", "print np.in1d(x, y)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q3. Find the unique intersection of x and y." ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0 1]\n" ] } ], "source": [ "x = np.array([0, 1, 2, 5, 0])\n", "y = np.array([0, 1, 4])\n", "print np.intersect1d(x, y)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q4. Find the unique elements of x that are not present in y." ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[2 5]\n" ] } ], "source": [ "x = np.array([0, 1, 2, 5, 0])\n", "y = np.array([0, 1, 4])\n", "print np.setdiff1d(x, y)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q5. Find the xor elements of x and y." ] }, { "cell_type": "code", "execution_count": 40, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[2 4 5]\n" ] } ], "source": [ "x = np.array([0, 1, 2, 5, 0])\n", "y = np.array([0, 1, 4])\n", "out1 = np.setxor1d(x, y)\n", "out2 = np.sort(np.concatenate((np.setdiff1d(x, y), np.setdiff1d(y, x))))\n", "assert np.allclose(out1, out2)\n", "print out1\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q6. Find the union of x and y." ] }, { "cell_type": "code", "execution_count": 42, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0 1 2 4 5]\n" ] } ], "source": [ "x = np.array([0, 1, 2, 5, 0])\n", "y = np.array([0, 1, 4])\n", "out1 = np.union1d(x, y)\n", "out2 = np.sort(np.unique(np.concatenate((x, y))))\n", "assert np.allclose(out1, out2)\n", "print np.union1d(x, y)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.10" } }, "nbformat": 4, "nbformat_minor": 0 } ================================================ FILE: 2.numpy/numpy_exercises/12_Sorting_searching_and_counting.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Soring, searching, and counting" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import numpy as np" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'1.11.2'" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.__version__" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ "author = 'kyubyong. longinglove@nate.com'" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Sorting" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q1. Sort x along the second axis." ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[1 4]\n", " [1 3]]\n" ] } ], "source": [ "x = np.array([[1,4],[3,1]])\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q2. Sort pairs of surnames and first names and return their indices. (first by surname, then by name)." ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1 2 0]\n" ] } ], "source": [ "surnames = ('Hertz', 'Galilei', 'Hertz')\n", "first_names = ('Heinrich', 'Galileo', 'Gustav')\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q3. Get the indices that would sort x along the second axis." ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[0 1]\n", " [1 0]]\n" ] } ], "source": [ "x = np.array([[1,4],[3,1]])\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q4. Create an array such that its fifth element would be the same as the element of sorted x, and it divide other elements by their value." ] }, { "cell_type": "code", "execution_count": 48, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "x = [5 1 6 3 9 8 2 7 4 0]\n", "\n", "Check the fifth element of this new array is 5, the first four elements are all smaller than 5, and 6th through the end are bigger than 5\n", "[2 0 4 3 1 5 8 7 6 9]\n" ] } ], "source": [ "x = np.random.permutation(10)\n", "print \"x =\", x\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q5. Create the indices of an array such that its third element would be the same as the element of sorted x, and it divide other elements by their value." ] }, { "cell_type": "code", "execution_count": 56, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "x = [2 8 3 7 5 6 4 0 9 1]\n", "partitioned = [0 1 2 3 4 5 8 6 9 7]\n", "indices = [0 1 2 3 4 5 8 6 9 7]\n" ] } ], "source": [ "x = np.random.permutation(10)\n", "print \"x =\", x\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Searching" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q6. Get the maximum and minimum values and their indices of x along the second axis." ] }, { "cell_type": "code", "execution_count": 78, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "x = [[0 5 9 8 2]\n", " [3 7 4 1 6]]\n", "maximum values = [9 7]\n", "max indices = [2 1]\n", "minimum values = [0 1]\n", "min indices = [0 3]\n" ] } ], "source": [ "x = np.random.permutation(10).reshape(2, 5)\n", "print \"x =\", x\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q7. Get the maximum and minimum values and their indices of x along the second axis, ignoring NaNs." ] }, { "cell_type": "code", "execution_count": 79, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "maximum values ignoring NaNs = [ 4. 3.]\n", "max indices = [1 0]\n", "minimum values ignoring NaNs = [ 4. 2.]\n", "min indices = [1 1]\n" ] } ], "source": [ "x = np.array([[np.nan, 4], [3, 2]])\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q8. Get the values and indices of the elements that are bigger than 2 in x.\n" ] }, { "cell_type": "code", "execution_count": 113, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Values bigger than 2 = [3 3 5]\n", "Their indices are (array([0, 1, 1], dtype=int64), array([2, 1, 2], dtype=int64))\n" ] } ], "source": [ "x = np.array([[1, 2, 3], [1, 3, 5]])\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q9. Get the indices of the elements that are bigger than 2 in the flattend x." ] }, { "cell_type": "code", "execution_count": 100, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0 1 2 3 4 5]\n" ] } ], "source": [ "x = np.array([[1, 2, 3], [1, 3, 5]])\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q10. Check the elements of x and return 0 if it is less than 0, otherwise the element itself." ] }, { "cell_type": "code", "execution_count": 105, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[0 0 0]\n", " [0 0 0]\n", " [1 2 3]]\n" ] } ], "source": [ "x = np.arange(-5, 4).reshape(3, 3)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q11. Get the indices where elements of y should be inserted to x to maintain order." ] }, { "cell_type": "code", "execution_count": 109, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([0, 2, 1, 3], dtype=int64)" ] }, "execution_count": 109, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x = [1, 3, 5, 7, 9]\n", "y = [0, 4, 2, 6]\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Counting" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q12. Get the number of nonzero elements in x." ] }, { "cell_type": "code", "execution_count": 120, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "5\n" ] } ], "source": [ "x = [[0,1,7,0,0],[3,0,0,2,19]]\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.10" } }, "nbformat": 4, "nbformat_minor": 0 } ================================================ FILE: 2.numpy/numpy_exercises/12_Sorting_searching_and_counting_Solutions.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Soring, searching, and counting" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "import numpy as np" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'1.11.2'" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.__version__" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ "author = 'kyubyong. longinglove@nate.com'" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Sorting" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q1. Sort x along the second axis." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[1 4]\n", " [1 3]]\n" ] } ], "source": [ "x = np.array([[1,4],[3,1]])\n", "out = np.sort(x, axis=1)\n", "x.sort(axis=1)\n", "assert np.array_equal(out, x)\n", "print out" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q2. Sort pairs of surnames and first names and return their indices. (first by surname, then by name)." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1 2 0]\n" ] } ], "source": [ "surnames = ('Hertz', 'Galilei', 'Hertz')\n", "first_names = ('Heinrich', 'Galileo', 'Gustav')\n", "print np.lexsort((first_names, surnames))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q3. Get the indices that would sort x along the second axis." ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[0 1]\n", " [1 0]]\n" ] } ], "source": [ "x = np.array([[1,4],[3,1]])\n", "out = np.argsort(x, axis=1)\n", "print out" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q4. Create an array such that its fifth element would be the same as the element of sorted x, and it divide other elements by their value." ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "x = [5 1 6 3 9 8 2 7 4 0]\n", "\n", "Check the fifth element of this new array is 5, the first four elements are all smaller than 5, and 6th through the end are bigger than 5\n", "[2 0 4 3 1 5 8 7 6 9]\n" ] } ], "source": [ "x = np.random.permutation(10)\n", "print \"x =\", x\n", "print \"\\nCheck the fifth element of this new array is 5, the first four elements are all smaller than 5, and 6th through the end are bigger than 5\\n\", \n", "out = np.partition(x, 5)\n", "x.partition(5) # in-place equivalent\n", "assert np.array_equal(x, out)\n", "print out\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q5. Create the indices of an array such that its third element would be the same as the element of sorted x, and it divide other elements by their value." ] }, { "cell_type": "code", "execution_count": 56, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "x = [2 8 3 7 5 6 4 0 9 1]\n", "partitioned = [0 1 2 3 4 5 8 6 9 7]\n", "indices = [0 1 2 3 4 5 8 6 9 7]\n" ] } ], "source": [ "x = np.random.permutation(10)\n", "print \"x =\", x\n", "partitioned = np.partition(x, 3)\n", "indices = np.argpartition(x, 3)\n", "print \"partitioned =\", partitioned\n", "print \"indices =\", partitioned\n", "assert np.array_equiv(x[indices], partitioned)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Searching" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q6. Get the maximum and minimum values and their indices of x along the second axis." ] }, { "cell_type": "code", "execution_count": 78, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "x = [[0 5 9 8 2]\n", " [3 7 4 1 6]]\n", "maximum values = [9 7]\n", "max indices = [2 1]\n", "minimum values = [0 1]\n", "min indices = [0 3]\n" ] } ], "source": [ "x = np.random.permutation(10).reshape(2, 5)\n", "print \"x =\", x\n", "print \"maximum values =\", np.max(x, 1)\n", "print \"max indices =\", np.argmax(x, 1)\n", "print \"minimum values =\", np.min(x, 1)\n", "print \"min indices =\", np.argmin(x, 1)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q7. Get the maximum and minimum values and their indices of x along the second axis, ignoring NaNs." ] }, { "cell_type": "code", "execution_count": 79, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "maximum values ignoring NaNs = [ 4. 3.]\n", "max indices = [1 0]\n", "minimum values ignoring NaNs = [ 4. 2.]\n", "min indices = [1 1]\n" ] } ], "source": [ "x = np.array([[np.nan, 4], [3, 2]])\n", "print \"maximum values ignoring NaNs =\", np.nanmax(x, 1)\n", "print \"max indices =\", np.nanargmax(x, 1)\n", "print \"minimum values ignoring NaNs =\", np.nanmin(x, 1)\n", "print \"min indices =\", np.nanargmin(x, 1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q8. Get the values and indices of the elements that are bigger than 2 in x.\n" ] }, { "cell_type": "code", "execution_count": 113, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Values bigger than 2 = [3 3 5]\n", "Their indices are (array([0, 1, 1], dtype=int64), array([2, 1, 2], dtype=int64))\n" ] } ], "source": [ "x = np.array([[1, 2, 3], [1, 3, 5]])\n", "print \"Values bigger than 2 =\", x[x>2]\n", "print \"Their indices are \", np.nonzero(x > 2)\n", "assert np.array_equiv(x[x>2], x[np.nonzero(x > 2)])\n", "assert np.array_equiv(x[x>2], np.extract(x > 2, x))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q9. Get the indices of the elements that are bigger than 2 in the flattend x." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[2 4 5]\n" ] } ], "source": [ "x = np.array([[1, 2, 3], [1, 3, 5]])\n", "print np.flatnonzero(x>2)\n", "assert np.array_equiv(np.flatnonzero(x), x.ravel().nonzero())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q10. Check the elements of x and return 0 if it is less than 0, otherwise the element itself." ] }, { "cell_type": "code", "execution_count": 105, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[0 0 0]\n", " [0 0 0]\n", " [1 2 3]]\n" ] } ], "source": [ "x = np.arange(-5, 4).reshape(3, 3)\n", "print np.where(x <0, 0, x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q11. Get the indices where elements of y should be inserted to x to maintain order." ] }, { "cell_type": "code", "execution_count": 109, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([0, 2, 1, 3], dtype=int64)" ] }, "execution_count": 109, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x = [1, 3, 5, 7, 9]\n", "y = [0, 4, 2, 6]\n", "np.searchsorted(x, y)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Counting" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q12. Get the number of nonzero elements in x." ] }, { "cell_type": "code", "execution_count": 120, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "5\n" ] } ], "source": [ "x = [[0,1,7,0,0],[3,0,0,2,19]]\n", "print np.count_nonzero(x)\n", "assert np.count_nonzero(x) == len(x[x!=0])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.2" } }, "nbformat": 4, "nbformat_minor": 1 } ================================================ FILE: 2.numpy/numpy_exercises/13_Statistics.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Statistics" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "__author__ = \"kyubyong. kbpark.linguist@gmail.com\"" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import numpy as np" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'1.11.3'" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.__version__" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Order statistics" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q1. Return the minimum value of x along the second axis." ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "x=\n", " [[0 1]\n", " [2 3]]\n", "ans=\n", " [0 2]\n" ] } ], "source": [ "x = np.arange(4).reshape((2, 2))\n", "print(\"x=\\n\", x)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q2. Return the maximum value of x along the second axis. Reduce the second axis to the dimension with size one." ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "x=\n", " [[0 1]\n", " [2 3]]\n", "ans=\n", " [[1]\n", " [3]]\n" ] } ], "source": [ "x = np.arange(4).reshape((2, 2))\n", "print(\"x=\\n\", x)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q3. Calcuate the difference between the maximum and the minimum of x along the second axis." ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "x=\n", " [[0 1 2 3 4]\n", " [5 6 7 8 9]]\n", "ans=\n", " [4 4]\n" ] } ], "source": [ "x = np.arange(10).reshape((2, 5))\n", "print(\"x=\\n\", x)\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q4. Compute the 75th percentile of x along the second axis." ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "x=\n", " [[ 1 2 3 4 5]\n", " [ 6 7 8 9 10]]\n", "ans=\n", " [ 4. 9.]\n" ] } ], "source": [ "x = np.arange(1, 11).reshape((2, 5))\n", "print(\"x=\\n\", x)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Averages and variances" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q5. Compute the median of flattened x." ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "x=\n", " [[1 2 3]\n", " [4 5 6]\n", " [7 8 9]]\n", "ans=\n", " 5.0\n" ] } ], "source": [ "x = np.arange(1, 10).reshape((3, 3))\n", "print(\"x=\\n\", x)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q6. Compute the weighted average of x." ] }, { "cell_type": "code", "execution_count": 62, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2.66666666667\n" ] } ], "source": [ "x = np.arange(5)\n", "weights = np.arange(1, 6)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q7. Compute the mean, standard deviation, and variance of x along the second axis." ] }, { "cell_type": "code", "execution_count": 72, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "x=\n", " [0 1 2 3 4]\n", "mean=\n", " 2.0\n", "std=\n", " 1.41421356237\n", "variance=\n", " 2.0\n" ] } ], "source": [ "x = np.arange(5)\n", "print(\"x=\\n\",x)\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Correlating" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q8. Compute the covariance matrix of x and y." ] }, { "cell_type": "code", "execution_count": 82, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "ans=\n", " [[ 1. -1.]\n", " [-1. 1.]]\n" ] } ], "source": [ "x = np.array([0, 1, 2])\n", "y = np.array([2, 1, 0])\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q9. In the above covariance matrix, what does the -1 mean?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q10. Compute Pearson product-moment correlation coefficients of x and y." ] }, { "cell_type": "code", "execution_count": 87, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "ans=\n", " [[ 1. 0.92857143]\n", " [ 0.92857143 1. ]]\n" ] } ], "source": [ "x = np.array([0, 1, 3])\n", "y = np.array([2, 4, 5])\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q11. Compute cross-correlation of x and y." ] }, { "cell_type": "code", "execution_count": 90, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "ans=\n", " [19]\n" ] } ], "source": [ "x = np.array([0, 1, 3])\n", "y = np.array([2, 4, 5])\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Histograms" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q12. Compute the histogram of x against the bins." ] }, { "cell_type": "code", "execution_count": 105, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "ans=\n", " (array([2, 3, 1], dtype=int64), array([0, 1, 2, 3]))\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "x = np.array([0.5, 0.7, 1.0, 1.2, 1.3, 2.1])\n", "bins = np.array([0, 1, 2, 3])\n", "print(\"ans=\\n\", ...)\n", "\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline\n", "plt.hist(x, bins=bins)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q13. Compute the 2d histogram of x and y." ] }, { "cell_type": "code", "execution_count": 127, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "ans=\n", " [[ 3. 0. 0. 0.]\n", " [ 0. 2. 0. 0.]\n", " [ 0. 0. 1. 1.]]\n" ] }, { "data": { "image/png": "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\nccIrqwsyszzmVpyZ5TG3Ypp6QScAEXEvMApcV7SxGPgasGK2FUZHR+l0OpMea9asYd++fZPWO3jw\nIJ1OZ9r2W7ZsYc+ePZOWjY2N0el0OHny5KTlO3bsYOfOnZOWnThxgk6nM+0rud27d08bdz0+Pk6n\n05l2975ut8umTZum1bZhw4ZK9mPPnj2LYj8W8vNYvnz5otgPWNjPA1gU+7GQn8fy5csXxX7Awn4e\ny5cvXxT7AeV/Ht1u97m/jSMjI3Q6HbZu3TptmzJU/s3FoLF4A3BtSuk7me9xEPhJSunNZ3nNby4k\nScpQ1TcXlY4WiYiPATcBHeCfIuKCwUs/Tik9O1jnA8C/OXPKIyLuAL4L/D1wLvAO4HXA66usVZIk\nlaPq0yLvAl4MPAx8f8Lj9yes83LgwgnPXwh8CPjmYLvfBK5PKT1cca2tc7avrjU7M8tjbsWZWR5z\nq4eq57mYs3lJKW2a8vwe4J7KitJzxsfHh11C45hZHnMrzszymFs9LNhokap4zYUkSXkaPVpEkiS1\nh82FJEkqlc1Fi00df625mVkecyvOzPKYWz3YXLTY5s2bh11C45hZHnMrzszymFs92Fy02J133jns\nEhrHzPKYW3Fmlsfc6sHmosUcXVOcmeUxt+LMLI+51YPNhSRJKpXNhSRJKpXNRYtNvYuf5mZmecyt\nODPLY271YHPRYmNjpU3G1hpmlsfcijOzPOZWD07/LUlSSzn9tyRJagSbC0mSVCqbC0mSVCqbixbr\ndDrDLqFxzCyPuRVnZnnMrR5sLlrstttuG3YJjWNmecytODPLY2714GgRSZJaytEikiSpEWwuJElS\nqWwuWmzfvn3DLqFxzCyPuRVnZnnMrR5sLlqs2+0Ou4TGMbM85lacmeUxt3rwgk5JklrKCzolSVIj\n2FxIkqRS2VxIkqRS2Vy02KZNm4ZdQuOYWR5zK87M8phbPdhctNi6deuGXULjmFkecyvOzPKYWz1U\nOlokIv4IeCNwCfBT4CvA+1JKvTm2uw74EPDrwAngf00pfXqGdR0tIklShqaOFnktsBu4ElgLvAA4\nGBG/PNMGEXER8HngC8ArgY8Cn4yI11dcqyRJKsE5Vb55Sml04vOIeDvwNHAFcHiGzd4NfCeltH3w\n/NsR8bvAVuBvKipVktRwvV6P48ePs2LFClauXDnsclptoa+5eCmQgFOzrHMVcGjKsgPAmqqKaqvD\n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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "xedges = [0, 1, 2, 3]\n", "yedges = [0, 1, 2, 3, 4]\n", "x = np.array([0, 0.1, 0.2, 1., 1.1, 2., 2.1])\n", "y = np.array([0, 0.1, 0.2, 1., 1.1, 2., 3.3])\n", "...\n", "\n", "plt.scatter(x, y)\n", "plt.grid()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q14. Count number of occurrences of 0 through 7 in x." ] }, { "cell_type": "code", "execution_count": 129, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "ans=\n", " [1 3 1 1 0 0 0 1]\n" ] } ], "source": [ "x = np.array([0, 1, 1, 3, 2, 1, 7])\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q15. Return the indices of the bins to which each value in x belongs." ] }, { "cell_type": "code", "execution_count": 130, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "ans=\n", " [1 4 3 2]\n" ] } ], "source": [ "x = np.array([0.2, 6.4, 3.0, 1.6])\n", "bins = np.array([0.0, 1.0, 2.5, 4.0, 10.0])\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "anaconda-cloud": {}, "kernelspec": { "display_name": "Python [conda root]", "language": "python", "name": "conda-root-py" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.2" } }, "nbformat": 4, "nbformat_minor": 1 } ================================================ FILE: 2.numpy/numpy_exercises/13_Statistics_solutions.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Statistics" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "__author__ = \"kyubyong. kbpark.linguist@gmail.com\"" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import numpy as np" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'1.11.3'" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.__version__" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Order statistics" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q1. Return the minimum value of x along the second axis." ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "x=\n", " [[0 1]\n", " [2 3]]\n", "ans=\n", " [0 2]\n" ] } ], "source": [ "x = np.arange(4).reshape((2, 2))\n", "print(\"x=\\n\", x)\n", "print(\"ans=\\n\", np.amin(x, 1))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q2. Return the maximum value of x along the second axis. Reduce the second axis to the dimension with size one." ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "x=\n", " [[0 1]\n", " [2 3]]\n", "ans=\n", " [[1]\n", " [3]]\n" ] } ], "source": [ "x = np.arange(4).reshape((2, 2))\n", "print(\"x=\\n\", x)\n", "print(\"ans=\\n\", np.amax(x, 1, keepdims=True))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q3. Calcuate the difference between the maximum and the minimum of x along the second axis." ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "x=\n", " [[0 1 2 3 4]\n", " [5 6 7 8 9]]\n", "ans=\n", " [4 4]\n" ] } ], "source": [ "x = np.arange(10).reshape((2, 5))\n", "print(\"x=\\n\", x)\n", "\n", "out1 = np.ptp(x, 1)\n", "out2 = np.amax(x, 1) - np.amin(x, 1)\n", "assert np.allclose(out1, out2)\n", "print(\"ans=\\n\", out1)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q4. Compute the 75th percentile of x along the second axis." ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "x=\n", " [[ 1 2 3 4 5]\n", " [ 6 7 8 9 10]]\n", "ans=\n", " [ 4. 9.]\n" ] } ], "source": [ "x = np.arange(1, 11).reshape((2, 5))\n", "print(\"x=\\n\", x)\n", "\n", "print(\"ans=\\n\", np.percentile(x, 75, 1))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Averages and variances" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q5. Compute the median of flattened x." ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "x=\n", " [[1 2 3]\n", " [4 5 6]\n", " [7 8 9]]\n", "ans=\n", " 5.0\n" ] } ], "source": [ "x = np.arange(1, 10).reshape((3, 3))\n", "print(\"x=\\n\", x)\n", "\n", "print(\"ans=\\n\", np.median(x))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q6. Compute the weighted average of x." ] }, { "cell_type": "code", "execution_count": 62, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2.66666666667\n" ] } ], "source": [ "x = np.arange(5)\n", "weights = np.arange(1, 6)\n", "\n", "out1 = np.average(x, weights=weights)\n", "out2 = (x*(weights/weights.sum())).sum()\n", "assert np.allclose(out1, out2)\n", "print(out1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q7. Compute the mean, standard deviation, and variance of x along the second axis." ] }, { "cell_type": "code", "execution_count": 72, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "x=\n", " [0 1 2 3 4]\n", "mean=\n", " 2.0\n", "std=\n", " 1.41421356237\n", "variance=\n", " 2.0\n" ] } ], "source": [ "x = np.arange(5)\n", "print(\"x=\\n\",x)\n", "\n", "out1 = np.mean(x)\n", "out2 = np.average(x)\n", "assert np.allclose(out1, out2)\n", "print(\"mean=\\n\", out1)\n", "\n", "out3 = np.std(x)\n", "out4 = np.sqrt(np.mean((x - np.mean(x)) ** 2 ))\n", "assert np.allclose(out3, out4)\n", "print(\"std=\\n\", out3)\n", "\n", "out5 = np.var(x)\n", "out6 = np.mean((x - np.mean(x)) ** 2 )\n", "assert np.allclose(out5, out6)\n", "print(\"variance=\\n\", out5)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Correlating" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q8. Compute the covariance matrix of x and y." ] }, { "cell_type": "code", "execution_count": 82, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "ans=\n", " [[ 1. -1.]\n", " [-1. 1.]]\n" ] } ], "source": [ "x = np.array([0, 1, 2])\n", "y = np.array([2, 1, 0])\n", "\n", "print(\"ans=\\n\", np.cov(x, y))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q9. In the above covariance matrix, what does the -1 mean?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It means `x` and `y` correlate perfectly in opposite directions." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q10. Compute Pearson product-moment correlation coefficients of x and y." ] }, { "cell_type": "code", "execution_count": 87, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "ans=\n", " [[ 1. 0.92857143]\n", " [ 0.92857143 1. ]]\n" ] } ], "source": [ "x = np.array([0, 1, 3])\n", "y = np.array([2, 4, 5])\n", "\n", "print(\"ans=\\n\", np.corrcoef(x, y))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q11. Compute cross-correlation of x and y." ] }, { "cell_type": "code", "execution_count": 90, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "ans=\n", " [19]\n" ] } ], "source": [ "x = np.array([0, 1, 3])\n", "y = np.array([2, 4, 5])\n", "\n", "print(\"ans=\\n\", np.correlate(x, y))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Histograms" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q12. Compute the histogram of x against the bins." ] }, { "cell_type": "code", "execution_count": 105, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "ans=\n", " (array([2, 3, 1], dtype=int64), array([0, 1, 2, 3]))\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "x = np.array([0.5, 0.7, 1.0, 1.2, 1.3, 2.1])\n", "bins = np.array([0, 1, 2, 3])\n", "print(\"ans=\\n\", np.histogram(x, bins))\n", "\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline\n", "plt.hist(x, bins=bins)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q13. Compute the 2d histogram of x and y." ] }, { "cell_type": "code", "execution_count": 127, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "ans=\n", " [[ 3. 0. 0. 0.]\n", " [ 0. 2. 0. 0.]\n", " [ 0. 0. 1. 1.]]\n" ] }, { "data": { "image/png": "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\nccIrqwsyszzmVpyZ5TG3Ypp6QScAEXEvMApcV7SxGPgasGK2FUZHR+l0OpMea9asYd++fZPWO3jw\nIJ1OZ9r2W7ZsYc+ePZOWjY2N0el0OHny5KTlO3bsYOfOnZOWnThxgk6nM+0rud27d08bdz0+Pk6n\n05l2975ut8umTZum1bZhw4ZK9mPPnj2LYj8W8vNYvnz5otgPWNjPA1gU+7GQn8fy5csXxX7Awn4e\ny5cvXxT7AeV/Ht1u97m/jSMjI3Q6HbZu3TptmzJU/s3FoLF4A3BtSuk7me9xEPhJSunNZ3nNby4k\nScpQ1TcXlY4WiYiPATcBHeCfIuKCwUs/Tik9O1jnA8C/OXPKIyLuAL4L/D1wLvAO4HXA66usVZIk\nlaPq0yLvAl4MPAx8f8Lj9yes83LgwgnPXwh8CPjmYLvfBK5PKT1cca2tc7avrjU7M8tjbsWZWR5z\nq4eq57mYs3lJKW2a8vwe4J7KitJzxsfHh11C45hZHnMrzszymFs9LNhokap4zYUkSXkaPVpEkiS1\nh82FJEkqlc1Fi00df625mVkecyvOzPKYWz3YXLTY5s2bh11C45hZHnMrzszymFs92Fy02J133jns\nEhrHzPKYW3Fmlsfc6sHmosUcXVOcmeUxt+LMLI+51YPNhSRJKpXNhSRJKpXNRYtNvYuf5mZmecyt\nODPLY271YHPRYmNjpU3G1hpmlsfcijOzPOZWD07/LUlSSzn9tyRJagSbC0mSVCqbC0mSVCqbixbr\ndDrDLqFxzCyPuRVnZnnMrR5sLlrstttuG3YJjWNmecytODPLY2714GgRSZJaytEikiSpEWwuJElS\nqWwuWmzfvn3DLqFxzCyPuRVnZnnMrR5sLlqs2+0Ou4TGMbM85lacmeUxt3rwgk5JklrKCzolSVIj\n2FxIkqRS2VxIkqRS2Vy02KZNm4ZdQuOYWR5zK87M8phbPdhctNi6deuGXULjmFkecyvOzPKYWz1U\nOlokIv4IeCNwCfBT4CvA+1JKvTm2uw74EPDrwAngf00pfXqGdR0tIklShqaOFnktsBu4ElgLvAA4\nGBG/PNMGEXER8HngC8ArgY8Cn4yI11dcqyRJKsE5Vb55Sml04vOIeDvwNHAFcHiGzd4NfCeltH3w\n/NsR8bvAVuBvKipVktRwvV6P48ePs2LFClauXDnsclptoa+5eCmQgFOzrHMVcGjKsgPAmqqKaqvD\n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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "xedges = [0, 1, 2, 3]\n", "yedges = [0, 1, 2, 3, 4]\n", "x = np.array([0, 0.1, 0.2, 1., 1.1, 2., 2.1])\n", "y = np.array([0, 0.1, 0.2, 1., 1.1, 2., 3.3])\n", "H, xedges, yedges = np.histogram2d(x, y, bins=(xedges, yedges))\n", "print(\"ans=\\n\", H)\n", "\n", "plt.scatter(x, y)\n", "plt.grid()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q14. Count number of occurrences of 0 through 7 in x." ] }, { "cell_type": "code", "execution_count": 129, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "ans=\n", " [1 3 1 1 0 0 0 1]\n" ] } ], "source": [ "x = np.array([0, 1, 1, 3, 2, 1, 7])\n", "print(\"ans=\\n\", np.bincount(x))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q15. Return the indices of the bins to which each value in x belongs." ] }, { "cell_type": "code", "execution_count": 130, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "ans=\n", " [1 4 3 2]\n" ] } ], "source": [ "x = np.array([0.2, 6.4, 3.0, 1.6])\n", "bins = np.array([0.0, 1.0, 2.5, 4.0, 10.0])\n", "\n", "print(\"ans=\\n\", np.digitize(x, bins))" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "anaconda-cloud": {}, "kernelspec": { "display_name": "Python [conda root]", "language": "python", "name": "conda-root-py" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.2" } }, "nbformat": 4, "nbformat_minor": 1 } ================================================ FILE: 2.numpy/numpy_exercises/1_Array_creation_routines.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Array creation routines" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Ones and zeros" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import numpy as np" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Create a new array of 2*2 integers, without initializing entries." ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[0, 0],\n", " [0, 0]])" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let X = np.array([1,2,3], [4,5,6], np.int32). \n", "Create a new array with the same shape and type as X." ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[1, 2, 3],\n", " [4, 5, 6]])" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X = np.array([[1,2,3], [4,5,6]], np.int32)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Create a 3-D array with ones on the diagonal and zeros elsewhere." ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 1., 0., 0.],\n", " [ 0., 1., 0.],\n", " [ 0., 0., 1.]])" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 1., 0., 0.],\n", " [ 0., 1., 0.],\n", " [ 0., 0., 1.]])" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Create a new array of 3*2 float numbers, filled with ones." ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 1., 1.],\n", " [ 1., 1.],\n", " [ 1., 1.]])" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let x = np.arange(4, dtype=np.int64). Create an array of ones with the same shape and type as X." ] }, { "cell_type": "code", "execution_count": 59, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([1, 1, 1, 1], dtype=int64)" ] }, "execution_count": 59, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x = np.arange(4, dtype=np.int64)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Create a new array of 3*2 float numbers, filled with zeros." ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 0., 0.],\n", " [ 0., 0.],\n", " [ 0., 0.]])" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let x = np.arange(4, dtype=np.int64). Create an array of zeros with the same shape and type as X." ] }, { "cell_type": "code", "execution_count": 58, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([0, 0, 0, 0], dtype=int64)" ] }, "execution_count": 58, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x = np.arange(4, dtype=np.int64)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Create a new array of 2*5 uints, filled with 6." ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[6, 6, 6, 6, 6],\n", " [6, 6, 6, 6, 6]], dtype=uint32)" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let x = np.arange(4, dtype=np.int64). Create an array of 6's with the same shape and type as X." ] }, { "cell_type": "code", "execution_count": 79, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([6, 6, 6, 6], dtype=int64)" ] }, "execution_count": 79, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x = np.arange(4, dtype=np.int64)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## From existing data" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Create an array of [1, 2, 3]." ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([1, 2, 3])" ] }, "execution_count": 53, "metadata": {}, "output_type": "execute_result" } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let x = [1, 2]. Convert it into an array." ] }, { "cell_type": "code", "execution_count": 60, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([1, 2])" ] }, "execution_count": 60, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x = [1,2]\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let X = np.array([[1, 2], [3, 4]]). Convert it into a matrix." ] }, { "cell_type": "code", "execution_count": 62, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "matrix([[1, 2],\n", " [3, 4]])" ] }, "execution_count": 62, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X = np.array([[1, 2], [3, 4]])\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let x = [1, 2]. Conver it into an array of `float`." ] }, { "cell_type": "code", "execution_count": 63, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 1., 2.])" ] }, "execution_count": 63, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x = [1, 2]\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let x = np.array([30]). Convert it into scalar of its single element, i.e. 30." ] }, { "cell_type": "code", "execution_count": 67, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "30" ] }, "execution_count": 67, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x = np.array([30])\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let x = np.array([1, 2, 3]). Create a array copy of x, which has a different id from x." ] }, { "cell_type": "code", "execution_count": 76, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "70140352 [1 2 3]\n", "70140752 [1 2 3]\n" ] } ], "source": [ "x = np.array([1, 2, 3])\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Numerical ranges" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Create an array of 2, 4, 6, 8, ..., 100." ] }, { "cell_type": "code", "execution_count": 85, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26,\n", " 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52,\n", " 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78,\n", " 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100])" ] }, "execution_count": 85, "metadata": {}, "output_type": "execute_result" } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Create a 1-D array of 50 evenly spaced elements between 3. and 10., inclusive." ] }, { "cell_type": "code", "execution_count": 86, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 3. , 3.14285714, 3.28571429, 3.42857143,\n", " 3.57142857, 3.71428571, 3.85714286, 4. ,\n", " 4.14285714, 4.28571429, 4.42857143, 4.57142857,\n", " 4.71428571, 4.85714286, 5. , 5.14285714,\n", " 5.28571429, 5.42857143, 5.57142857, 5.71428571,\n", " 5.85714286, 6. , 6.14285714, 6.28571429,\n", " 6.42857143, 6.57142857, 6.71428571, 6.85714286,\n", " 7. , 7.14285714, 7.28571429, 7.42857143,\n", " 7.57142857, 7.71428571, 7.85714286, 8. ,\n", " 8.14285714, 8.28571429, 8.42857143, 8.57142857,\n", " 8.71428571, 8.85714286, 9. , 9.14285714,\n", " 9.28571429, 9.42857143, 9.57142857, 9.71428571,\n", " 9.85714286, 10. ])" ] }, "execution_count": 86, "metadata": {}, "output_type": "execute_result" } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Create a 1-D array of 50 element spaced evenly on a log scale between 3. and 10., exclusive." ] }, { "cell_type": "code", "execution_count": 88, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 1.00000000e+03, 1.38038426e+03, 1.90546072e+03,\n", " 2.63026799e+03, 3.63078055e+03, 5.01187234e+03,\n", " 6.91830971e+03, 9.54992586e+03, 1.31825674e+04,\n", " 1.81970086e+04, 2.51188643e+04, 3.46736850e+04,\n", " 4.78630092e+04, 6.60693448e+04, 9.12010839e+04,\n", " 1.25892541e+05, 1.73780083e+05, 2.39883292e+05,\n", " 3.31131121e+05, 4.57088190e+05, 6.30957344e+05,\n", " 8.70963590e+05, 1.20226443e+06, 1.65958691e+06,\n", " 2.29086765e+06, 3.16227766e+06, 4.36515832e+06,\n", " 6.02559586e+06, 8.31763771e+06, 1.14815362e+07,\n", " 1.58489319e+07, 2.18776162e+07, 3.01995172e+07,\n", " 4.16869383e+07, 5.75439937e+07, 7.94328235e+07,\n", " 1.09647820e+08, 1.51356125e+08, 2.08929613e+08,\n", " 2.88403150e+08, 3.98107171e+08, 5.49540874e+08,\n", " 7.58577575e+08, 1.04712855e+09, 1.44543977e+09,\n", " 1.99526231e+09, 2.75422870e+09, 3.80189396e+09,\n", " 5.24807460e+09, 7.24435960e+09])" ] }, "execution_count": 88, "metadata": {}, "output_type": "execute_result" } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Building matrices" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let X = np.array([[ 0, 1, 2, 3],\n", " [ 4, 5, 6, 7],\n", " [ 8, 9, 10, 11]]).\n", " Get the diagonal of X, that is, [0, 5, 10]." ] }, { "cell_type": "code", "execution_count": 93, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 0, 5, 10])" ] }, "execution_count": 93, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X = np.array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]])\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Create a 2-D array whose diagonal equals [1, 2, 3, 4] and 0's elsewhere." ] }, { "cell_type": "code", "execution_count": 95, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[1, 0, 0, 0],\n", " [0, 2, 0, 0],\n", " [0, 0, 3, 0],\n", " [0, 0, 0, 4]])" ] }, "execution_count": 95, "metadata": {}, "output_type": "execute_result" } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Create an array which looks like below.\n", "array([[ 0., 0., 0., 0., 0.],\n", " [ 1., 0., 0., 0., 0.],\n", " [ 1., 1., 0., 0., 0.]])" ] }, { "cell_type": "code", "execution_count": 97, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 0., 0., 0., 0., 0.],\n", " [ 1., 0., 0., 0., 0.],\n", " [ 1., 1., 0., 0., 0.]])" ] }, "execution_count": 97, "metadata": {}, "output_type": "execute_result" } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Create an array which looks like below.\n", "array([[ 0, 0, 0],\n", " [ 4, 0, 0],\n", " [ 7, 8, 0],\n", " [10, 11, 12]])" ] }, { "cell_type": "code", "execution_count": 101, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 0, 0, 0],\n", " [ 4, 0, 0],\n", " [ 7, 8, 0],\n", " [10, 11, 12]])" ] }, "execution_count": 101, "metadata": {}, "output_type": "execute_result" } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Create an array which looks like below. array([[ 1, 2, 3],\n", " [ 4, 5, 6],\n", " [ 0, 8, 9],\n", " [ 0, 0, 12]])" ] }, { "cell_type": "code", "execution_count": 102, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 1, 2, 3],\n", " [ 4, 5, 6],\n", " [ 0, 8, 9],\n", " [ 0, 0, 12]])" ] }, "execution_count": 102, "metadata": {}, "output_type": "execute_result" } ], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.6" } }, "nbformat": 4, "nbformat_minor": 1 } ================================================ FILE: 2.numpy/numpy_exercises/1_Array_creation_routines_Solution.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Array creation routines" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Ones and zeros" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import numpy as np" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Create a new array of 2*2 integers, without initializing entries." ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[0, 0],\n", " [0, 0]])" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.empty([2,2], int)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let X = np.array([1,2,3], [4,5,6], np.int32). \n", "Create a new array with the same shape and type as X." ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[1, 2, 3],\n", " [4, 5, 6]])" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X = np.array([[1,2,3], [4,5,6]], np.int32)\n", "np.empty_like(X)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Create a 3-D array with ones on the diagonal and zeros elsewhere." ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 1., 0., 0.],\n", " [ 0., 1., 0.],\n", " [ 0., 0., 1.]])" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.eye(3)" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 1., 0., 0.],\n", " [ 0., 1., 0.],\n", " [ 0., 0., 1.]])" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.identity(3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Create a new array of 3*2 float numbers, filled with ones." ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 1., 1.],\n", " [ 1., 1.],\n", " [ 1., 1.]])" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.ones([3,2], float)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let x = np.arange(4, dtype=np.int64). Create an array of ones with the same shape and type as X." ] }, { "cell_type": "code", "execution_count": 59, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([1, 1, 1, 1], dtype=int64)" ] }, "execution_count": 59, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x = np.arange(4, dtype=np.int64)\n", "np.ones_like(x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Create a new array of 3*2 float numbers, filled with zeros." ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 0., 0.],\n", " [ 0., 0.],\n", " [ 0., 0.]])" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.zeros((3,2), float)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let x = np.arange(4, dtype=np.int64). Create an array of zeros with the same shape and type as X." ] }, { "cell_type": "code", "execution_count": 58, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([0, 0, 0, 0], dtype=int64)" ] }, "execution_count": 58, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x = np.arange(4, dtype=np.int64)\n", "np.zeros_like(x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Create a new array of 2*5 uints, filled with 6." ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[6, 6, 6, 6, 6],\n", " [6, 6, 6, 6, 6]], dtype=uint32)" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.full((2, 5), 6, dtype=np.uint)" ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[6, 6, 6, 6, 6],\n", " [6, 6, 6, 6, 6]], dtype=uint32)" ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.ones([2, 5], dtype=np.uint) * 6" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let x = np.arange(4, dtype=np.int64). Create an array of 6's with the same shape and type as X." ] }, { "cell_type": "code", "execution_count": 79, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([6, 6, 6, 6], dtype=int64)" ] }, "execution_count": 79, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x = np.arange(4, dtype=np.int64)\n", "np.full_like(x, 6)" ] }, { "cell_type": "code", "execution_count": 81, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([6, 6, 6, 6], dtype=int64)" ] }, "execution_count": 81, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.ones_like(x) * 6" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## From existing data" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Create an array of [1, 2, 3]." ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([1, 2, 3])" ] }, "execution_count": 53, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.array([1, 2, 3])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let x = [1, 2]. Convert it into an array." ] }, { "cell_type": "code", "execution_count": 60, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([1, 2])" ] }, "execution_count": 60, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x = [1,2]\n", "np.asarray(x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let X = np.array([[1, 2], [3, 4]]). Convert it into a matrix." ] }, { "cell_type": "code", "execution_count": 62, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "matrix([[1, 2],\n", " [3, 4]])" ] }, "execution_count": 62, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X = np.array([[1, 2], [3, 4]])\n", "np.asmatrix(X)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let x = [1, 2]. Conver it into an array of `float`." ] }, { "cell_type": "code", "execution_count": 63, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 1., 2.])" ] }, "execution_count": 63, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x = [1, 2]\n", "np.asfarray(x)" ] }, { "cell_type": "code", "execution_count": 64, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 1., 2.])" ] }, "execution_count": 64, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.asarray(x, float)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let x = np.array([30]). Convert it into scalar of its single element, i.e. 30." ] }, { "cell_type": "code", "execution_count": 67, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "30" ] }, "execution_count": 67, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x = np.array([30])\n", "np.asscalar(x)" ] }, { "cell_type": "code", "execution_count": 68, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "30" ] }, "execution_count": 68, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x[0]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let x = np.array([1, 2, 3]). Create a array copy of x, which has a different id from x." ] }, { "cell_type": "code", "execution_count": 76, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "70140352 [1 2 3]\n", "70140752 [1 2 3]\n" ] } ], "source": [ "x = np.array([1, 2, 3])\n", "y = np.copy(x)\n", "print id(x), x\n", "print id(y), y" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Numerical ranges" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Create an array of 2, 4, 6, 8, ..., 100." ] }, { "cell_type": "code", "execution_count": 85, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26,\n", " 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52,\n", " 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78,\n", " 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100])" ] }, "execution_count": 85, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.arange(2, 101, 2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Create a 1-D array of 50 evenly spaced elements between 3. and 10., inclusive." ] }, { "cell_type": "code", "execution_count": 86, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 3. , 3.14285714, 3.28571429, 3.42857143,\n", " 3.57142857, 3.71428571, 3.85714286, 4. ,\n", " 4.14285714, 4.28571429, 4.42857143, 4.57142857,\n", " 4.71428571, 4.85714286, 5. , 5.14285714,\n", " 5.28571429, 5.42857143, 5.57142857, 5.71428571,\n", " 5.85714286, 6. , 6.14285714, 6.28571429,\n", " 6.42857143, 6.57142857, 6.71428571, 6.85714286,\n", " 7. , 7.14285714, 7.28571429, 7.42857143,\n", " 7.57142857, 7.71428571, 7.85714286, 8. ,\n", " 8.14285714, 8.28571429, 8.42857143, 8.57142857,\n", " 8.71428571, 8.85714286, 9. , 9.14285714,\n", " 9.28571429, 9.42857143, 9.57142857, 9.71428571,\n", " 9.85714286, 10. ])" ] }, "execution_count": 86, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.linspace(3., 10, 50)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Create a 1-D array of 50 element spaced evenly on a log scale between 3. and 10., exclusive." ] }, { "cell_type": "code", "execution_count": 88, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 1.00000000e+03, 1.38038426e+03, 1.90546072e+03,\n", " 2.63026799e+03, 3.63078055e+03, 5.01187234e+03,\n", " 6.91830971e+03, 9.54992586e+03, 1.31825674e+04,\n", " 1.81970086e+04, 2.51188643e+04, 3.46736850e+04,\n", " 4.78630092e+04, 6.60693448e+04, 9.12010839e+04,\n", " 1.25892541e+05, 1.73780083e+05, 2.39883292e+05,\n", " 3.31131121e+05, 4.57088190e+05, 6.30957344e+05,\n", " 8.70963590e+05, 1.20226443e+06, 1.65958691e+06,\n", " 2.29086765e+06, 3.16227766e+06, 4.36515832e+06,\n", " 6.02559586e+06, 8.31763771e+06, 1.14815362e+07,\n", " 1.58489319e+07, 2.18776162e+07, 3.01995172e+07,\n", " 4.16869383e+07, 5.75439937e+07, 7.94328235e+07,\n", " 1.09647820e+08, 1.51356125e+08, 2.08929613e+08,\n", " 2.88403150e+08, 3.98107171e+08, 5.49540874e+08,\n", " 7.58577575e+08, 1.04712855e+09, 1.44543977e+09,\n", " 1.99526231e+09, 2.75422870e+09, 3.80189396e+09,\n", " 5.24807460e+09, 7.24435960e+09])" ] }, "execution_count": 88, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.logspace(3., 10., 50, endpoint=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Building matrices" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let X = np.array([[ 0, 1, 2, 3],\n", " [ 4, 5, 6, 7],\n", " [ 8, 9, 10, 11]]).\n", " Get the diagonal of X, that is, [0, 5, 10]." ] }, { "cell_type": "code", "execution_count": 93, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 0, 5, 10])" ] }, "execution_count": 93, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X = np.array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]])\n", "np.diag(X)" ] }, { "cell_type": "code", "execution_count": 94, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 0, 5, 10])" ] }, "execution_count": 94, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X.diagonal()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Create a 2-D array whose diagonal equals [1, 2, 3, 4] and 0's elsewhere." ] }, { "cell_type": "code", "execution_count": 95, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[1, 0, 0, 0],\n", " [0, 2, 0, 0],\n", " [0, 0, 3, 0],\n", " [0, 0, 0, 4]])" ] }, "execution_count": 95, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.diagflat([1, 2, 3, 4])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Create an array which looks like below.\n", "array([[ 0., 0., 0., 0., 0.],\n", " [ 1., 0., 0., 0., 0.],\n", " [ 1., 1., 0., 0., 0.]])" ] }, { "cell_type": "code", "execution_count": 97, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 0., 0., 0., 0., 0.],\n", " [ 1., 0., 0., 0., 0.],\n", " [ 1., 1., 0., 0., 0.]])" ] }, "execution_count": 97, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.tri(3, 5, -1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Create an array which looks like below.\n", "array([[ 0, 0, 0],\n", " [ 4, 0, 0],\n", " [ 7, 8, 0],\n", " [10, 11, 12]])" ] }, { "cell_type": "code", "execution_count": 101, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 0, 0, 0],\n", " [ 4, 0, 0],\n", " [ 7, 8, 0],\n", " [10, 11, 12]])" ] }, "execution_count": 101, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.tril(np.arange(1, 13).reshape(4, 3), -1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Create an array which looks like below. array([[ 1, 2, 3],\n", " [ 4, 5, 6],\n", " [ 0, 8, 9],\n", " [ 0, 0, 12]])" ] }, { "cell_type": "code", "execution_count": 102, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 1, 2, 3],\n", " [ 4, 5, 6],\n", " [ 0, 8, 9],\n", " [ 0, 0, 12]])" ] }, "execution_count": 102, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.triu(np.arange(1, 13).reshape(4, 3), -1)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.6" } }, "nbformat": 4, "nbformat_minor": 1 } ================================================ FILE: 2.numpy/numpy_exercises/2_Array_manipulation_routines.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Array manipulation routines" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import numpy as np" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'1.11.2'" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.__version__" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "Q1. Let x be a ndarray [10, 10, 3] with all elements set to one. Reshape x so that the size of the second dimension equals 150." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[ 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.\n", " 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.\n", " 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.\n", " 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.\n", " 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.\n", " 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.\n", " 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.\n", " 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.\n", " 1. 1. 1. 1. 1. 1.]\n", " [ 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.\n", " 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.\n", " 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.\n", " 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.\n", " 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.\n", " 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.\n", " 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.\n", " 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.\n", " 1. 1. 1. 1. 1. 1.]]\n" ] } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q2. Let x be array [[1, 2, 3], [4, 5, 6]]. Convert it to [1 4 2 5 3 6]." ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1 4 2 5 3 6]\n" ] } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q3. Let x be array [[1, 2, 3], [4, 5, 6]]. Get the 5th element." ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "5\n" ] } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q4. Let x be an arbitrary 3-D array of shape (3, 4, 5). Permute the dimensions of x such that the new shape will be (4,3,5).\n" ] }, { "cell_type": "code", "execution_count": 36, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(4L, 3L, 5L)\n" ] } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q5. Let x be an arbitrary 2-D array of shape (3, 4). Permute the dimensions of x such that the new shape will be (4,3)." ] }, { "cell_type": "code", "execution_count": 38, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(4L, 3L)\n" ] } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q5. Let x be an arbitrary 2-D array of shape (3, 4). Insert a nex axis such that the new shape will be (3, 1, 4)." ] }, { "cell_type": "code", "execution_count": 42, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(3L, 1L, 4L)\n" ] } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q6. Let x be an arbitrary 3-D array of shape (3, 4, 1). Remove a single-dimensional entries such that the new shape will be (3, 4)." ] }, { "cell_type": "code", "execution_count": 43, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(3L, 4L)\n" ] } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q7. Lex x be an array
\n", "[[ 1 2 3]
\n", "[ 4 5 6].

\n", "and y be an array
\n", "[[ 7 8 9]
\n", "[10 11 12]].
\n", "Concatenate x and y so that a new array looks like
[[1, 2, 3, 7, 8, 9],
[4, 5, 6, 10, 11, 12]].\n" ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[ 1 2 3 7 8 9]\n", " [ 4 5 6 10 11 12]]\n" ] } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q8. Lex x be an array
\n", "[[ 1 2 3]
\n", "[ 4 5 6].

\n", "and y be an array
\n", "[[ 7 8 9]
\n", "[10 11 12]].
\n", "Concatenate x and y so that a new array looks like
[[ 1 2 3]
\n", " [ 4 5 6]
\n", " [ 7 8 9]
\n", " [10 11 12]]\n" ] }, { "cell_type": "code", "execution_count": 38, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[ 1 2 3]\n", " [ 4 5 6]\n", " [ 7 8 9]\n", " [10 11 12]]\n" ] } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q8. Let x be an array [1 2 3] and y be [4 5 6]. Convert it to [[1, 4], [2, 5], [3, 6]]." ] }, { "cell_type": "code", "execution_count": 54, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[1 4]\n", " [2 5]\n", " [3 6]]\n" ] } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q9. Let x be an array [[1],[2],[3]] and y be [[4], [5], [6]]. Convert x to [[[1, 4]], [[2, 5]], [[3, 6]]]." ] }, { "cell_type": "code", "execution_count": 34, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[[1 4]]\n", "\n", " [[2 5]]\n", "\n", " [[3 6]]]\n" ] } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q10. Let x be an array [1, 2, 3, ..., 9]. Split x into 3 arrays, each of which has 4, 2, and 3 elements in the original order." ] }, { "cell_type": "code", "execution_count": 62, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[array([1, 2, 3, 4]), array([5, 6]), array([7, 8, 9])]\n" ] } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q11. Let x be an array
\n", "[[[ 0., 1., 2., 3.],
\n", " [ 4., 5., 6., 7.]],
\n", " \n", " [[ 8., 9., 10., 11.],
\n", " [ 12., 13., 14., 15.]]].
\n", "Split it into two such that the first array looks like
\n", "[[[ 0., 1., 2.],
\n", " [ 4., 5., 6.]],
\n", " \n", " [[ 8., 9., 10.],
\n", " [ 12., 13., 14.]]].
\n", " \n", "and the second one look like:
\n", " \n", "[[[ 3.],
\n", " [ 7.]],
\n", " \n", " [[ 11.],
\n", " [ 15.]]].
" ] }, { "cell_type": "code", "execution_count": 72, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[array([[[ 0, 1, 2],\n", " [ 4, 5, 6]],\n", "\n", " [[ 8, 9, 10],\n", " [12, 13, 14]]]), array([[[ 3],\n", " [ 7]],\n", "\n", " [[11],\n", " [15]]])]\n" ] } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q12. Let x be an array
\n", "[[ 0., 1., 2., 3.],
\n", " [ 4., 5., 6., 7.],
\n", " [ 8., 9., 10., 11.],
\n", " [ 12., 13., 14., 15.]].
\n", "Split it into two arrays along the second axis." ] }, { "cell_type": "code", "execution_count": 74, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[array([[ 0, 1],\n", " [ 4, 5],\n", " [ 8, 9],\n", " [12, 13]]), array([[ 2, 3],\n", " [ 6, 7],\n", " [10, 11],\n", " [14, 15]])]\n" ] } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q13. Let x be an array
\n", "[[ 0., 1., 2., 3.],
\n", " [ 4., 5., 6., 7.],
\n", " [ 8., 9., 10., 11.],
\n", " [ 12., 13., 14., 15.]].
\n", "Split it into two arrays along the first axis." ] }, { "cell_type": "code", "execution_count": 75, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[array([[0, 1, 2, 3],\n", " [4, 5, 6, 7]]), array([[ 8, 9, 10, 11],\n", " [12, 13, 14, 15]])]\n" ] } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q14. Let x be an array [0, 1, 2]. Convert it to
\n", "[[0, 1, 2, 0, 1, 2],
\n", " [0, 1, 2, 0, 1, 2]]." ] }, { "cell_type": "code", "execution_count": 93, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[0 1 2 0 1 2]\n", " [0 1 2 0 1 2]]\n" ] } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q15. Let x be an array [0, 1, 2]. Convert it to
\n", "[0, 0, 1, 1, 2, 2]." ] }, { "cell_type": "code", "execution_count": 83, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0 0 1 1 2 2]\n" ] } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q16. Let x be an array [0, 0, 0, 1, 2, 3, 0, 2, 1, 0].
\n", "remove the leading the trailing zeros." ] }, { "cell_type": "code", "execution_count": 105, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1 2 3 0 2 1]\n" ] } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q17. Let x be an array [2, 2, 1, 5, 4, 5, 1, 2, 3]. Get two arrays of unique elements and their counts.\n" ] }, { "cell_type": "code", "execution_count": 107, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1 2 3 4 5] [2 3 1 1 2]\n" ] } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q18. Lex x be an array
\n", "[[ 1 2]
\n", " [ 3 4].
\n", "Flip x along the second axis." ] }, { "cell_type": "code", "execution_count": 120, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[2 1]\n", " [4 3]]\n" ] } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q19. Lex x be an array
\n", "[[ 1 2]
\n", " [ 3 4].
\n", "Flip x along the first axis." ] }, { "cell_type": "code", "execution_count": 121, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[3 4]\n", " [1 2]]\n" ] } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q20. Lex x be an array
\n", "[[ 1 2]
\n", " [ 3 4].
\n", "Rotate x 90 degrees counter-clockwise." ] }, { "cell_type": "code", "execution_count": 122, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[2 4]\n", " [1 3]]\n" ] } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q21 Lex x be an array
\n", "[[ 1 2 3 4]
\n", " [ 5 6 7 8].
\n", "Shift elements one step to right along the second axis." ] }, { "cell_type": "code", "execution_count": 126, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[4 1 2 3]\n", " [8 5 6 7]]\n" ] } ], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.10" } }, "nbformat": 4, "nbformat_minor": 0 } ================================================ FILE: 2.numpy/numpy_exercises/2_Array_manipulation_routines_Solutions.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Array manipulation routines" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import numpy as np" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'1.11.2'" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.__version__" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "Q1. Let x be a ndarray [10, 10, 3] with all elements set to one. Reshape x so that the size of the second dimension equals 150." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[ 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.\n", " 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.\n", " 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.\n", " 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.\n", " 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.\n", " 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.\n", " 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.\n", " 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.\n", " 1. 1. 1. 1. 1. 1.]\n", " [ 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.\n", " 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.\n", " 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.\n", " 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.\n", " 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.\n", " 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.\n", " 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.\n", " 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.\n", " 1. 1. 1. 1. 1. 1.]]\n" ] } ], "source": [ "x = np.ones([10, 10, 3])\n", "out = np.reshape(x, [-1, 150])\n", "print out\n", "assert np.allclose(out, np.ones([10, 10, 3]).reshape([-1, 150]))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q2. Let x be array [[1, 2, 3], [4, 5, 6]]. Convert it to [1 4 2 5 3 6]." ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1 4 2 5 3 6]\n" ] } ], "source": [ "x = np.array([[1, 2, 3], [4, 5, 6]])\n", "out1 = np.ravel(x, order='F')\n", "out2 = x.flatten(order=\"F\")\n", "assert np.allclose(out1, out2)\n", "print out1\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q3. Let x be array [[1, 2, 3], [4, 5, 6]]. Get the 5th element." ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "5\n" ] } ], "source": [ "x = np.array([[1, 2, 3], [4, 5, 6]])\n", "out1 = x.flat[4]\n", "out2 = np.ravel(x)[4]\n", "assert np.allclose(out1, out2)\n", "print out1\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q4. Let x be an arbitrary 3-D array of shape (3, 4, 5). Permute the dimensions of x such that the new shape will be (4,3,5).\n" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(4L, 3L, 5L)\n" ] } ], "source": [ "x = np.zeros((3, 4, 5))\n", "out1 = np.swapaxes(x, 1, 0)\n", "out2 = x.transpose([1, 0, 2])\n", "assert out1.shape == out2.shape\n", "print out1.shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q5. Let x be an arbitrary 2-D array of shape (3, 4). Permute the dimensions of x such that the new shape will be (4,3)." ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(4L, 3L)\n" ] } ], "source": [ "x = np.zeros((3, 4))\n", "out1 = np.swapaxes(x, 1, 0)\n", "out2 = x.transpose()\n", "out3 = x.T\n", "assert out1.shape == out2.shape == out3.shape\n", "print out1.shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q5. Let x be an arbitrary 2-D array of shape (3, 4). Insert a nex axis such that the new shape will be (3, 1, 4)." ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(3L, 1L, 4L)\n" ] } ], "source": [ "x = np.zeros((3, 4))\n", "print np.expand_dims(x, axis=1).shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q6. Let x be an arbitrary 3-D array of shape (3, 4, 1). Remove a single-dimensional entries such that the new shape will be (3, 4)." ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(3L, 4L)\n" ] } ], "source": [ "x = np.zeros((3, 4, 1))\n", "print np.squeeze(x).shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q7. Lex x be an array
\n", "[[ 1 2 3]
\n", "[ 4 5 6].

\n", "and y be an array
\n", "[[ 7 8 9]
\n", "[10 11 12]].
\n", "Concatenate x and y so that a new array looks like
[[1, 2, 3, 7, 8, 9],
[4, 5, 6, 10, 11, 12]].\n" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[ 1 2 3 7 8 9]\n", " [ 4 5 6 10 11 12]]\n" ] } ], "source": [ "x = np.array([[1, 2, 3], [4, 5, 6]])\n", "y = np.array([[7, 8, 9], [10, 11, 12]])\n", "out1 = np.concatenate((x, y), 1)\n", "out2 = np.hstack((x, y))\n", "assert np.allclose(out1, out2)\n", "print out2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q8. Lex x be an array
\n", "[[ 1 2 3]
\n", "[ 4 5 6].

\n", "and y be an array
\n", "[[ 7 8 9]
\n", "[10 11 12]].
\n", "Concatenate x and y so that a new array looks like
[[ 1 2 3]
\n", " [ 4 5 6]
\n", " [ 7 8 9]
\n", " [10 11 12]]\n" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[ 1 2 3]\n", " [ 4 5 6]\n", " [ 7 8 9]\n", " [10 11 12]]\n" ] } ], "source": [ "x = np.array([[1, 2, 3], [4, 5, 6]])\n", "y = np.array([[7, 8, 9], [10, 11, 12]])\n", "out1 = np.concatenate((x, y), 0)\n", "out2 = np.vstack((x, y))\n", "assert np.allclose(out1, out2)\n", "print out2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q8. Let x be an array [1 2 3] and y be [4 5 6]. Convert it to [[1, 4], [2, 5], [3, 6]]." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[1, 4],\n", " [2, 5],\n", " [3, 6]])" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x = np.array((1,2,3))\n", "y = np.array((4,5,6))\n", "out1 = np.column_stack((x, y))\n", "out2 = np.squeeze(np.dstack((x, y)))\n", "out3 = np.vstack((x, y)).T\n", "assert np.allclose(out1, out2)\n", "assert np.allclose(out2, out3)\n", "print out1\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q9. Let x be an array [[1],[2],[3]] and y be [[4], [5], [6]]. Convert x to [[[1, 4]], [[2, 5]], [[3, 6]]]." ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[[1 4]]\n", "\n", " [[2 5]]\n", "\n", " [[3 6]]]\n" ] } ], "source": [ "x = np.array([[1],[2],[3]])\n", "y = np.array([[4],[5],[6]])\n", "out = np.dstack((x, y))\n", "print out\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q10. Let x be an array [1, 2, 3, ..., 9]. Split x into 3 arrays, each of which has 4, 2, and 3 elements in the original order." ] }, { "cell_type": "code", "execution_count": 62, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[array([1, 2, 3, 4]), array([5, 6]), array([7, 8, 9])]\n" ] } ], "source": [ "x = np.arange(1, 10)\n", "print np.split(x, [4, 6])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q11. Let x be an array
\n", "[[[ 0., 1., 2., 3.],
\n", " [ 4., 5., 6., 7.]],
\n", " \n", " [[ 8., 9., 10., 11.],
\n", " [ 12., 13., 14., 15.]]].
\n", "Split it into two such that the first array looks like
\n", "[[[ 0., 1., 2.],
\n", " [ 4., 5., 6.]],
\n", " \n", " [[ 8., 9., 10.],
\n", " [ 12., 13., 14.]]].
\n", " \n", "and the second one look like:
\n", " \n", "[[[ 3.],
\n", " [ 7.]],
\n", " \n", " [[ 11.],
\n", " [ 15.]]].
" ] }, { "cell_type": "code", "execution_count": 72, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[array([[[ 0, 1, 2],\n", " [ 4, 5, 6]],\n", "\n", " [[ 8, 9, 10],\n", " [12, 13, 14]]]), array([[[ 3],\n", " [ 7]],\n", "\n", " [[11],\n", " [15]]])]\n" ] } ], "source": [ "x = np.arange(16).reshape(2, 2, 4)\n", "out1 = np.split(x, [3],axis=2)\n", "out2 = np.dsplit(x, [3])\n", "assert np.allclose(out1[0], out2[0])\n", "assert np.allclose(out1[1], out2[1])\n", "print out1\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q12. Let x be an array
\n", "[[ 0., 1., 2., 3.],
\n", " [ 4., 5., 6., 7.],
\n", " [ 8., 9., 10., 11.],
\n", " [ 12., 13., 14., 15.]].
\n", "Split it into two arrays along the second axis." ] }, { "cell_type": "code", "execution_count": 74, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[array([[ 0, 1],\n", " [ 4, 5],\n", " [ 8, 9],\n", " [12, 13]]), array([[ 2, 3],\n", " [ 6, 7],\n", " [10, 11],\n", " [14, 15]])]\n" ] } ], "source": [ "x = np.arange(16).reshape((4, 4))\n", "out1 = np.hsplit(x, 2)\n", "out2 = np.split(x, 2, 1)\n", "assert np.allclose(out1[0], out2[0])\n", "assert np.allclose(out1[1], out2[1])\n", "print out1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q13. Let x be an array
\n", "[[ 0., 1., 2., 3.],
\n", " [ 4., 5., 6., 7.],
\n", " [ 8., 9., 10., 11.],
\n", " [ 12., 13., 14., 15.]].
\n", "Split it into two arrays along the first axis." ] }, { "cell_type": "code", "execution_count": 75, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[array([[0, 1, 2, 3],\n", " [4, 5, 6, 7]]), array([[ 8, 9, 10, 11],\n", " [12, 13, 14, 15]])]\n" ] } ], "source": [ "x = np.arange(16).reshape((4, 4))\n", "out1 = np.vsplit(x, 2)\n", "out2 = np.split(x, 2, 0)\n", "assert np.allclose(out1[0], out2[0])\n", "assert np.allclose(out1[1], out2[1])\n", "print out1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q14. Let x be an array [0, 1, 2]. Convert it to
\n", "[[0, 1, 2, 0, 1, 2],
\n", " [0, 1, 2, 0, 1, 2]]." ] }, { "cell_type": "code", "execution_count": 93, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[0 1 2 0 1 2]\n", " [0 1 2 0 1 2]]\n" ] } ], "source": [ "x = np.array([0, 1, 2])\n", "out1 = np.tile(x, [2, 2])\n", "out2 = np.resize(x, [2, 6])\n", "assert np.allclose(out1, out2)\n", "print out1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q15. Let x be an array [0, 1, 2]. Convert it to
\n", "[0, 0, 1, 1, 2, 2]." ] }, { "cell_type": "code", "execution_count": 83, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0 0 1 1 2 2]\n" ] } ], "source": [ "x = np.array([0, 1, 2])\n", "print np.repeat(x, 2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q16. Let x be an array [0, 0, 0, 1, 2, 3, 0, 2, 1, 0].
\n", "remove the leading the trailing zeros." ] }, { "cell_type": "code", "execution_count": 105, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1 2 3 0 2 1]\n" ] } ], "source": [ "x = np.array((0, 0, 0, 1, 2, 3, 0, 2, 1, 0))\n", "out = np.trim_zeros(x)\n", "print out" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q17. Let x be an array [2, 2, 1, 5, 4, 5, 1, 2, 3]. Get two arrays of unique elements and their counts.\n" ] }, { "cell_type": "code", "execution_count": 107, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1 2 3 4 5] [2 3 1 1 2]\n" ] } ], "source": [ "x = np.array([2, 2, 1, 5, 4, 5, 1, 2, 3])\n", "u, indices = np.unique(x, return_counts=True)\n", "print u, indices" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q18. Lex x be an array
\n", "[[ 1 2]
\n", " [ 3 4].
\n", "Flip x along the second axis." ] }, { "cell_type": "code", "execution_count": 120, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[2 1]\n", " [4 3]]\n" ] } ], "source": [ "x = np.array([[1,2], [3,4]])\n", "out1 = np.fliplr(x)\n", "out2 = x[:, ::-1]\n", "assert np.allclose(out1, out2)\n", "print out1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q19. Lex x be an array
\n", "[[ 1 2]
\n", " [ 3 4].
\n", "Flip x along the first axis." ] }, { "cell_type": "code", "execution_count": 121, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[3 4]\n", " [1 2]]\n" ] } ], "source": [ "x = np.array([[1,2], [3,4]])\n", "out1 = np.flipud(x)\n", "out2 = x[::-1, :]\n", "assert np.allclose(out1, out2)\n", "print out1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q20. Lex x be an array
\n", "[[ 1 2]
\n", " [ 3 4].
\n", "Rotate x 90 degrees counter-clockwise." ] }, { "cell_type": "code", "execution_count": 122, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[2 4]\n", " [1 3]]\n" ] } ], "source": [ "x = np.array([[1,2], [3,4]])\n", "out = np.rot90(x)\n", "print out" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q21 Lex x be an array
\n", "[[ 1 2 3 4]
\n", " [ 5 6 7 8].
\n", "Shift elements one step to right along the second axis." ] }, { "cell_type": "code", "execution_count": 126, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[4 1 2 3]\n", " [8 5 6 7]]\n" ] } ], "source": [ "x = np.arange(1, 9).reshape([2, 4])\n", "print np.roll(x, 1, axis=1)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.1" } }, "nbformat": 4, "nbformat_minor": 1 } ================================================ FILE: 2.numpy/numpy_exercises/3_String_operations.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## String operations" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from __future__ import print_function\n", "import numpy as np" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "author = \"kyubyong. https://github.com/Kyubyong/numpy_exercises\"" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'1.11.3'" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.__version__" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q1. Concatenate x1 and x2." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['Hello world' 'Say something']\n" ] } ], "source": [ "x1 = np.array(['Hello', 'Say'], dtype=np.str)\n", "x2 = np.array([' world', ' something'], dtype=np.str)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q2. Repeat x three time element-wise." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['Hello Hello Hello ' 'Say Say Say ']\n" ] } ], "source": [ "x = np.array(['Hello ', 'Say '], dtype=np.str)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q3-1. Capitalize the first letter of x element-wise.
\n", "Q3-2. Lowercase x element-wise.
\n", "Q3-3. Uppercase x element-wise.
\n", "Q3-4. Swapcase x element-wise.
\n", "Q3-5. Title-case x element-wise.
" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "capitalized = ['Hello world' 'Say something']\n", "lowered = ['hello world' 'say something']\n", "uppered = ['HELLO WORLD' 'SAY SOMETHING']\n", "swapcased = ['HEllO WOrlD' 'sAY SoMETHING']\n", "titlecased = ['Hello World' 'Say Something']\n" ] } ], "source": [ "x = np.array(['heLLo woRLd', 'Say sOmething'], dtype=np.str)\n", "capitalized = ...\n", "lowered = ...\n", "uppered = ...\n", "swapcased = ...\n", "titlecased = ...\n", "print(\"capitalized =\", capitalized)\n", "print(\"lowered =\", lowered)\n", "print(\"uppered =\", uppered)\n", "print(\"swapcased =\", swapcased)\n", "print(\"titlecased =\", titlecased)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q4. Make the length of each element 20 and the string centered / left-justified / right-justified with paddings of `_`." ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "centered = ['____hello world_____' '___say something____']\n", "left = ['hello world_________' 'say something_______']\n", "right = ['_________hello world' '_______say something']\n" ] } ], "source": [ "x = np.array(['hello world', 'say something'], dtype=np.str)\n", "centered = ...\n", "left = ...\n", "right = ...\n", "\n", "print(\"centered =\", centered)\n", "print(\"left =\", left)\n", "print(\"right =\", right)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q5. Encode x in cp500 and decode it again." ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "encoded = [b'\\x88\\x85\\x93\\x93\\x96@\\xa6\\x96\\x99\\x93\\x84'\n", " b'\\xa2\\x81\\xa8@\\xa2\\x96\\x94\\x85\\xa3\\x88\\x89\\x95\\x87']\n", "decoded = ['hello world' 'say something']\n" ] } ], "source": [ "x = np.array(['hello world', 'say something'], dtype=np.str)\n", "encoded = ...\n", "decoded = ...\n", "print(\"encoded =\", encoded)\n", "print(\"decoded =\", decoded)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q6. Insert a space between characters of x." ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['h e l l o w o r l d' 's a y s o m e t h i n g']\n" ] } ], "source": [ "x = np.array(['hello world', 'say something'], dtype=np.str)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q7-1. Remove the leading and trailing whitespaces of x element-wise.
\n", "Q7-2. Remove the leading whitespaces of x element-wise.
\n", "Q7-3. Remove the trailing whitespaces of x element-wise." ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "stripped = ['hello world' 'say something']\n", "lstripped = ['hello world ' 'say something\\n']\n", "rstripped = [' hello world' '\\tsay something']\n" ] } ], "source": [ "x = np.array([' hello world ', '\\tsay something\\n'], dtype=np.str)\n", "stripped = ...\n", "lstripped = ...\n", "rstripped = ...\n", "print(\"stripped =\", stripped)\n", "print(\"lstripped =\", lstripped)\n", "print(\"rstripped =\", rstripped)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q8. Split the element of x with spaces." ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[['Hello', 'my', 'name', 'is', 'John']]\n" ] } ], "source": [ "x = np.array(['Hello my name is John'], dtype=np.str)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q9. Split the element of x to multiple lines." ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[['Hello', 'my name is John']]\n" ] } ], "source": [ "x = np.array(['Hello\\nmy name is John'], dtype=np.str)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q10. Make x a numeric string of 4 digits with zeros on its left." ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['0034']\n" ] } ], "source": [ "x = np.array(['34'], dtype=np.str)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q11. Replace \"John\" with \"Jim\" in x." ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['Hello nmy name is Jim']\n" ] } ], "source": [ "x = np.array(['Hello nmy name is John'], dtype=np.str)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Comparison" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q12. Return x1 == x2, element-wise." ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ True True True True False]\n" ] } ], "source": [ "x1 = np.array(['Hello', 'my', 'name', 'is', 'John'], dtype=np.str)\n", "x2 = np.array(['Hello', 'my', 'name', 'is', 'Jim'], dtype=np.str)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q13. Return x1 != x2, element-wise." ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[False False False False True]\n" ] } ], "source": [ "x1 = np.array(['Hello', 'my', 'name', 'is', 'John'], dtype=np.str)\n", "x2 = np.array(['Hello', 'my', 'name', 'is', 'Jim'], dtype=np.str)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## String information" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q14. Count the number of \"l\" in x, element-wise." ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[2 0 0 0 1]\n" ] } ], "source": [ "x = np.array(['Hello', 'my', 'name', 'is', 'Lily'], dtype=np.str)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q15. Count the lowest index of \"l\" in x, element-wise." ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 2 -1 -1 -1 2]\n" ] } ], "source": [ "x = np.array(['Hello', 'my', 'name', 'is', 'Lily'], dtype=np.str)\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q16-1. Check if each element of x is composed of digits only.
\n", "Q16-2. Check if each element of x is composed of lower case letters only.
\n", "Q16-3. Check if each element of x is composed of upper case letters only." ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Digits only = [False False False True False False]\n", "Lower cases only = [False False True False True True]\n", "Upper cases only = [False True False False False False]\n" ] } ], "source": [ "x = np.array(['Hello', 'I', 'am', '20', 'years', 'old'], dtype=np.str)\n", "out1 = ...\n", "out2 = ...\n", "out3 = ...\n", "print(\"Digits only =\", out1)\n", "print(\"Lower cases only =\", out2)\n", "print(\"Upper cases only =\", out3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q17. Check if each element of x starts with \"hi\"." ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[False True True True]\n" ] } ], "source": [ "x = np.array(['he', 'his', 'him', 'his'], dtype=np.str)\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "anaconda-cloud": {}, "kernelspec": { "display_name": "Python [conda root]", "language": "python", "name": "conda-root-py" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.2" } }, "nbformat": 4, "nbformat_minor": 1 } ================================================ FILE: 2.numpy/numpy_exercises/3_String_operations_solutions.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## String operations" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from __future__ import print_function\n", "import numpy as np" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "author = \"kyubyong. https://github.com/Kyubyong/numpy_exercises\"" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'1.11.3'" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.__version__" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q1. Concatenate x1 and x2." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['Hello world' 'Say something']\n" ] } ], "source": [ "x1 = np.array(['Hello', 'Say'], dtype=np.str)\n", "x2 = np.array([' world', ' something'], dtype=np.str)\n", "out = np.char.add(x1, x2)\n", "print(out)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q2. Repeat x three time element-wise." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['Hello Hello Hello ' 'Say Say Say ']\n" ] } ], "source": [ "x = np.array(['Hello ', 'Say '], dtype=np.str)\n", "out = np.char.multiply(x, 3)\n", "print(out)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q3-1. Capitalize the first letter of x element-wise.
\n", "Q3-2. Lowercase x element-wise.
\n", "Q3-3. Uppercase x element-wise.
\n", "Q3-4. Swapcase x element-wise.
\n", "Q3-5. Title-case x element-wise.
" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "capitalized = ['Hello world' 'Say something']\n", "lowered = ['hello world' 'say something']\n", "uppered = ['HELLO WORLD' 'SAY SOMETHING']\n", "swapcased = ['HEllO WOrlD' 'sAY SoMETHING']\n", "titlecased = ['Hello World' 'Say Something']\n" ] } ], "source": [ "x = np.array(['heLLo woRLd', 'Say sOmething'], dtype=np.str)\n", "capitalized = np.char.capitalize(x)\n", "lowered = np.char.lower(x)\n", "uppered = np.char.upper(x)\n", "swapcased = np.char.swapcase(x)\n", "titlecased = np.char.title(x)\n", "print(\"capitalized =\", capitalized)\n", "print(\"lowered =\", lowered)\n", "print(\"uppered =\", uppered)\n", "print(\"swapcased =\", swapcased)\n", "print(\"titlecased =\", titlecased)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q4. Make the length of each element 20 and the string centered / left-justified / right-justified with paddings of `_`." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "centered = ['____hello world_____' '___say something____']\n", "left = ['hello world_________' 'say something_______']\n", "right = ['_________hello world' '_______say something']\n" ] } ], "source": [ "x = np.array(['hello world', 'say something'], dtype=np.str)\n", "centered = np.char.center(x, 20, fillchar='_')\n", "left = np.char.ljust(x, 20, fillchar='_')\n", "right = np.char.rjust(x, 20, fillchar='_')\n", "\n", "print(\"centered =\", centered)\n", "print(\"left =\", left)\n", "print(\"right =\", right)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q5. Encode x in cp500 and decode it again." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "encoded = [b'\\x88\\x85\\x93\\x93\\x96@\\xa6\\x96\\x99\\x93\\x84'\n", " b'\\xa2\\x81\\xa8@\\xa2\\x96\\x94\\x85\\xa3\\x88\\x89\\x95\\x87']\n", "decoded = ['hello world' 'say something']\n" ] } ], "source": [ "x = np.array(['hello world', 'say something'], dtype=np.str)\n", "encoded = np.char.encode(x, 'cp500')\n", "decoded = np.char.decode(encoded,'cp500')\n", "print(\"encoded =\", encoded)\n", "print(\"decoded =\", decoded)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q6. Insert a space between characters of x." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['h e l l o w o r l d' 's a y s o m e t h i n g']\n" ] } ], "source": [ "x = np.array(['hello world', 'say something'], dtype=np.str)\n", "out = np.char.join(\" \", x)\n", "print(out)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q7-1. Remove the leading and trailing whitespaces of x element-wise.
\n", "Q7-2. Remove the leading whitespaces of x element-wise.
\n", "Q7-3. Remove the trailing whitespaces of x element-wise." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "stripped = ['hello world' 'say something']\n", "lstripped = ['hello world ' 'say something\\n']\n", "rstripped = [' hello world' '\\tsay something']\n" ] } ], "source": [ "x = np.array([' hello world ', '\\tsay something\\n'], dtype=np.str)\n", "stripped = np.char.strip(x)\n", "lstripped = np.char.lstrip(x)\n", "rstripped = np.char.rstrip(x)\n", "print(\"stripped =\", stripped)\n", "print(\"lstripped =\", lstripped)\n", "print(\"rstripped =\", rstripped)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q8. Split the element of x with spaces." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[['Hello', 'my', 'name', 'is', 'John']]\n" ] } ], "source": [ "x = np.array(['Hello my name is John'], dtype=np.str)\n", "out = np.char.split(x)\n", "print(out)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q9. Split the element of x to multiple lines." ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[['Hello', 'my name is John']]\n" ] } ], "source": [ "x = np.array(['Hello\\nmy name is John'], dtype=np.str)\n", "out = np.char.splitlines(x)\n", "print(out)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q10. Make x a numeric string of 4 digits with zeros on its left." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['0034']\n" ] } ], "source": [ "x = np.array(['34'], dtype=np.str)\n", "out = np.char.zfill(x, 4)\n", "print(out)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q11. Replace \"John\" with \"Jim\" in x." ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['Hello nmy name is Jim']\n" ] } ], "source": [ "x = np.array(['Hello nmy name is John'], dtype=np.str)\n", "out = np.char.replace(x, \"John\", \"Jim\")\n", "print(out)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Comparison" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q12. Return x1 == x2, element-wise." ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ True True True True False]\n" ] } ], "source": [ "x1 = np.array(['Hello', 'my', 'name', 'is', 'John'], dtype=np.str)\n", "x2 = np.array(['Hello', 'my', 'name', 'is', 'Jim'], dtype=np.str)\n", "out = np.char.equal(x1, x2)\n", "print(out)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q13. Return x1 != x2, element-wise." ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[False False False False True]\n" ] } ], "source": [ "x1 = np.array(['Hello', 'my', 'name', 'is', 'John'], dtype=np.str)\n", "x2 = np.array(['Hello', 'my', 'name', 'is', 'Jim'], dtype=np.str)\n", "out = np.char.not_equal(x1, x2)\n", "print(out)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## String information" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q14. Count the number of \"l\" in x, element-wise." ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[2 0 0 0 1]\n" ] } ], "source": [ "x = np.array(['Hello', 'my', 'name', 'is', 'Lily'], dtype=np.str)\n", "out = np.char.count(x, \"l\")\n", "print(out)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q15. Count the lowest index of \"l\" in x, element-wise." ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 2 -1 -1 -1 2]\n" ] } ], "source": [ "x = np.array(['Hello', 'my', 'name', 'is', 'Lily'], dtype=np.str)\n", "out = np.char.find(x, \"l\")\n", "print(out)\n", "\n", "# compare\n", "# print(np.char.index(x, \"l\"))\n", "# => This raises an error!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q16-1. Check if each element of x is composed of digits only.
\n", "Q16-2. Check if each element of x is composed of lower case letters only.
\n", "Q16-3. Check if each element of x is composed of upper case letters only." ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Digits only = [False False False True False False]\n", "Lower cases only = [False False True False True True]\n", "Upper cases only = [False True False False False False]\n" ] } ], "source": [ "x = np.array(['Hello', 'I', 'am', '20', 'years', 'old'], dtype=np.str)\n", "out1 = np.char.isdigit(x)\n", "out2 = np.char.islower(x)\n", "out3 = np.char.isupper(x)\n", "print(\"Digits only =\", out1)\n", "print(\"Lower cases only =\", out2)\n", "print(\"Upper cases only =\", out3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q17. Check if each element of x starts with \"hi\"." ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[False True True True]\n" ] } ], "source": [ "x = np.array(['he', 'his', 'him', 'his'], dtype=np.str)\n", "out = np.char.startswith(x, \"hi\")\n", "print(out)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "anaconda-cloud": {}, "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.6" } }, "nbformat": 4, "nbformat_minor": 1 } ================================================ FILE: 2.numpy/numpy_exercises/4_Numpy-specific_help_functions.ipynb ================================================ { "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import numpy as np" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'1.11.2'" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.__version__" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q1. Search for docstrings of the numpy functions on linear algebra." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Search results for 'linear algebra'\n", "-----------------------------------\n", "numpy.linalg.solve\n", " Solve a linear matrix equation, or system of linear scalar equations.\n", "numpy.poly\n", " Find the coefficients of a polynomial with the given sequence of roots.\n", "numpy.restoredot\n", " Restore `dot`, `vdot`, and `innerproduct` to the default non-BLAS\n", "numpy.linalg.eig\n", " Compute the eigenvalues and right eigenvectors of a square array.\n", "numpy.linalg.cond\n", " Compute the condition number of a matrix.\n", "numpy.linalg.eigh\n", " Return the eigenvalues and eigenvectors of a Hermitian or symmetric matrix.\n", "numpy.linalg.pinv\n", " Compute the (Moore-Penrose) pseudo-inverse of a matrix.\n", "numpy.linalg.LinAlgError\n", " Generic Python-exception-derived object raised by linalg functions.\n" ] } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q2. Get help information for numpy dot function." ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "dot(a, b, out=None)\n", "\n", "Dot product of two arrays.\n", "\n", "For 2-D arrays it is equivalent to matrix multiplication, and for 1-D\n", "arrays to inner product of vectors (without complex conjugation). For\n", "N dimensions it is a sum product over the last axis of `a` and\n", "the second-to-last of `b`::\n", "\n", " dot(a, b)[i,j,k,m] = sum(a[i,j,:] * b[k,:,m])\n", "\n", "Parameters\n", "----------\n", "a : array_like\n", " First argument.\n", "b : array_like\n", " Second argument.\n", "out : ndarray, optional\n", " Output argument. This must have the exact kind that would be returned\n", " if it was not used. In particular, it must have the right type, must be\n", " C-contiguous, and its dtype must be the dtype that would be returned\n", " for `dot(a,b)`. This is a performance feature. Therefore, if these\n", " conditions are not met, an exception is raised, instead of attempting\n", " to be flexible.\n", "\n", "Returns\n", "-------\n", "output : ndarray\n", " Returns the dot product of `a` and `b`. If `a` and `b` are both\n", " scalars or both 1-D arrays then a scalar is returned; otherwise\n", " an array is returned.\n", " If `out` is given, then it is returned.\n", "\n", "Raises\n", "------\n", "ValueError\n", " If the last dimension of `a` is not the same size as\n", " the second-to-last dimension of `b`.\n", "\n", "See Also\n", "--------\n", "vdot : Complex-conjugating dot product.\n", "tensordot : Sum products over arbitrary axes.\n", "einsum : Einstein summation convention.\n", "matmul : '@' operator as method with out parameter.\n", "\n", "Examples\n", "--------\n", ">>> np.dot(3, 4)\n", "12\n", "\n", "Neither argument is complex-conjugated:\n", "\n", ">>> np.dot([2j, 3j], [2j, 3j])\n", "(-13+0j)\n", "\n", "For 2-D arrays it is the matrix product:\n", "\n", ">>> a = [[1, 0], [0, 1]]\n", ">>> b = [[4, 1], [2, 2]]\n", ">>> np.dot(a, b)\n", "array([[4, 1],\n", " [2, 2]])\n", "\n", ">>> a = np.arange(3*4*5*6).reshape((3,4,5,6))\n", ">>> b = np.arange(3*4*5*6)[::-1].reshape((5,4,6,3))\n", ">>> np.dot(a, b)[2,3,2,1,2,2]\n", "499128\n", ">>> sum(a[2,3,2,:] * b[1,2,:,2])\n", "499128\n" ] } ], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.10" } }, "nbformat": 4, "nbformat_minor": 0 } ================================================ FILE: 2.numpy/numpy_exercises/4_Numpy-specific_help_functions_Solutions.ipynb ================================================ { "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import numpy as np" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'1.11.2'" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.__version__" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q1. Search for docstrings of the numpy functions on linear algebra." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Search results for 'linear algebra'\n", "-----------------------------------\n", "numpy.linalg.solve\n", " Solve a linear matrix equation, or system of linear scalar equations.\n", "numpy.poly\n", " Find the coefficients of a polynomial with the given sequence of roots.\n", "numpy.restoredot\n", " Restore `dot`, `vdot`, and `innerproduct` to the default non-BLAS\n", "numpy.linalg.eig\n", " Compute the eigenvalues and right eigenvectors of a square array.\n", "numpy.linalg.cond\n", " Compute the condition number of a matrix.\n", "numpy.linalg.eigh\n", " Return the eigenvalues and eigenvectors of a Hermitian or symmetric matrix.\n", "numpy.linalg.pinv\n", " Compute the (Moore-Penrose) pseudo-inverse of a matrix.\n", "numpy.linalg.LinAlgError\n", " Generic Python-exception-derived object raised by linalg functions.\n" ] } ], "source": [ "np.lookfor('linear algebra')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q2. Get help information for numpy dot function." ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "dot(a, b, out=None)\n", "\n", "Dot product of two arrays.\n", "\n", "For 2-D arrays it is equivalent to matrix multiplication, and for 1-D\n", "arrays to inner product of vectors (without complex conjugation). For\n", "N dimensions it is a sum product over the last axis of `a` and\n", "the second-to-last of `b`::\n", "\n", " dot(a, b)[i,j,k,m] = sum(a[i,j,:] * b[k,:,m])\n", "\n", "Parameters\n", "----------\n", "a : array_like\n", " First argument.\n", "b : array_like\n", " Second argument.\n", "out : ndarray, optional\n", " Output argument. This must have the exact kind that would be returned\n", " if it was not used. In particular, it must have the right type, must be\n", " C-contiguous, and its dtype must be the dtype that would be returned\n", " for `dot(a,b)`. This is a performance feature. Therefore, if these\n", " conditions are not met, an exception is raised, instead of attempting\n", " to be flexible.\n", "\n", "Returns\n", "-------\n", "output : ndarray\n", " Returns the dot product of `a` and `b`. If `a` and `b` are both\n", " scalars or both 1-D arrays then a scalar is returned; otherwise\n", " an array is returned.\n", " If `out` is given, then it is returned.\n", "\n", "Raises\n", "------\n", "ValueError\n", " If the last dimension of `a` is not the same size as\n", " the second-to-last dimension of `b`.\n", "\n", "See Also\n", "--------\n", "vdot : Complex-conjugating dot product.\n", "tensordot : Sum products over arbitrary axes.\n", "einsum : Einstein summation convention.\n", "matmul : '@' operator as method with out parameter.\n", "\n", "Examples\n", "--------\n", ">>> np.dot(3, 4)\n", "12\n", "\n", "Neither argument is complex-conjugated:\n", "\n", ">>> np.dot([2j, 3j], [2j, 3j])\n", "(-13+0j)\n", "\n", "For 2-D arrays it is the matrix product:\n", "\n", ">>> a = [[1, 0], [0, 1]]\n", ">>> b = [[4, 1], [2, 2]]\n", ">>> np.dot(a, b)\n", "array([[4, 1],\n", " [2, 2]])\n", "\n", ">>> a = np.arange(3*4*5*6).reshape((3,4,5,6))\n", ">>> b = np.arange(3*4*5*6)[::-1].reshape((5,4,6,3))\n", ">>> np.dot(a, b)[2,3,2,1,2,2]\n", "499128\n", ">>> sum(a[2,3,2,:] * b[1,2,:,2])\n", "499128\n" ] } ], "source": [ "np.info(np.dot)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.10" } }, "nbformat": 4, "nbformat_minor": 0 } ================================================ FILE: 2.numpy/numpy_exercises/5_Input_and_Output.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Input and Output" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from __future__ import print_function\n", "import numpy as np" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "author = \"kyubyong. https://github.com/Kyubyong/numpy_exercises\"" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'1.12.0'" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.__version__" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2017-04-01\n" ] } ], "source": [ "from datetime import date\n", "print(date.today())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## NumPy binary files (NPY, NPZ)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q1. Save x into `temp.npy` and load it." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "True\n" ] } ], "source": [ "x = np.arange(10)\n", "...\n", "\n", "# Check if there exists the 'temp.npy' file.\n", "import os\n", "if os.path.exists('temp.npy'):\n", " x2 = ...\n", " print(np.array_equal(x, x2))\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q2. Save x and y into a single file 'temp.npz' and load it." ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "True\n", "True\n" ] } ], "source": [ "x = np.arange(10)\n", "y = np.arange(11, 20)\n", "...\n", "\n", "with ... as data:\n", " x2 = data['x']\n", " y2 = data['y']\n", " print(np.array_equal(x, x2))\n", " print(np.array_equal(y, y2))\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Text files" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q3. Save x to 'temp.txt' in string format and load it." ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[ 0., 1., 2., 3., 4.],\n", " [ 5., 6., 7., 8., 9.]])" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x = np.arange(10).reshape(2, 5)\n", "header = 'num1 num2 num3 num4 num5'\n", "...\n", "..." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q4. Save `x`, `y`, and `z` to 'temp.txt' in string format line by line, then load it." ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.],\n", " [ 11., 12., 13., 14., 15., 16., 17., 18., 19., 20.],\n", " [ 22., 23., 24., 25., 26., 27., 28., 29., 30., 31.]])" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x = np.arange(10)\n", "y = np.arange(11, 21)\n", "z = np.arange(22, 32)\n", "...\n", "..." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q5. Convert `x` into bytes, and load it as array." ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "True\n" ] } ], "source": [ "x = np.array([1, 2, 3, 4])\n", "x_bytes = ...\n", "x2 = ...\n", "print(np.array_equal(x, x2))\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q6. Convert `a` into an ndarray and then convert it into a list again." ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "True\n" ] } ], "source": [ "a = [[1, 2], [3, 4]]\n", "x = ...\n", "a2 = ...\n", "print(a == a2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## String formatting¶" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q7. Convert `x` to a string, and revert it." ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[0 1 2 3 4]\n", " [5 6 7 8 9]] \n", " \n" ] } ], "source": [ "x = np.arange(10).reshape(2,5)\n", "x_str = ...\n", "print(x_str, \"\\n\", type(x_str))\n", "x_str = x_str.replace(\"[\", \"\") # [] must be stripped\n", "x_str = x_str.replace(\"]\", \"\")\n", "x2 = ...\n", "assert np.array_equal(x, x2)\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Text formatting options" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q8. Print `x` such that all elements are displayed with precision=1, no suppress." ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[ 0.8 0.5 0.9 0. 0.6 0.6 0.5 0.5 0.9 0.9 0.3 0.6 0.9 0.8\n", " 0.1 0.5 0.3 0.9 0.1 0.8 0.3 0. 0.4 0.5 0.4 0.6 0.2 0.6\n", " 0.6 0.5 0.7 0.4 0.1 0.6 0.7 0.3 0.1 0.5 0.1 0.5 0. 0.8 1.\n", " 0.5 0.3 0.9 0.3 0.6 0.9 0. 0.4 0.5 0.9 0.3 0.9 0.2 0.9\n", " 0.4 0.8 0.5 0.2 0.1 0.2 0.7 0.6 0.3 0.6 0.8 0.7 0.2 0.2\n", " 0.4 0.6 0.4 1. 0. 0.2 0.4 0.8 0.5 0.4 0.4 0.6 0.2 0.2\n", " 0.8 0.1 0.9 0.7 0.3 1. 0.6 0.7 0.4 0.1 0.9 0.2 0.4 0.1\n", " 0.3]\n", " [ 0.5 0.9 0.2 0.1 0. 0.4 0.5 0.3 0.5 0.8 0.2 0.5 0.9 0.4\n", " 0.2 0.8 0.3 0.1 0.8 0.5 0.2 0. 0.7 0.7 0.6 0.7 0.1 0.2\n", " 0.6 0.2 0.4 0.2 0.2 0.1 0.4 0.4 0.9 0.6 0.3 0.4 0.9 0.1\n", " 0.6 0.7 0.7 0.2 0.5 0.3 0.3 0.8 0. 0.1 0.3 0.9 0.8 0.9\n", " 0.3 0.5 0.5 0.7 0.5 0.8 0.2 0.9 0.1 1. 0.5 0.3 0.7 0.2\n", " 0.9 0.3 0.6 0.4 1. 0.2 1. 0.7 0.8 0.6 0.9 0.9 0.4 1. 0.3\n", " 0.7 0. 0.3 0.2 0.4 0.1 0.6 0.2 0.4 0.7 0.3 0. 0.7 0.1\n", " 0.5]\n", " [ 0.7 0.1 0.6 0.2 0.9 0.8 0.5 0.6 0.9 0.8 0.4 0.1 0.1 0.7\n", " 0.7 0.8 0.1 0.8 0.4 0.2 0.6 0.8 1. 0.8 0.6 0.8 0.3 0.1\n", " 0.5 0.5 0.4 0.2 0.8 0.4 0.4 0.6 0.9 0.7 0.8 0.5 1. 0.3\n", " 0.4 0.7 0.5 0.3 1. 0.3 0.1 0.6 0.2 0. 0.2 0.8 0.7 0.7\n", " 0.6 0.4 0.7 0.7 0.5 0.1 0.9 0. 0.1 0.3 0.3 0.1 0.6 0.5\n", " 0.4 0.1 0.3 0.2 0.1 0.7 0.3 0.8 0.8 0.9 0.7 0.5 0. 0.9\n", " 0.5 0.6 1. 0.9 0.8 0. 0.7 0.3 0.4 0.2 0.3 0.4 0.9 0.4 1.\n", " 0.2]\n", " [ 1. 0.1 0.8 0. 0.4 0.2 0.2 0.8 0.1 0.2 0.1 0.9 0.9 0.9\n", " 0.5 0.7 0.8 0.6 0.1 0.2 0.2 0.5 0.4 0.6 1. 0.1 0.8 0.5\n", " 0.3 0.6 0.6 1. 0.5 0.4 0.3 0.8 0.7 0.4 0.1 1. 0.6 0.3\n", " 0.7 0.4 0.5 1. 0.6 0.8 0.5 0.6 1. 0.7 0.2 0.6 0.4 0. 0.8\n", " 0.5 0.5 0.2 0.8 0.2 0.4 0.5 0.2 0. 0.8 0.4 0.4 0.4 0.4\n", " 0.4 0.8 0.4 0.1 0.9 0.1 0.8 0.2 0.7 1. 0.3 0.1 0.9 0.3\n", " 0.1 0.1 0.4 0.5 0.5 0.6 0.2 0.2 0.4 0.5 0.6 0.3 0.2 0.6\n", " 0.7]\n", " [ 0.1 0.5 0.4 0.1 0.1 0.9 0.5 0.9 0.8 0.8 0.8 0.4 0.4 0.7 0.\n", " 0.4 0. 0.4 0.7 0.7 0.7 0.8 0.9 0. 0.6 0.8 1. 0.5 0. 0.9\n", " 0.9 1. 0.6 0.4 0.4 0.8 0.9 0.2 0.1 0.2 0.7 0.8 0.2 0.1\n", " 0.9 0.9 0.4 0.6 0.7 0.4 0.6 0.2 0.9 0.9 0.3 0.7 0.6 0.2\n", " 0.3 0.8 0.6 0.6 0.1 0.3 0.2 0.6 0.3 0.7 0.4 0.5 0.3 0.4\n", " 0.4 0.9 0.6 0.6 0.3 0.1 0.3 0.8 0.3 0.7 0.4 0.5 0.4 0.7\n", " 0.6 0.1 0.8 0.2 0.6 0.1 1. 0.8 0.2 0.6 0.9 0.2 0.4 0.4]\n", " [ 0.4 0.5 0.5 0.7 0.3 0.7 0.2 0.3 0.6 0.9 0.7 0.3 0.1 0.4\n", " 0.6 0.8 0.3 0.2 0.4 0.2 0.8 0.4 0.2 0.9 0.2 0.9 0.8 0.5\n", " 0.9 0.7 0.2 0.5 0.3 0.7 0.6 0. 0.3 0.5 0.6 0.8 0.5 0.9\n", " 0.2 0.1 0.3 0.9 0.3 0.3 0.6 0.5 0.3 1. 0.2 0.9 0.7 0.9\n", " 0.2 0.1 0.1 0.4 0.1 0.7 0.4 0.2 0.3 0.4 0.7 1. 0.9 0.5\n", " 0.1 0.9 0.5 0.1 0.4 0.9 0.7 0.3 0.5 0.3 0.3 1. 0.7 0.8\n", " 0.3 0.6 0.3 0.6 0.7 0.7 0. 0.7 0.6 0.1 0.9 1. 0.1 0.1\n", " 0.2 0.7]\n", " [ 0.1 0.1 0.4 0.6 1. 0.4 0.1 0.4 0.5 0. 0.3 0.3 0.7 0.4\n", " 0.7 0.8 0. 0.8 0.1 0.9 0.7 0.9 0.9 0.6 0.2 0.2 0.4 0.5\n", " 0.3 0.1 0.6 0.8 0.9 0.5 0.4 0.4 0.6 0.3 0.5 0.4 0.7 0.2\n", " 0.4 0.3 0.6 0.8 0.8 1. 0.5 0.7 0.6 1. 0.5 0.1 0.2 0.1\n", " 0.4 0.3 0.5 0.3 0.5 0.6 0.2 0.3 0.8 0.5 0.6 0.9 0.8 0.3\n", " 0.3 0.5 0.2 0.1 0.5 0.4 0.4 0.6 0.2 0.5 0.8 0.2 0.4 0.6\n", " 0.2 0.3 0.4 0.8 0.3 0.2 0.6 0.5 0.4 0.3 0.4 0.6 0.1 0.6\n", " 0.9 0.9]\n", " [ 0.6 0.6 0.1 0.4 0.6 0.8 0. 0.5 0.9 0.4 0.6 0.5 0.5 0.7\n", " 0.9 0.7 0.1 0.4 0.3 0.5 0.3 0.5 0.3 1. 0.4 0.5 0.1 0.4\n", " 0.3 0.6 0.6 0.3 0.4 0.8 0.5 0.4 0. 0. 0.8 0.7 0.9 0.5\n", " 0.2 0.2 0.1 0.3 0.2 0.6 0.7 0.2 0.9 0.2 0.3 0.5 0.4 0.2\n", " 0.9 0.8 0.1 0.2 0.8 0.3 0.9 0.6 0.3 0. 0.6 0. 0.1 0.7\n", " 0.7 0.2 0.8 0.4 0.4 0.6 0.2 0.3 0.4 0.5 0.9 0.3 0. 0.6\n", " 0.4 0.9 0.6 0.3 1. 0.9 0.6 0.9 0. 0.5 0.2 0.4 1. 0.5\n", " 0.7 0.9]\n", " [ 0.3 0.2 0.9 0.4 0.8 0.8 1. 0.1 0.8 0.1 0.1 0.7 0.5 0.6\n", " 0.1 0.5 0.5 0.4 0.2 0.8 0. 0.4 0.2 0.1 0.4 1. 0.1 0. 0.7\n", " 0.1 0.4 0.3 0.7 0.4 0.5 0.5 0. 0.2 0.2 0.9 0.9 0.8 0.1\n", " 0.3 0.3 0. 0.7 0. 0.8 0.5 0.5 0.3 0.3 0.1 1. 0. 0.9\n", " 0.8 0.6 0.9 0.5 1. 0.5 0. 0. 0.1 0.6 0.7 0.1 0.6 0.4\n", " 0.5 0.2 0.4 0.5 0.8 0.6 0.3 1. 0.9 0.6 0.1 0.7 0. 0.7\n", " 0.4 0.6 0.3 0.5 0.9 0.4 0.8 0.8 0.2 0.3 0.5 0.1 0.5 0.6\n", " 0.8]\n", " [ 0.4 0.6 0.6 1. 0.3 0.6 0.6 0.1 0.1 0.9 0.1 0.9 0.5 1. 0.6\n", " 0.1 0.8 0.1 0.4 0.1 0.7 0.9 0.7 0.4 0.3 0.5 0.5 0.4 0. 0.7\n", " 0.7 0.3 0.9 1. 0.7 0. 0.2 1. 0.6 0.3 0.3 0.1 0.7 0.5\n", " 0.3 0.7 0.1 0.9 0.6 0.9 0.3 0.1 0.9 1. 0.1 1. 0.6 0.7\n", " 0.5 0.6 1. 0.9 0.2 0.2 0.3 0.4 0.6 0.1 0.4 0. 0.9 0.4\n", " 0.9 0.7 0.1 1. 0.7 0.1 0.7 0.2 0.9 0.7 0.1 0.1 0.9 0.6\n", " 0.1 0.1 0.2 0.6 0.8 0.9 0.2 0.1 0.2 0.3 0.5 0.7 0.8 0.8]]\n" ] } ], "source": [ "x = np.random.uniform(size=[10,100])\n", "np.set_printoptions(...)\n", "print(x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Base-n representations" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q9. Convert 12 into a binary number in string format." ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1100\n" ] } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q10. Convert 12 into a hexadecimal number in string format." ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'44C'" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [] } ], "metadata": { "anaconda-cloud": {}, "kernelspec": { "display_name": "Python [conda root]", "language": "python", "name": "conda-root-py" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.2" } }, "nbformat": 4, "nbformat_minor": 1 } ================================================ FILE: 2.numpy/numpy_exercises/5_Input_and_Output_Solutions.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Input and Output" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from __future__ import print_function\n", "import numpy as np" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "author = \"kyubyong. https://github.com/Kyubyong/numpy_exercises\"" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'1.12.0'" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.__version__" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2017-04-01\n" ] } ], "source": [ "from datetime import date\n", "print(date.today())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## NumPy binary files (NPY, NPZ)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q1. Save x into `temp.npy` and load it." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "True\n" ] } ], "source": [ "x = np.arange(10)\n", "np.save('temp.npy', x) # Actually you can omit the extension. If so, it will be added automatically.\n", "\n", "# Check if there exists the 'temp.npy' file.\n", "import os\n", "if os.path.exists('temp.npy'):\n", " x2 = np.load('temp.npy')\n", " print(np.array_equal(x, x2))\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q2. Save x and y into a single file 'temp.npz' and load it." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "True\n", "True\n" ] } ], "source": [ "x = np.arange(10)\n", "y = np.arange(11, 20)\n", "np.savez('temp.npz', x=x, y=y)\n", "# np.savez_compressed('temp.npz', x=x, y=y) # If you want to save x and y into a single file in compressed .npz format.\n", "with np.load('temp.npz') as data:\n", " x2 = data['x']\n", " y2 = data['y']\n", " print(np.array_equal(x, x2))\n", " print(np.array_equal(y, y2))\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Text files" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q3. Save x to 'temp.txt' in string format and load it." ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[ 0., 1., 2., 3., 4.],\n", " [ 5., 6., 7., 8., 9.]])" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x = np.arange(10).reshape(2, 5)\n", "header = 'num1 num2 num3 num4 num5'\n", "np.savetxt('temp.txt', x, fmt=\"%d\", header=header) \n", "np.loadtxt('temp.txt')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q4. Save `x`, `y`, and `z` to 'temp.txt' in string format line by line, then load it." ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.],\n", " [ 11., 12., 13., 14., 15., 16., 17., 18., 19., 20.],\n", " [ 22., 23., 24., 25., 26., 27., 28., 29., 30., 31.]])" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x = np.arange(10)\n", "y = np.arange(11, 21)\n", "z = np.arange(22, 32)\n", "np.savetxt('temp.txt', (x, y, z), fmt='%d')\n", "np.loadtxt('temp.txt')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q5. Convert `x` into bytes, and load it as array." ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "True\n" ] } ], "source": [ "x = np.array([1, 2, 3, 4])\n", "x_bytes = x.tostring() # Don't be misled by the function name. What it really does is it returns bytes.\n", "x2 = np.fromstring(x_bytes, dtype=x.dtype) # returns a 1-D array even if x is not.\n", "print(np.array_equal(x, x2))\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q6. Convert `a` into an ndarray and then convert it into a list again." ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "True\n" ] } ], "source": [ "a = [[1, 2], [3, 4]]\n", "x = np.array(a)\n", "a2 = x.tolist()\n", "print(a == a2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## String formatting¶" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q7. Convert `x` to a string, and revert it." ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[0 1 2 3 4]\n", " [5 6 7 8 9]] \n", " \n" ] } ], "source": [ "x = np.arange(10).reshape(2,5)\n", "x_str = np.array_str(x)\n", "print(x_str, \"\\n\", type(x_str))\n", "x_str = x_str.replace(\"[\", \"\") # [] must be stripped\n", "x_str = x_str.replace(\"]\", \"\")\n", "x2 = np.fromstring(x_str, dtype=x.dtype, sep=\" \").reshape(x.shape)\n", "assert np.array_equal(x, x2)\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Text formatting options" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q8. Print `x` such that all elements are displayed with precision=1, no suppress." ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[ 0.5 0. 0.8 0.2 0.3 0.2 0.2 1. 0.4 0.8 0.6 0.2 0.5 0.1\n", " 0.4 0.1 0.9 0.6 0.1 0.5 0.8 0.8 0.8 0. 0.6 0.8 0.4 0.3\n", " 0.8 0.2 0.7 0.7 0.2 1. 0.8 0.1 0.2 0.1 0.3 0.1 0.5 0.9\n", " 0.6 0.9 0.6 0.5 0.8 0.3 0.3 0.5 0.1 0.6 0.1 0.3 0.6 0.2\n", " 0.4 0.8 0.6 0.4 0.2 0.6 0. 0.3 0.8 0.5 0.7 0.9 0.8 0.6\n", " 0.9 0.8 0.4 0.4 0.7 0.8 0. 0.1 0.5 0.4 0.7 1. 0.1 0.2\n", " 0.6 0.3 0.9 0.1 0.6 0.4 0.3 0.8 0.3 0.6 0.6 0.3 1. 0.2\n", " 0.9 0.2]\n", " [ 0.9 0.2 0.4 0.9 0.5 0.6 0.1 0.7 0. 0. 0.1 0.8 0.8 1. 0.2\n", " 0.8 0.3 0.2 1. 0.6 1. 0.3 0.4 0.4 0.7 0.5 0.4 0.8 0.5\n", " 0.9 0.3 0.5 0.7 0.4 0.2 0.3 0.9 0. 0.6 0.8 0.3 0.5 0.2\n", " 0.3 0. 0.6 0.5 0.2 0.5 0.8 0.2 0.8 0. 0.9 0. 0.7 0.1\n", " 0.4 0.2 0.5 0.6 0.2 0.6 0.1 0.1 0. 0.5 0.9 0.4 0.5 0.8\n", " 0.5 0.1 0.7 0. 1. 0.5 0.4 0.2 0. 1. 0.4 0.1 0.7 0.7\n", " 0.4 0.8 0.4 0.6 0.6 0.5 0.8 0.8 0.2 0.2 0.3 0.2 0.5 0.9\n", " 0.5]\n", " [ 0.3 0.6 0.4 0.5 0.5 0. 0.7 0.1 0. 0.9 0.5 0.7 0.6 0.3\n", " 0.9 0.5 0.1 0.4 0.1 0.9 0.8 0.6 0.8 0.8 0.1 0.4 0.9 0.1 1.\n", " 0.7 0.4 0.3 0.8 0.3 0.8 0.8 0.2 0.7 0.2 0.8 0.3 0.9 0.1\n", " 0.9 0.2 0.8 0.9 0.6 0.1 0.3 0.4 1. 0.1 0.7 0.3 0.9 0.3\n", " 0.5 0.9 0. 0.6 0. 0.8 0.1 0.9 0. 0.8 0.6 0.5 0.5 0.2 1.\n", " 0.4 0. 0.2 0. 0.9 0.9 0.8 0.2 0.7 0.3 0.2 0.1 1. 0.4\n", " 0.5 0.4 0.8 0.8 0.8 0.7 0.6 0.4 0.7 0.6 0.5 0.8 0.7 0.6]\n", " [ 0.2 0.6 0.9 0.7 0.1 0.1 1. 0.5 0.8 0.3 1. 0.4 0.1 0.5\n", " 0.6 0.8 0.8 0.8 0.1 1. 0.8 0. 0.7 0.6 0.8 0.2 0.5 0.9\n", " 0.4 0.8 0.7 0.2 0.8 0.6 0.9 0.6 0.9 0.8 0.9 1. 0.6 0.6\n", " 0.7 0.1 0.5 0.3 0. 0.8 0. 0.5 0.8 0.3 0.8 0.7 0.1 0.5\n", " 0.2 0.1 0.7 0. 0. 0.6 0. 0.8 0.7 0.1 0.4 0.1 0.2 0.1\n", " 0.9 0.6 0.9 0.3 0.4 0.9 0.2 0.6 0.8 0.9 0.6 0.8 0.5 0.1\n", " 0.6 1. 0. 0.7 0.7 0.4 0.1 0.9 0.4 0.1 0.7 0.6 0.3 0.9\n", " 0.3 0.5]\n", " [ 0.9 0.3 0.1 0.1 0.2 0.4 0.3 0.5 0.2 0. 0.5 0.4 0.5 0.3\n", " 0.6 1. 0.1 0.7 0.6 0.2 0.3 0.3 0.1 0.5 0.6 0. 0.6 0.7\n", " 0.6 0.4 0.2 0.6 0.1 0.9 0.9 0.1 0.9 0.1 0.6 0.6 0. 0.1\n", " 0.6 0.4 0.3 0.1 0.9 0.8 0.1 0.2 0.8 0.4 0.7 0.8 0.6 0.4\n", " 0.9 0.3 0.6 0.7 0.4 0.8 0.3 0. 0. 0.9 0.3 0.3 0.8 0.5\n", " 0.8 1. 0.2 0.6 0.6 0.2 0.2 0.2 0.4 0.6 0.6 0.4 0.4 0.8\n", " 0.2 0.5 0.7 0.7 0.1 0.9 0.5 0.6 0.3 0.3 0.6 0.8 0.6 0.8\n", " 0.4 0.3]\n", " [ 0.3 1. 0.6 0.9 0.6 1. 0.7 0.9 0.4 0.3 0.9 0.9 0.3 0.8\n", " 0.3 0.6 0.7 0.3 0.1 0.1 0.4 0.3 0.6 0.5 0.1 0.6 0.1 0.5\n", " 0.9 0.5 0.5 0.6 0.4 0.4 0.3 1. 0.6 0.6 0.3 0.1 0.4 0.7\n", " 0.7 0.1 0.5 0.1 0.3 0.1 0.6 0.7 0. 0.1 0.2 0.4 0.1 0.4\n", " 0.7 0.3 0.2 0.9 0.5 0. 0.4 0.9 1. 0.4 0. 0.2 0.3 0.9\n", " 0.3 0. 0.8 0.9 0.8 0.6 0.4 0.5 0. 0.9 0.6 0.6 0.1 0.6\n", " 0.9 0.1 0.8 0.6 0.6 0.5 0.7 1. 0.5 0.3 0.3 0.4 0.6 0.6 1.\n", " 0.2]\n", " [ 0.7 0.7 0.9 0.2 0.6 0.3 0.9 0.2 0.9 0.8 0.5 0.3 0.9 0.5 1.\n", " 0.6 0.9 0.5 0.5 0.1 0.8 0.3 0.9 0.5 0.7 1. 0.6 0.7 0.1\n", " 0.7 0.9 0.4 0.8 0.9 0.4 1. 0.1 1. 0.5 0.1 0.4 0.7 1. 0.4\n", " 0.3 0.2 0.2 0.6 0.6 0.3 0.7 0.5 0.7 0.1 0.3 0.5 1. 0.8\n", " 0.4 0.8 0.8 0.7 0.1 0.2 0.4 0.3 0.4 0.3 0.5 0.4 0.6 0.3\n", " 0.1 0.7 0.8 0.6 0.6 0.2 0.7 0.9 0.9 0.7 0.3 0.9 0.4 0.6 0.\n", " 0.4 0.4 0.2 0.8 0.3 0.1 0.2 0.6 0.5 0.9 0.8 0.9 0.7]\n", " [ 0.8 0.7 0.7 0.6 0.9 0.1 0.4 0.9 1. 0.3 0. 0.2 0.1 0.5\n", " 0.8 0.1 0.7 0.7 0.6 1. 0.7 1. 0.4 0.6 0.2 0.4 0.4 0.6 0.\n", " 0.1 1. 0.5 0.1 0.2 0.8 0.2 0.1 0.4 0.7 0.5 0.4 1. 0.5\n", " 0.5 0.4 0.8 0.2 0.1 0.7 0.2 0.1 0.4 0.3 0.6 0.9 0.9 0.9\n", " 0.9 0.1 0.1 0. 1. 0. 0.1 0.4 0.6 1. 0.4 0.9 0.3 0.2\n", " 0.7 0. 0.3 0.2 0.7 0.4 0.3 0.9 0.3 0. 0.5 0.2 0.3 0.1\n", " 0.2 0. 0.1 0.6 0.9 0.2 0.5 0.8 0.7 0. 0.4 0.8 0.8 0.5\n", " 0.2]\n", " [ 0.2 0.3 0. 0.1 0.8 0.4 0.1 0.2 0. 0.7 0. 1. 0.6 0.7\n", " 0.3 0.3 0.7 0.9 0.3 0.7 0.1 0.1 0.5 0.6 0.3 0.8 0.7 0.1\n", " 0.6 0.6 0.3 0.2 0.3 0.3 1. 0.1 0.1 0.2 0.4 0.4 0.6 0.5\n", " 0.7 0.7 0.2 0. 0.8 0.3 0.9 0.1 0.1 0.4 0.4 0.5 0.3 0.9\n", " 0.6 0.9 0.3 0.5 0. 0.4 0.8 1. 0.3 0.5 0.7 0.5 0.8 0.7\n", " 0.6 0.3 0.1 0.2 0.5 1. 0.9 0.5 0.6 0.6 0.2 0.8 0.6 0. 0.5\n", " 0.6 0.8 0.5 0.8 0.8 0.9 0.7 0.9 0.5 0.2 1. 1. 0.1 0.3\n", " 0.3]\n", " [ 0. 0.3 0.4 0.7 0.2 0.9 0.2 0.3 0.6 0.8 0.4 0.7 0.3 0.5\n", " 0.6 0.3 0.7 0. 0.1 0.1 0.9 0. 0.7 0.7 0.1 0.6 0.6 0. 0.3\n", " 0.5 0.9 0.3 0.1 0.3 0.1 0.9 0.6 0.3 0.3 0.4 0.4 0.2 0.3\n", " 0.1 0.5 0.3 0.8 0. 0.8 0.6 0.2 0.7 0.4 0.8 0.2 0.9 1. 1.\n", " 0.7 0.9 0.1 0.2 0. 0.5 0.8 0.7 0.6 0.7 0.7 0.5 0.9 0.2\n", " 0.2 0.1 0.2 0.1 0.7 1. 0.6 0.3 0.9 1. 0.3 0.3 0.7 0.9\n", " 0.5 0.8 0.9 0.7 0.2 0.7 0.3 0.1 0.9 0.2 0.5 0.6 0.3 0.4]]\n" ] } ], "source": [ "x = np.random.uniform(size=[10,100])\n", "np.set_printoptions(precision=1, threshold=np.nan, suppress=True)\n", "print(x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Base-n representations" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q9. Convert 12 into a binary number in string format." ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1100\n" ] } ], "source": [ "out1 = np.binary_repr(12)\n", "out2 = np.base_repr(12, base=2)\n", "assert out1 == out2 # But out1 is better because it's much faster.\n", "print(out1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q10. Convert 12 into a hexadecimal number in string format." ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'44C'" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.base_repr(1100, base=16)" ] } ], "metadata": { "anaconda-cloud": {}, "kernelspec": { "display_name": "Python [conda root]", "language": "python", "name": "conda-root-py" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.2" } }, "nbformat": 4, "nbformat_minor": 1 } ================================================ FILE: 2.numpy/numpy_exercises/6_Linear_algebra.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Linear algebra" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import numpy as np" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'1.11.2'" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.__version__" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Matrix and vector products" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q1. Predict the results of the following code." ] }, { "cell_type": "code", "execution_count": 53, "metadata": { "collapsed": false }, "outputs": [], "source": [ "x = [1,2]\n", "y = [[4, 1], [2, 2]]\n", "#print np.dot(x, y)\n", "#print np.dot(y, x)\n", "#print np.matmul(x, y)\n", "#print np.inner(x, y)\n", "#print np.inner(y, x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q2. Predict the results of the following code." ] }, { "cell_type": "code", "execution_count": 52, "metadata": { "collapsed": false }, "outputs": [], "source": [ "x = [[1, 0], [0, 1]]\n", "y = [[4, 1], [2, 2], [1, 1]]\n", "#print np.dot(y, x)\n", "#print np.matmul(y, x)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q3. Predict the results of the following code." ] }, { "cell_type": "code", "execution_count": 37, "metadata": { "collapsed": false }, "outputs": [], "source": [ "x = np.array([[1, 4], [5, 6]])\n", "y = np.array([[4, 1], [2, 2]])\n", "#print np.vdot(x, y)\n", "#print np.vdot(y, x)\n", "#print np.dot(x.flatten(), y.flatten())\n", "#print np.inner(x.flatten(), y.flatten())\n", "#print (x*y).sum()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q4. Predict the results of the following code." ] }, { "cell_type": "code", "execution_count": 45, "metadata": { "collapsed": false }, "outputs": [], "source": [ "x = np.array(['a', 'b'], dtype=object)\n", "y = np.array([1, 2])\n", "#print np.inner(x, y)\n", "#print np.inner(y, x)\n", "#print np.outer(x, y)\n", "#print np.outer(y, x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Decompositions" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q5. Get the lower-trianglular `L` in the Cholesky decomposition of x and verify it." ] }, { "cell_type": "code", "execution_count": 97, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[ 2. 0. 0.]\n", " [ 6. 1. 0.]\n", " [-8. 5. 3.]]\n" ] } ], "source": [ "x = np.array([[4, 12, -16], [12, 37, -43], [-16, -43, 98]], dtype=np.int32)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q6. Compute the qr factorization of x and verify it." ] }, { "cell_type": "code", "execution_count": 107, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "q=\n", "[[-0.85714287 0.39428571 0.33142856]\n", " [-0.42857143 -0.90285712 -0.03428571]\n", " [ 0.2857143 -0.17142858 0.94285715]] \n", "r=\n", "[[ -14. -21. 14.]\n", " [ 0. -175. 70.]\n", " [ 0. 0. -35.]]\n" ] } ], "source": [ "x = np.array([[12, -51, 4], [6, 167, -68], [-4, 24, -41]], dtype=np.float32)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q7. Factor x by Singular Value Decomposition and verify it." ] }, { "cell_type": "code", "execution_count": 165, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "U=\n", "[[ 0. 1. 0. 0.]\n", " [ 1. 0. 0. 0.]\n", " [ 0. 0. 0. -1.]\n", " [ 0. 0. 1. 0.]] \n", "s=\n", "[ 3. 2.23606801 2. 0. ] \n", "V=\n", "[[ 1. 0. 0.]\n", " [ 0. 1. 0.]\n", " [ 0. 0. 1.]]\n" ] } ], "source": [ "x = np.array([[1, 0, 0, 0, 2], [0, 0, 3, 0, 0], [0, 0, 0, 0, 0], [0, 2, 0, 0, 0]], dtype=np.float32)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Matrix eigenvalues" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q8. Compute the eigenvalues and right eigenvectors of x. (Name them eigenvals and eigenvecs, respectively)" ] }, { "cell_type": "code", "execution_count": 77, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "eigenvalues are\n", "[ 1. 2. 3.]\n", "eigenvectors are\n", "[[ 1. 0. 0.]\n", " [ 0. 1. 0.]\n", " [ 0. 0. 1.]]\n" ] } ], "source": [ "x = np.diag((1, 2, 3))\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q9. Predict the results of the following code." ] }, { "cell_type": "code", "execution_count": 81, "metadata": { "collapsed": false }, "outputs": [], "source": [ "#print np.array_equal(np.dot(x, eigenvecs), eigenvals * eigenvecs)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Norms and other numbers" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q10. Calculate the Frobenius norm and the condition number of x." ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "16.8819430161\n", "4.56177073661e+17\n" ] } ], "source": [ "x = np.arange(1, 10).reshape((3, 3))\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q11. Calculate the determinant of x." ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "-2.0\n" ] } ], "source": [ "x = np.arange(1, 5).reshape((2, 2))\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q12. Calculate the rank of x." ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "4\n" ] } ], "source": [ "x = np.eye(4)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q13. Compute the sign and natural logarithm of the determinant of x." ] }, { "cell_type": "code", "execution_count": 49, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "-1.0 0.69314718056\n" ] } ], "source": [ "x = np.arange(1, 5).reshape((2, 2))\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q14. Return the sum along the diagonal of x." ] }, { "cell_type": "code", "execution_count": 57, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "4.0\n" ] } ], "source": [ "x = np.eye(4)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Solving equations and inverting matrices" ] }, { "cell_type": "markdown", "metadata": { "collapsed": false }, "source": [ "Q15. Compute the inverse of x." ] }, { "cell_type": "code", "execution_count": 60, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[-2. 1. ]\n", " [ 1.5 -0.5]]\n" ] } ], "source": [ "x = np.array([[1., 2.], [3., 4.]])\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.10" } }, "nbformat": 4, "nbformat_minor": 0 } ================================================ FILE: 2.numpy/numpy_exercises/6_Linear_algebra_Solutions.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Linear algebra" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import numpy as np" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'1.11.2'" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.__version__" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Matrix and vector products" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q1. Predict the results of the following code." ] }, { "cell_type": "code", "execution_count": 61, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[8 5]\n", "[6 6]\n", "[8 5]\n", "[6 6]\n", "[6 6]\n" ] } ], "source": [ "x = [1,2]\n", "y = [[4, 1], [2, 2]]\n", "print np.dot(x, y)\n", "print np.dot(y, x)\n", "print np.matmul(x, y)\n", "print np.inner(x, y)\n", "print np.inner(y, x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q2. Predict the results of the following code." ] }, { "cell_type": "code", "execution_count": 62, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[4 1]\n", " [2 2]\n", " [1 1]]\n", "[[4 1]\n", " [2 2]\n", " [1 1]]\n" ] } ], "source": [ "x = [[1, 0], [0, 1]]\n", "y = [[4, 1], [2, 2], [1, 1]]\n", "print np.dot(y, x)\n", "print np.matmul(y, x)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q3. Predict the results of the following code." ] }, { "cell_type": "code", "execution_count": 63, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "30\n", "30\n", "30\n", "30\n", "30\n" ] } ], "source": [ "x = np.array([[1, 4], [5, 6]])\n", "y = np.array([[4, 1], [2, 2]])\n", "print np.vdot(x, y)\n", "print np.vdot(y, x)\n", "print np.dot(x.flatten(), y.flatten())\n", "print np.inner(x.flatten(), y.flatten())\n", "print (x*y).sum()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q4. Predict the results of the following code." ] }, { "cell_type": "code", "execution_count": 65, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "abb\n", "abb\n", "[['a' 'aa']\n", " ['b' 'bb']]\n", "[['a' 'b']\n", " ['aa' 'bb']]\n" ] } ], "source": [ "x = np.array(['a', 'b'], dtype=object)\n", "y = np.array([1, 2])\n", "print np.inner(x, y)\n", "print np.inner(y, x)\n", "print np.outer(x, y)\n", "print np.outer(y, x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Decompositions" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q5. Get the lower-trianglular `L` in the Cholesky decomposition of x and verify it." ] }, { "cell_type": "code", "execution_count": 97, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[ 2. 0. 0.]\n", " [ 6. 1. 0.]\n", " [-8. 5. 3.]]\n" ] } ], "source": [ "x = np.array([[4, 12, -16], [12, 37, -43], [-16, -43, 98]], dtype=np.int32)\n", "L = np.linalg.cholesky(x)\n", "print L\n", "assert np.array_equal(np.dot(L, L.T.conjugate()), x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q6. Compute the qr factorization of x and verify it." ] }, { "cell_type": "code", "execution_count": 107, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "q=\n", "[[-0.85714287 0.39428571 0.33142856]\n", " [-0.42857143 -0.90285712 -0.03428571]\n", " [ 0.2857143 -0.17142858 0.94285715]] \n", "r=\n", "[[ -14. -21. 14.]\n", " [ 0. -175. 70.]\n", " [ 0. 0. -35.]]\n" ] } ], "source": [ "x = np.array([[12, -51, 4], [6, 167, -68], [-4, 24, -41]], dtype=np.float32)\n", "q, r = np.linalg.qr(x)\n", "print \"q=\\n\", q, \"\\nr=\\n\", r\n", "assert np.allclose(np.dot(q, r), x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q7. Factor x by Singular Value Decomposition and verify it." ] }, { "cell_type": "code", "execution_count": 165, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "U=\n", "[[ 0. 1. 0. 0.]\n", " [ 1. 0. 0. 0.]\n", " [ 0. 0. 0. -1.]\n", " [ 0. 0. 1. 0.]] \n", "s=\n", "[ 3. 2.23606801 2. 0. ] \n", "V=\n", "[[ 1. 0. 0.]\n", " [ 0. 1. 0.]\n", " [ 0. 0. 1.]]\n" ] } ], "source": [ "x = np.array([[1, 0, 0, 0, 2], [0, 0, 3, 0, 0], [0, 0, 0, 0, 0], [0, 2, 0, 0, 0]], dtype=np.float32)\n", "U, s, V = np.linalg.svd(x, full_matrices=False)\n", "print \"U=\\n\", U, \"\\ns=\\n\", s, \"\\nV=\\n\", v\n", "assert np.allclose(np.dot(U, np.dot(np.diag(s), V)), x)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Matrix eigenvalues" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q8. Compute the eigenvalues and right eigenvectors of x. (Name them eigenvals and eigenvecs, respectively)" ] }, { "cell_type": "code", "execution_count": 68, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "eigenvalues are\n", "[ 1. 2. 3.]\n", "eigenvectors are\n", "[[ 1. 0. 0.]\n", " [ 0. 1. 0.]\n", " [ 0. 0. 1.]]\n" ] } ], "source": [ "x = np.diag((1, 2, 3))\n", "eigenvals = np.linalg.eig(x)[0]\n", "eigenvals_ = np.linalg.eigvals(x)\n", "assert np.array_equal(eigenvals, eigenvals_)\n", "print \"eigenvalues are\\n\", eigenvals\n", "eigenvecs = np.linalg.eig(x)[1]\n", "print \"eigenvectors are\\n\", eigenvecs" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q9. Predict the results of the following code." ] }, { "cell_type": "code", "execution_count": 69, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "True\n" ] } ], "source": [ "print np.array_equal(np.dot(x, eigenvecs), eigenvals * eigenvecs)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Norms and other numbers" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q10. Calculate the Frobenius norm and the condition number of x." ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "16.8819430161\n", "4.56177073661e+17\n" ] } ], "source": [ "x = np.arange(1, 10).reshape((3, 3))\n", "print np.linalg.norm(x, 'fro')\n", "print np.linalg.cond(x, 'fro')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q11. Calculate the determinant of x." ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "-2.0\n" ] } ], "source": [ "x = np.arange(1, 5).reshape((2, 2))\n", "out1 = np.linalg.det(x)\n", "out2 = x[0, 0] * x[1, 1] - x[0, 1] * x[1, 0]\n", "assert np.allclose(out1, out2)\n", "print out1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q12. Calculate the rank of x." ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "4\n" ] } ], "source": [ "x = np.eye(4)\n", "out1 = np.linalg.matrix_rank(x)\n", "out2 = np.linalg.svd(x)[1].size\n", "assert out1 == out2\n", "print out1\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q13. Compute the sign and natural logarithm of the determinant of x." ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "-1.0 0.69314718056\n" ] } ], "source": [ "x = np.arange(1, 5).reshape((2, 2))\n", "sign, logdet = np.linalg.slogdet(x)\n", "det = np.linalg.det(x)\n", "assert sign == np.sign(det)\n", "assert logdet == np.log(np.abs(det))\n", "print sign, logdet\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q14. Return the sum along the diagonal of x." ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "4.0\n" ] } ], "source": [ "x = np.eye(4)\n", "out1 = np.trace(x)\n", "out2 = x.diagonal().sum()\n", "assert out1 == out2\n", "print out1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Solving equations and inverting matrices" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q15. Compute the inverse of x." ] }, { "cell_type": "code", "execution_count": 60, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[-2. 1. ]\n", " [ 1.5 -0.5]]\n" ] } ], "source": [ "x = np.array([[1., 2.], [3., 4.]])\n", "out1 = np.linalg.inv(x)\n", "assert np.allclose(np.dot(x, out1), np.eye(2))\n", "print out1\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.6" } }, "nbformat": 4, "nbformat_minor": 1 } ================================================ FILE: 2.numpy/numpy_exercises/7_Discrete_Fourier_Transform.ipynb ================================================ { "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from __future__ import print_function\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "datetime.date(2017, 11, 2)" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from datetime import date\n", "date.today()" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ "author = \"kyubyong. https://github.com/Kyubyong/numpy_exercises\"" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'1.13.1'" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.__version__" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Complex Numbers" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q1. Return the angle of `a` in radian." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.785398163397\n" ] } ], "source": [ "a = 1+1j\n", "output = ...\n", "print(output)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q2. Return the real part and imaginary part of `a`." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "real part= [ 1. 3. 5.]\n", "imaginary part= [ 2. 4. 6.]\n" ] } ], "source": [ "a = np.array([1+2j, 3+4j, 5+6j])\n", "real = ...\n", "imag = ...\n", "print(\"real part=\", real)\n", "print(\"imaginary part=\", imag)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q3. Replace the real part of a with `9`, the imaginary part with `[5, 7, 9]`." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 9.+5.j 9.+7.j 9.+9.j]\n" ] } ], "source": [ "a = np.array([1+2j, 3+4j, 5+6j])\n", "...\n", "...\n", "print(a)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q4. Return the complex conjugate of `a`." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(1-2j)\n" ] } ], "source": [ "a = 1+2j\n", "output = ...\n", "print(output)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Discrete Fourier Transform" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q5. Compuete the one-dimensional DFT of `a`." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 8.00000000e+00 -6.85802208e-15j 2.36524713e-15 +9.79717439e-16j\n", " 9.79717439e-16 +9.79717439e-16j 4.05812251e-16 +9.79717439e-16j\n", " 0.00000000e+00 +9.79717439e-16j -4.05812251e-16 +9.79717439e-16j\n", " -9.79717439e-16 +9.79717439e-16j -2.36524713e-15 +9.79717439e-16j]\n" ] } ], "source": [ "a = np.exp(2j * np.pi * np.arange(8))\n", "output = ...\n", "print(output)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q6. Compute the one-dimensional inverse DFT of the `output` in the above question." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "a= [ 1. +0.00000000e+00j 1. -2.44929360e-16j 1. -4.89858720e-16j\n", " 1. -7.34788079e-16j 1. -9.79717439e-16j 1. -1.22464680e-15j\n", " 1. -1.46957616e-15j 1. -1.71450552e-15j]\n", "inversed= [ 1. +0.00000000e+00j 1. -2.44929360e-16j 1. -4.89858720e-16j\n", " 1. -7.34788079e-16j 1. -9.79717439e-16j 1. -1.22464680e-15j\n", " 1. -1.46957616e-15j 1. -1.71450552e-15j]\n" ] } ], "source": [ "print(\"a=\", a)\n", "inversed = ...\n", "print(\"inversed=\", a)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q7. Compute the one-dimensional discrete Fourier Transform for real input `a`." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 1.+0.j 0.-1.j -1.+0.j]\n", "[ 1.+0.j 0.-1.j -1.+0.j 0.+1.j]\n" ] } ], "source": [ "a = [0, 1, 0, 0]\n", "output = ...\n", "print(output)\n", "assert output.size==len(a)//2+1 if len(a)%2==0 else (len(a)+1)//2\n", "\n", "# cf.\n", "output2 = np.fft.fft(a)\n", "print(output2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q8. Compute the one-dimensional inverse DFT of the output in the above question." ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "inversed= [0, 1, 0, 0]\n" ] } ], "source": [ "inversed = ...\n", "print(\"inversed=\", a)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q9. Return the DFT sample frequencies of `a`." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 0. 0.125 0.25 0.375 -0.5 -0.375 -0.25 -0.125]\n" ] } ], "source": [ "signal = np.array([-2, 8, 6, 4, 1, 0, 3, 5], dtype=np.float32)\n", "fourier = np.fft.fft(signal)\n", "n = signal.size\n", "freq = ...\n", "print(freq)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Window Functions" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "image/png": "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\nVSvJQHmzVKBqWWxCUk4Kll2Mt8LeWDaVStgsVC1xxeBayCYsl4SYAFkHNlqSEBszIsYQY8uXyFd8\niYUlyx5JI0saSXPp7nf/OGeulrmIHo1m+vlUner3vOd099v2vK3T3/Oe99Ayi6MWUkqM/tM/MdTf\nz7H+fk7e/wDU65Qvuoi+T36Srre8+fQDluoIDDwGz343C1f2fA/qY9DaBedvy26HdsGboGtlYz/U\nWWzkxNhEmHLwuWMc2DvE4f3HqdcSAKXWAstXV1h/1SrOe80yVl20hFKTfzFJkiTp7NdSLrJuQw/r\nNvSQUmLw+eM8u/sgzz95hL2PD/LEPS9M7FtZWmb56ix86VnTxfLVFbqWtS3suxp1nweb35stYyfh\n2bvzE9B/ly0APb+QhS7nb4dzNp7WTT/KF15I3803s/yGG7JLij77OQ7978/SsmYNlW1b6dq2jY5N\nm4iW2Qu73n5ZH6O1Oh+67R95/627+KNfu4JyqXl/0xi0nAX+ctdePvy13fyzi3r49Lsvp3UWrm9M\nY2Oc2HV/Fq7s7Gdsz48AKF98Mcv/7b+hsm0bbZdc8rMFLKMnskuB9j8I+x/KloHHsmAFoOdiuPL9\nWVJ77pWzdr/5s0VKiWODw9NClYN7hzh2aHhin45FrSxfU+G8S5ZN/COzqKf9jM/DI0mSJDVSRLCs\nr8KyvgpXXJPVnTg6Om0E98HnjrFn90FSdr6R1vZSPuKlMjECpntl58Kc76WlHS58U7akj8Ohp/PQ\n5Xa454/he/8z22/Judno/3M2ZMHLORug0vtTvUX5ggvou/kP6P0vH2KofydD/f289JWvcviLf0ah\nUqFzy1V0bd9OZcuWWZlA952b1lCtJX7r67u58c8f4A/fffmsDiA4mxm0zLEdDz3Pf77tId54/nL+\nuMGpX+3IEYbu+i5D/f0M3XUX9aNHiZYWOq68kqXXX0/X1q20rFr1073Y8FF4YfdkoLL/ITj4BKR6\ntr19KazaCG+4Mfsy6NsES9Y07LOcTVJKnDw2xtDh4ezyn+eGJv4BGTlRzXaKbFjlinWLuGTLKnrW\ndLFsdaW5rleVJElSU+tY1Mq567ObOIwbG61xaN/QtPDl0e8+T3U0+11RKAZLV3VmAczq7Bh60bI2\nOpeUF04AEwHLL8iW198AI0Ow9wew/x8nf2s99v8m9+86Z0r4ki+L+l5xgt2WFSvovu5auq+7lvqJ\nExz//vc51t/P0M7vcOxvvwnFIQgFPgAAEChJREFUIh2XXUZl2zYq27ZRftW6hn20X3nduYzV6vzu\njkf44Fce5JbrNlJqwrDFoGUO/e3u/fz7rz7I5rVLG3Yd2+iePVkn+nY/J3btglqN4tKldF19NZXt\n26i84Q0UOjt//IucGJweqOx/CAafntw+3tHX//JP1dHnm9GTVY4NDjN0eIShw8MzyiMcPzxCrVqf\n2L/YUmBZX4Xzr+idGAa5rK9CS7l5h8pJkiRJp9LSWmTlusWsXLd4oq5eTxwZODHtBOaehw/x+Pcn\nLz0isuCm0t1G19Iyle42Kt1lupa2ZeWlZTq6Won5OFK8XMkuHTp/+2TdqU50P3n75InujmUvD1+6\n173sN1mho4Ouq6+m6+qrSfU6w7t3Z78X+3cycNNNDNx0E61r1+ahy1Y6Lr+cKP18McH1b1jLWK3O\nR//6MUrF4OZ3bjxj84+eLQxa5sgdj77Iv/vyA1y2ZsnPNTNzqlY5+eCDE51l9JlngOw6vWXveQ+V\nbVtpv/TSl9+WefgoHN2XLUf2wZG9MPBolqIe+dHkfuND1za+Kxu6tvJS6Fpxuh97zlXHanlokgUn\nQ4PDHDs8wtDg5ProcG3acyKgc0n2Zd57XhddG3uo5F/uS3o7WLKi3TsBSZIkSaepUAi6V3bSvbKT\nCzdP/tY4fmSEwX3HOZYfpw8dHuHY4DCH9h1nz8OHJkbBTLxOMah0lyeCl0p3G13dZSrjYUx3mXJH\naX7MC9O2KLtD0do3TtadauqG731qcuqG8qLs99o5l8KS87LbUC9aBYtWQ2cPUSjQvmED7Rs20PvB\nDzK2bx/H8kuMBm+9lcEvfIHC4sVUtmyha/s2OrdsodjVdVrNf++WVzFaq/P733yClmKB3/+XlzbV\ndAmzGrRExDXALUAR+GxK6X/M2F4GvghcARwCrk0pPTubbTob9D8xwAe+dD+v6VvMF35jM53lH/+/\nIVWrVA8dojowkC0HDlAdGGB0z484fvfd1F56CVpa6Ny8ie7rrqNy1eto7QKO7oWjj8Bdt2flI/uy\n+7wf3QcjR2e8S2T3d1+zGV773ixcWXnpaU3GNJtSSoyN1Bg5UWXkxFj+OLNcZeRkvn68ysjJye21\nsfrLXrO9q4VKdxuLe9rpe3V3lox3t+VfyGU6F7capEiSJElnWOfi8iteep9SYuR4NQthDo/kQUw2\nAn3o8DD7nzzC0EsDpHqa9rwoBOX2EuWOqUsLrR0l2sbL+fa2jhbKnSVa27Nya0dpbsOC1o7s99qa\nzZN14zcjmTry5b4vQPXk9OcWWvLQpS8PYPpoWbyapZv6WLr9RmqlpRx/4LFsbpfvfIej3/gGlEp0\nbNpE2/r1lHp6KPX20NLbSylfCu0//jbVN2y9gLFq4hPf+iEtxeBjb//FWfiPcnaataAlIorAp4E3\nA3uBeyNiR0rp0Sm7vQc4nFK6ICKuAz4OXDtbbTobPHKwxi3f2sVFKyv8yfVX0H7sJU4+PRmeVAcO\nUH3xRaovvkB1YICxAweoDR5mYsaocYWgtKRC56t76brwPDpXjVIceQKevxO++NLL37izN+tYy87P\nbieWd66JjtZ1zs80WW2qJ+r5kmp5uZYm6mvVOrWxOtXROtWxWlYem1IezdZred1kuU5tdPp6dbQ2\nJUCpvuzLcppgyhdn9iW5dHEHrfl6uaNE5+LytOGGJe/zLkmSJM0rEUFbpYW2Sgs9a0496qJeT5w4\nMjptOoCR42MTvyvGT8YeGxyZKI/fGfSVtLQVJ39rlIsUWwqUWosUSwVKrQVKLYWsrqVIqbUwpT7f\nd2J7/rzxulKBQjGIQlAsFohiUChkSxSDCE49EqdUzubKXLVxsi4lOHEou2rhaH6yfbx8ZB8894Os\nbnwkDNnIiEWlNhatWkX616s4eeRchp4ZZejxpzi86z7SWPVlb12odFLqWU6pt5eWFSsprVhBqWc8\niOmh1NvLjVetYbRW49P9T9NSLLBt0Y//77tQzOaIltcCT6WUngGIiK8AbwOmBi1vAz6Sl28DPhUR\nkdLMVGFh+PuP3MLSJ2v89zoUfpi4fecPZuyRd5ziEgqFxdD5agqLEnERRDFlSwGiCFFIE9ffpUNl\nONJGKraTSm2kYhmKZVKxTCq2QqGVlAqklxLpMJDSRG6TUiLVXwD2U6/nAUqtPj04qc0IVOoJGvh/\nKAKKrcXsy+YUX0xtlVYW93ZMJs7tWbI8NVAZ39baVpqf12VKkiRJaqhCYfxSojIrX7X4J+6fUqI6\nVs9HxU+OmB89McbwRDkLaIZPVBkbqVEdrTN8fGzyZHJ18sTxTwptTufzTAQweSjzSuWIgICIHiJ6\nidgIMR7YQLQD9SpRGyHqo1AdIUaG4YURojpM1E5CYZhYX4eLs99/qRbU60AN6rUg1bK6NBqkZyE9\nE5AOAAPT2r22ADcVg9qPnuBQ6SRp69b5cfnWz2E2g5Y+4Lkp63uB173SPimlakQcAZYBB6fuFBHv\nA94HsGLFCnbu3DlLTZ5dh18YZLh0URaWFAImHgOKAYVCVo4CRJAY7wUBBCkvJwqTdYVivv/k+0QN\nqANjiYgRYCTbHvlu4/sG0+ZKitJkXamQl/O3isLktqwc0+snmzT5nBIUilkwNO2xAIXS5Hr2ugmo\n5cupJWA4XxjLl5lXQOmsNzQ0NG/7sNQI9gE1O/uAmpl///NYAahkSxH4CbcXAYJUz+aurdcg1V75\ncaKcgHr2OK1cJz9Znp0IJ02tzx5Tysq1KWXGXwMmTpRPbMvrsm1FSB1ABymAFqAEqTURqUbkbxBT\n3niiTCLGXzQlqOeNqCeo17M21lPWjnqiXB3kzv6dlBb4yfF5MRluSukzwGcANm3alLZu3Tq3DTpd\nW7fyrW/386bt2+a6JdKc2blzJ/O2D0sNYB9Qs7MPqJn5969mllLizv6dTfF7eDZn+NwHrJmyvjqv\nO+U+EVECFpNNirtgLfTkTpIkSZKkmSKiaX4Pz2bQci9wYUSsi4hW4Dpgx4x9dgDX5+V3AN9eqPOz\nSJIkSZKkhW/WLh3K51y5Efg7ssvYPp9SeiQifg+4L6W0A/gc8GcR8RQwSBbGSJIkSZIkzUuzOkdL\nSulvgL+ZUfc7U8rDwL+azTZIkiRJkiSdKbN56ZAkSZIkSVJTMWiRJEmSJElqEIMWSZIkSZKkBjFo\nkSRJkiRJahCDFkmSJEmSpAYxaJEkSZIkSWoQgxZJkiRJkqQGMWiRJEmSJElqEIMWSZIkSZKkBjFo\nkSRJkiRJahCDFkmSJEmSpAYxaJEkSZIkSWoQgxZJkiRJkqQGMWiRJEmSJElqEIMWSZIkSZKkBjFo\nkSRJkiRJahCDFkmSJEmSpAYxaJEkSZIkSWoQgxZJkiRJkqQGiZTSXLfhZxIRB4A9c92On8Ny4OBc\nN0KaQ/YBNTv7gJqdfUDNzL9/Nbv53gfOSyn1/KSd5l3QMt9FxH0ppU1z3Q5prtgH1OzsA2p29gE1\nM//+1eyapQ946ZAkSZIkSVKDGLRIkiRJkiQ1iEHLmfeZuW6ANMfsA2p29gE1O/uAmpl//2p2TdEH\nnKNFkiRJkiSpQRzRIkmSJEmS1CAGLWdQRFwTEU9ExFMR8eG5bo802yLi8xExEBEPT6lbGhF3RMST\n+WP3XLZRmi0RsSYi+iPi0Yh4JCJ+M6+3D6gpRERbRPwgIh7K+8B/y+vXRcQ9+fHQVyOida7bKs2m\niChGxAMR8Y183T6gphERz0bE7oh4MCLuy+sW/LGQQcsZEhFF4NPAPwfWA++KiPVz2ypp1v0JcM2M\nug8Dd6aULgTuzNelhagK/MeU0nrgSuAD+fe+fUDNYgTYnlLaAGwEromIK4GPA59IKV0AHAbeM4dt\nlM6E3wQem7JuH1Cz2ZZS2jjlts4L/ljIoOXMeS3wVErpmZTSKPAV4G1z3CZpVqWU/h4YnFH9NuBP\n8/KfAm8/o42SzpCU0v6U0v15+RjZQXYf9gE1iZQZyldb8iUB24Hb8nr7gBa0iFgN/Avgs/l6YB+Q\nFvyxkEHLmdMHPDdlfW9eJzWbFSml/Xn5BWDFXDZGOhMiYi1wGXAP9gE1kfySiQeBAeAO4GngpZRS\nNd/F4yEtdJ8EPgTU8/Vl2AfUXBJwe0Tsioj35XUL/lioNNcNkNS8UkopIrz1mRa0iKgAfwl8MKV0\nNDuZmbEPaKFLKdWAjRGxBPg68Atz3CTpjImItwIDKaVdEbF1rtsjzZGrUkr7IqIXuCMiHp+6caEe\nCzmi5czZB6yZsr46r5OazYsRcQ5A/jgwx+2RZk1EtJCFLF9KKX0tr7YPqOmklF4C+oHXA0siYvxk\nn8dDWsjeCPxyRDxLNm3AduAW7ANqIimlffnjAFng/lqa4FjIoOXMuRe4MJ9lvBW4Dtgxx22S5sIO\n4Pq8fD3wV3PYFmnW5Nfhfw54LKV085RN9gE1hYjoyUeyEBHtwJvJ5irqB96R72Yf0IKVUvqvKaXV\nKaW1ZMf+304pvRv7gJpERHRGRNd4GXgL8DBNcCwUKS24UTpnrYj4JbLrNIvA51NKH5vjJkmzKiK+\nDGwFlgMvAr8L/F/gL4BzgT3AO1NKMyfMlea9iLgKuAvYzeS1+b9FNk+LfUALXkRcSjbJYZHs5N5f\npJR+LyJeRXZ2fynwAPCrKaWRuWupNPvyS4f+U0rprfYBNYv8b/3r+WoJ+POU0sciYhkL/FjIoEWS\nJEmSJKlBvHRIkiRJkiSpQQxaJEmSJEmSGsSgRZIkSZIkqUEMWiRJkiRJkhrEoEWSJEmSJKlBDFok\nSZJmiIidEbFprtshSZLmH4MWSZIkSZKkBjFokSRJ80JEdEbEX0fEQxHxcERcGxG/ExH35uufiYjI\n990ZEZ+IiPsi4rGI2BwRX4uIJyPio/k+ayPi8Yj4Ur7PbRHRcYr3fUtEfD8i7o+I/xMRlTP92SVJ\n0vxh0CJJkuaLa4DnU0obUkqvAb4JfCqltDlfbwfeOmX/0ZTSJuCPgL8CPgC8Bvj1iFiW7/Nq4A9T\nShcDR4Ebpr5hRCwHfht4U0rpcuA+4D/M2ieUJEnznkGLJEmaL3YDb46Ij0fElpTSEWBbRNwTEbuB\n7cAlU/bfMeV5j6SU9qeURoBngDX5tudSSnfn5VuBq2a855XAeuDuiHgQuB44r+GfTJIkLRiluW6A\nJEnSTyOl9MOIuBz4JeCjEXEn2SiVTSml5yLiI0DblKeM5I/1KeXx9fFjoDTzbWasB3BHSuldDfgI\nkiSpCTiiRZIkzQsRsQo4kVK6FbgJuDzfdDCfN+Udp/Gy50bE6/PyrwDfnbH9H4A3RsQFeRs6I+Ki\n03gfSZLUJBzRIkmS5otfBG6KiDowBrwfeDvwMPACcO9pvOYTwAci4vPAo8D/mroxpXQgIn4d+HJE\nlPPq3wZ+eFqfQJIkLXiR0swRspIkSQtfRKwFvpFPpCtJktQQXjokSZIkSZLUII5okSRJkiRJahBH\ntEiSJEmSJDWIQYskSZIkSVKDGLRIkiRJkiQ1iEGLJEmSJElSgxi0SJIkSZIkNYhBiyRJkiRJUoP8\nf9alElAadvRbAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = plt.figure(figsize=(19, 10))\n", "\n", "# Hamming window\n", "window = np.hamming(51)\n", "plt.plot(np.bartlett(51), label=\"Bartlett window\")\n", "plt.plot(np.blackman(51), label=\"Blackman window\")\n", "plt.plot(np.hamming(51), label=\"Hamming window\")\n", "plt.plot(np.hanning(51), label=\"Hanning window\")\n", "plt.plot(np.kaiser(51, 14), label=\"Kaiser window\")\n", "plt.xlabel(\"sample\")\n", "plt.ylabel(\"amplitude\")\n", "plt.legend()\n", "plt.grid()\n", "\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.10" } }, "nbformat": 4, "nbformat_minor": 2 } ================================================ FILE: 2.numpy/numpy_exercises/7_Discrete_Fourier_Transform_solutions.ipynb ================================================ { "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from __future__ import print_function\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "datetime.date(2017, 11, 2)" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from datetime import date\n", "date.today()" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ "author = \"kyubyong. https://github.com/Kyubyong/numpy_exercises\"" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'1.13.1'" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.__version__" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Complex Numbers" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q1. Return the angle of `a` in radian." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.785398163397\n" ] } ], "source": [ "a = 1+1j\n", "output = np.angle(a, deg=False)\n", "print(output)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q2. Return the real part and imaginary part of `a`." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "real part= [ 1. 3. 5.]\n", "imaginary part= [ 2. 4. 6.]\n" ] } ], "source": [ "a = np.array([1+2j, 3+4j, 5+6j])\n", "real = a.real\n", "imag = a.imag\n", "print(\"real part=\", real)\n", "print(\"imaginary part=\", imag)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q3. Replace the real part of a with `9`, the imaginary part with `[5, 7, 9]`." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 9.+5.j 9.+7.j 9.+9.j]\n" ] } ], "source": [ "a = np.array([1+2j, 3+4j, 5+6j])\n", "a.real = 9\n", "a.imag = [5, 7, 9]\n", "print(a)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q4. Return the complex conjugate of `a`." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(1-2j)\n" ] } ], "source": [ "a = 1+2j\n", "output = np.conjugate(a)\n", "print(output)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Discrete Fourier Transform" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q5. Compuete the one-dimensional DFT of `a`." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 8.00000000e+00 -6.85802208e-15j 2.36524713e-15 +9.79717439e-16j\n", " 9.79717439e-16 +9.79717439e-16j 4.05812251e-16 +9.79717439e-16j\n", " 0.00000000e+00 +9.79717439e-16j -4.05812251e-16 +9.79717439e-16j\n", " -9.79717439e-16 +9.79717439e-16j -2.36524713e-15 +9.79717439e-16j]\n" ] } ], "source": [ "a = np.exp(2j * np.pi * np.arange(8))\n", "output = np.fft.fft(a)\n", "print(output)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q6. Compute the one-dimensional inverse DFT of the `output` in the above question." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "a= [ 1. +0.00000000e+00j 1. -2.44929360e-16j 1. -4.89858720e-16j\n", " 1. -7.34788079e-16j 1. -9.79717439e-16j 1. -1.22464680e-15j\n", " 1. -1.46957616e-15j 1. -1.71450552e-15j]\n", "inversed= [ 1. +0.00000000e+00j 1. -2.44929360e-16j 1. -4.89858720e-16j\n", " 1. -7.34788079e-16j 1. -9.79717439e-16j 1. -1.22464680e-15j\n", " 1. -1.46957616e-15j 1. -1.71450552e-15j]\n" ] } ], "source": [ "print(\"a=\", a)\n", "inversed = np.fft.ifft(output)\n", "print(\"inversed=\", a)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q7. Compute the one-dimensional discrete Fourier Transform for real input `a`." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 1.+0.j 0.-1.j -1.+0.j]\n", "[ 1.+0.j 0.-1.j -1.+0.j 0.+1.j]\n" ] } ], "source": [ "a = [0, 1, 0, 0]\n", "output = np.fft.rfft(a)\n", "print(output)\n", "assert output.size==len(a)//2+1 if len(a)%2==0 else (len(a)+1)//2\n", "\n", "# cf.\n", "output2 = np.fft.fft(a)\n", "print(output2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q8. Compute the one-dimensional inverse DFT of the output in the above question." ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "inversed= [0, 1, 0, 0]\n" ] } ], "source": [ "inversed = np.fft.ifft(output)\n", "print(\"inversed=\", a)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q9. Return the DFT sample frequencies of `a`." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 0. 0.125 0.25 0.375 -0.5 -0.375 -0.25 -0.125]\n" ] } ], "source": [ "signal = np.array([-2, 8, 6, 4, 1, 0, 3, 5], dtype=np.float32)\n", "fourier = np.fft.fft(signal)\n", "n = signal.size\n", "freq = np.fft.fftfreq(n, d=1)\n", "print(freq)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Window Functions" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABFoAAAJQCAYAAAC+dQDPAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XdY1eX7wPH3OYfDHjIEBwg4QQERUBQBzZGoheEW985v\nZuUvTbOvo7KcpS0tJ+6dqeFWAk0NBy5ASQUFJyJLARnn9wfJ13KdgwPJ+3VdXZec84z7c875XNB9\nnud+FBqNBiGEEEIIIYQQQgjx9JRlHYAQQgghhBBCCCHEv4UkWoQQQgghhBBCCCGeEUm0CCGEEEII\nIYQQQjwjkmgRQgghhBBCCCGEeEYk0SKEEEIIIYQQQgjxjEiiRQghhBBCCCGEEOIZkUSLEEIIIYQQ\nQgghxDMiiRYhhBBCCCGEEEKIZ0QSLUIIIYQQQgghhBDPiF5ZB6ArGxsbjZOTU1mHUWq3b9/GxMSk\nrMMQoszIPSBedXIPiFed3APiVSaff/GqK+/3wJEjR1I1Gk3FJ7Urd4kWJycnDh8+XNZhlFpERATN\nmzcv6zCEKDNyD4hXndwD4lUn94B4lcnnX7zqyvs9oFAokrRpJ1uHhBBCCCGEEEIIIZ4RSbQIIYQQ\nQgghhBBCPCOSaBFCCCGEEEIIIYR4RspdjRYhhBBCCCGEEOJFyc/PJzk5mdzc3LIOpdyzsLAgLi6u\nrMN4IkNDQ+zt7VGr1aXqL4kWIYQQQgghhBDiEZKTkzEzM8PJyQmFQlHW4ZRrWVlZmJmZlXUYj6XR\naLh58ybJyck4OzuXagzZOiSEEEIIIYQQQjxCbm4u1tbWkmR5RSgUCqytrZ9qBZMkWoQQQgghhBBC\niMeQJMur5Wnfb0m0CCGEEEIIIYQQQjwjkmgRQgghhBBCCCFeYiqVCk9PT+rXr4+Xlxe///67zmN8\n8cUXf/vZ1NT0se3T09P54YcfSn5OTExkxYoVOs97j5+fn07tIyIieOONN0o9X1mSRIsQQgghhBBC\nCPESMzIyIiYmhuPHj/Pll18yduxYrftqNBqKiooeSLQ8ybNOtJQmOVReSaJFCCGEEEIIIYQoJzIz\nM7G0tAQgOzubli1b4uXlhbu7O7/88gtQnBSpU6cOffr0wc3NjYEDB5KTk4Onpyc9e/Z8YMzp06fT\nsGFDPDw8mDBhAgBjxozh3LlzeHp6MmrUKMaMGUNUVBSenp58/fXXf+v/zjvvsGnTJgBCQkIYMGAA\nAAsXLmTcuHHA/1bQRERE0Lx5czp37oyLiws9e/ZEo9EAsG3bNlxcXPDy8mLDhg0l46elpfHWW2/h\n4eFB48aNOXHiBADu7u6kp6ej0WiwtrZmyZIlAPTp04edO3c+g1e7dOR4ZyGEEEIIIYQQQguTNp8m\n9nLmMx2zbhVzJrxZ77Ft7iVJcnNzuXLlCnv27AHA0NCQn3/+GXNzc1JTU2ncuDHBwcEAJCQkEBYW\nRuPGjQFYu3YtMTExD4y9Y8cOEhIS+OOPP9BoNAQHBxMZGcmUKVM4depUSZ+IiAhmzJjBli1bHhgj\nICCAqKgogoODSUlJ4cqVKwBERUXRvXv3B9ofO3aM06dPU6VKFZo2bcr+/fvx8fFh8ODB7Nmzh5o1\na9KtW7eS9hMmTKBBgwZs3LiRPXv20KdPH2JiYkr6Ojo6Ur16daKioujTpw8HDhxgzpw52rz8z4Ws\naBFCCCGEEEIIIV5i97YOxcfHs23bNvr06YNGo0Gj0fDxxx/j4eFBq1atSElJ4dq1awA4OjqWJFke\nZ8eOHezYsYMGDRrg5eVFfHw8CQkJOsV3L9ESGxtL3bp1sbOz48qVKxw4cOChtVkaNWqEvb09SqUS\nT09PEhMTiY+Px9nZmVq1aqFQKOjVq1dJ+3379tG7d28AWrRowc2bN8nMzCQgIIDIyEgiIyMZNmwY\nJ0+eJCUlBUtLS0xMTHS6hmdJVrQIIYQQQgghhBBaeNLKkxehSZMmpKamcuPGDcLDw7lx4wZHjhxB\nrVbj5OREbm4ugNaJBo1Gw9ixYxk6dOjfHk9MTNQ6pqpVq5Kens62bdsIDAwkLS2NNWvWYGpqipmZ\n2QPtDQwMSv6tUqkoKCjQeq77BQYG8v3333Px4kUmT57Mzz//zLp16wgICCjVeM+KrGgRQgghhBBC\nCCHKifj4eAoLC7G2tiYjIwNbW1vUajV79+4lKSnpkf3UajX5+fkPPN6mTRsWLlxIdnY2ACkpKVy/\nfh0zMzOysrJK2v3z539q3Lgxs2bNIjAwkICAAGbMmKFTwsPFxYXExETOnTsHwMqVK0ueCwgIYPny\n5UDxFiYbGxvMzc1xcHAgNTWVhIQEqlevjr+/PzNmzCAwMFDreZ8HSbQIIYQQQgghhBAvsXs1Wjw9\nPenWrRthYWGoVCp69uzJ4cOHcXd3Z8mSJbi4uDxyjCFDhuDh4fFAMdzXX3+d0NBQmjRpgru7O507\ndyYrKwtra2uaNm2Km5sbo0aNwsPDA5VKRf369R8ohgvFyZCCggJq1qyJl5cXaWlpOiVaDA0N+emn\nn2jfvj1eXl7Y2tqWPDdx4kSOHDmCh4cHY8aMISwsrOQ5X19fateuXRJDSkoK/v7+Ws/7PCjuVfct\nL3x8fDSHDx8u6zBK7V6FZSFeVXIPiFed3APiVSf3gHiVyee/fIqLi8PV1bWsw/hXyMrKeuhWopfR\nw953hUJxRKPR+Dypr6xoEUIIIYQQQgghhHhGJNEihBBCCCGEEEII8Yw8t0SLQqFYqFAorisUilOP\neF6hUCi+USgUfyoUihMKhcLrecUihBBCCCGEEEII8SI8zxUti4GgxzzfFqj1139DgDnPMRYhhBBC\nCCGEEEKI5+65JVo0Gk0kkPaYJh2AJZpiB4EKCoWi8vOKRwghhBBCCCGEEOJ50yvDuasCl+77Ofmv\nx66UTThCCCGEKM/u5N8h9doFbiWfJ+tyEneSz3E3JZG7NwrJy7UnT1GLIpUJBvl/YqBORL9CNurK\nVTF0qIFpVUcsq1bHpmpNLIytUCgUZX05QgghhCinyjLRojWFQjGE4u1F2NnZERERUbYBPYXs7Oxy\nHb8QT0vuAfGqk3tAN4WaQjILMriTncrdW1cpuHUDTUYaqowM1BlZGGTewSQzD/OsAiyyNegXglJl\nSFGF2tyxciHNqjs5RhVBH1T5N1EWZZFj9DoolKju5GB1+AzqnXGo0raQn3uTFCDOBDJNVWSb65Nj\nbsxdCxMKLSzQWFRAVcEGPUtbjCpUwkJtiYHSoKxfonJH7gHxKpPPf/lkYWFBVlZWmcZQoUIF6tWr\nh0ajQaVSMWPGDHx9fUlKSqJr164cOnRI5zHbtWvH559/jpfXiyuXWlhYqNVruWDBAoyMjAgNDdV6\n7Gd9Pbm5uaW+X8sy0ZICONz3s/1fjz1Ao9H8BPwE4OPjoynPZ89HRERQnuMX4mnJPSBedXIPPNnF\n9CSO7VtPxu5dVDyWhHNqEQYFD7bL1YfbJpBnoiGjqj2XzeqSY1CPHGV1NKhQqQqo6qDgpqWa2X9m\n4udZndfrVWLMyhjaWRoSZG5CckJdblT0BECf6xjfPYXxnThM0s9ik34H45QcjO/cfGCvdZECbppB\nsosVygBfarfujEe1Rugpy8V3WGVK7gHxKpPPf/kUFxeHmZlZmcZgZGTEiRMnANi+fTufffYZv/32\nG6ampiiVylLFp1KpMDExeaHXlpWVpdV877//vs5jP+vrMTQ0pEGDBqXqW5Z/DWwChisUilWAL5Ch\n0Whk25AQQgjxirmdf5s/Luzj/O6fUfx+lDpxWdTOLk5mpFUzIstTQ55eNibqO1gYFGBpmE+RqQPJ\nhq25nufBpbTK5OWpAKjoYIpLPWuquVpRqYYFKw9fYuLGU7TxsGNW9waoVUqKNBpGrjnO9Yo2/DTV\nn9y0PC7GpnEpzpqUM5VI12+B0kpDJat0TEzOYlMUiXn6ITLy9EjP0+P2XX1yi8zRZKlxPZ6O4R9b\nuTtrK+uc9choWJuKrYLwrd+OqqZVy/iVFUII8W+UmZmJpaXlA48nJibSu3dvbt++DcB3332Hn58f\nAFOnTmXZsmUolUratm3LlClTSvoVFRUxYMAA7O3t+fzzzzE1NWXYsGGEh4dTuXJlvvjiC0aPHs3F\nixeZNWsWwcHBj5wrIiKCiRMnYmNjw6lTp/D29mbZsmV/25J7/fp12rZty5EjRzh+/Dienp4kJSVR\nrVo1atSowcmTJ5k2bRqmpqZ8+OGHNG/eHF9fX/bu3Ut6ejoLFiwgICCAnJwc+vfvz/Hjx3FxcSEn\nJ6dkjpUrV/LFF1+g0Who3749U6dOZe3atRw4cICvvvqK2bNnM3v2bM6fP8/58+fp3bs3+/fvf2bv\n0XNLtCgUipVAc8BGoVAkAxMANYBGo5kLhAPtgD+BO0D/5xWLEEIIIV4eRZoi4tPiiT69g7TdO7A9\nkkS9xCL8CuCuoYrb9Wui72xAtYJ9qNVXwcGXfKsWXC70JCmtKlHJBty6mgeAsYU+zg2scKhrhYOr\nFUZm+iXzrIm+xCcbT9HSxZZve3ihVhWvSwlpYE9+gYbR60/wzopjzO3lTf0WDtRv4UBhfhFXzmdw\nKfYmF2PNOJRkySF8MTTRw6GWAoeKqdQxPo1p9km4dAhNvVvc0PMmMa0iNY6ew3RlLKyMJabSV6yv\nZ4legB9uTd/Ep1JDjNXGZfJ6CyGEeIa2joGrJ5/tmJXcoe2UxzbJycnB09OT3Nxcrly5wp49ex5o\nY2try86dOzE0NCQhIYEePXpw+PBhtm7dyi+//MKhQ4cwNjYmLe1/Z9YUFBTQs2dP3NzcGDduHAC3\nb9+mRYsWTJ8+nZCQED755BN27txJbGwsffv2JTg4+JFzARw7dozTp09TpUoVmjZtyv79+/H39/9b\nnLm5uWRmZhIVFYWPjw9RUVH4+/tja2uLsfGDvy8LCgr4448/CA8PZ9KkSezatYs5c+ZgbGxMXFwc\nJ06cKNkydPnyZT766COOHDmCpaUlr7/+Ohs3biQgIIBp06YBEBUVhbW1NSkpKURFRREYGKjjm/Z4\nzy3RotFoejzheQ3wzvOaXwghhBAvj9ScVA6k/E7coXA0+w5TN+42ja4WP3enohmKNxtTObAZFnf3\noTixHIoK0Hj3IN50CGdOF3HlaAaFBUWo9JRUqWWMa1MHqtWzwqqKyUML1244msxHG04QWLsi3/f0\nQl/v75t/ujZ0IL+oiHE/n+LdlUf5LrQ4EaNSK7GvY4l9HUuahMCdzLtcikvjUmwaF+PSSDhtAfhh\nVaU1jq7meFfcg230LGw1R9D0b0qec28unryI7e5dOO9JRrH7V9JMf2VhLRUZjWpTNTCIJs7NqG1Z\nWwruCiGE0JqRkRExMTEAHDhwgD59+nDq1Km/tcnPz2f48OHExMSgUqk4e/YsALt27aJ///4lCQwr\nK6uSPkOHDqVr164lSRYAfX19goKCAHB3d8fAwAC1Wo27uzuJiYmPnQugUaNG2NvbA+Dp6UliYuLf\nEi0Afn5+7N+/n8jISD7++GO2bduGRqMhICDgodffsWNHALy9vUtiiIyMZMSIEQB4eHjg4eEBQHR0\nNM2bN6dixYoA9OzZk8jISN566y2ys7PJysri0qVLhIaGEhkZSVRUVMn4z4psJBZCCCHEM5dfmM+x\n68c4kPgb1/btxvboRbzPaXgzEzQKyKtTDePObbBr/QYGFdUo9s+C6KHFnRv0pMD3PX4LzyV++1Us\nKxnj1qwq1epaUblWBdT6qsfOvfn4ZT5ce5wm1a35qbc3huqHt+/p60h+QRETN8fy/uoYZnfzRE/1\n94SMsbk+dXwrUce3EhqNhpspt7kYe5NLsWnE7L3KhYretBt8CMvkNSj2z8Lw4tvUdvCFmR9RYNmA\n9Ig93N3+C83+OIHesTjyFsRxyHkWS+uaYxDYFG/XljSp0gRLwweXgAshhHgJPWHlyYvQpEkTUlNT\nuXHjxt8e//rrr7Gzs+P48eMUFRVhaGj4xLH8/PzYu3cv//d//1fSXq1Wl3wZoFQqMTAwKPl3QUHB\nE+e61x6K66bc63O/wMBAoqKiSEpKokOHDkydOhWFQkH79u0fGue9MR81nrb8/PxYtGgRderUISAg\ngIULF3LgwAFmzpxZ6jEfRhItQgghhHgmNBoNB68cZGN0GAX7DuFxJo/ACxoM86HQQA+lrzeV2ryJ\nWbNm6NnYwM1zEPUVrFoJShV494Wm73MbW8LnnuR6YiY+7Z1o1N4ZhVK71R/bTl3h/dUx+DhaMb+v\nzyOTLPf0a+pMfqGGyeFxqJUKZnb1RPWIuRQKBTb2ptjYm+L1uiOXE26x7adTrJtxktYDO+M0oh8c\nWwr7ZsGyTuhV9cYmcDQ2HZdSlJ/PnT+iub5jC557I2j4Szr8Es6flcOZXUvJLZ+aNPLvQkitjrLF\nSAghxGPFx8dTWFiItbU1d+7cKXk8IyMDe3t7lEolYWFhFBYWAtC6dWs+/fRTevbsWbJ16N6qloED\nBxIZGUnXrl3ZsGEDenrapQgeNZe2AgICGDduHIGBgSiVSqysrAgPD+fLL7/UeozAwEBWrFhBixYt\nOHXqVEmx4EaNGjFixAhSU1OxtLRk5cqVvPvuuyXzjh8/nvHjx9OgQQP27t2LkZERFhYWOsX/JJJo\nEUIIIcRTKSgqYHvidn6J/AmPrQn0PqlBVQSFNhUwD2mJVavXMfb1RXnvG67UBNgwDk6uAZU+NBoC\nTUeAeRWuns9g69xo7uYVEjTUjRoNbLWOY1fsNYavOEZ9ewsW9m+Isb52f+YMDqzO3cIipm8/g1ql\nZGonD5RaJHaq1LKky9iGhM85wa8/nKBxh+p4tRmEwqsvHF8BUTNhZTeo5IGy2UeY+rXD1L8pGo2G\nvLNnydy9G83OrdSM/BMiz5KwcjIjW3yDW/ve9HANxdrIWutrF0II8e92r0YLFH+xERYWhkr19y8T\n/vOf/9CpUyeWLFlCUFAQJiYmAAQFBRETE4OPjw/6+vq0a9eOL774oqTfyJEjycjIoHfv3ixfvlyr\neB41l7acnJzQaDQltVH8/f1JTk5+aJHfRxk2bBj9+/fH1dUVV1dXvL29AahcuTJTpkzhtddeKymG\n26FDB6A40XLp0iUCAwNRqVQ4ODjg4uKiU+zaUBSXSik/fHx8NPeK7JRHcqSbeNXJPSBedf+me+BO\n/h3WJ6wnPGoRAbuvEnhKg0Klh2XXLlh17oKBi8vf65Bcj4PI6XBqA6iNwGcA+I0AMzsAYvdf5reV\nZzCtYEC7YR5YVzXVOpaIM9cZsuQIrpXNWDrIF3NDtc7XM2vXWWbtSqBHo2p8EeKmdQ2V/LuF7F0S\nR8Lh69T0tqVFH1fUBioozIcTayBqBqSdBzs3CPwQXDuA8n9blApu3CBzxw6uzpuL4moqf1aGjYEG\nOLYJoa9bPxzNHXW+lpfZv+keEEJX8vkvn+Li4nB1dS3rMP4VtD3e+WXwsPddoVAc0Wg0Pk/qKyta\nhBBCCKGT1JxUVsStYO+BFbSOyOST0xoUemqsenbDetBg1Hb/WIVy9ST8Ng3iNoG+Kfi/D02Gg4kN\nAIWFRexf+ycnI5Kxd7GkzWA3DE20T5TsS0hlyNIj1LIzZcmA0iVZAN5rWYu7BUX8EHEOfZWCicH1\ntEq2qPVVtB5YDxsHMw5sPMeta3do97Y75jZG0KAneHSD0xuKk0xr+0FFFwgcBfVCQKlCr2JFrHr2\nxLJLF9J/+QV++J4PV1/jXORqJjRdS4UWLenvPoD6FeuX6rqEEEII8WJJokUIIYQQWrmQcYGw02Ec\nit5I8L67fH4aFHp6WPfugdXAgaht/5FguXwMfpsOZ34FA/Pi5ELj/4Dx/047yMm6y/Z5p0g5m079\nVg74hdRA+Y+CtI9z8PxNBi2JprqNCUsH+mJhXLokCxTXYBnVpg75hUXMi7qAWqVkXHtXrZItCoUC\nrzaOWNubsmP+adZ+eZigIW5UrWMJKj3w6ApunSB2Y/Frsn4gRHwJAR+CexdQ6aHQ18eySxcqvPUW\nGb/8gnLOD3y07gqJ+3fzddNdaPy86efWn2YOzVAqtH+NhBBCCPFiSaJFCCGEEI917PoxFp1aRHzM\nHjofgJmnilDo62PVuzvWgwai99fxiSWSj8BvUyFhOxhaQPOPwXcoGFX4W7Mbl7LYOuckdzLv0qqf\nK3UaV9YprsOJaQxYHI29pTHLBvliZaL/tJeKQqHg43au5BdqmL/vAmo9JaPb1NF6G5FjPWu6jPEh\nfM4Jfpkdg3+Xmrg3ty/ur1QVJ1vqhkD8luJVPhvfht+mQMD/Qf0eoFKjUKup0LkzFh06kLFpE3pz\n5vDRuhQu/R7DkibD+dqnOn3r9eONGm9goDJ4clBCCCGEeKEk0SKEEEKIBxRpith7cS+LTi/ienwM\n3Q+qePtkEQoDfaz6hWI9cEDxyUF/61RUvEojchoYWUHL8dBwMBiaPzB+wuFr7AmLw8BETciHXtg5\nPdjmcWIupdNvUTR25oasGOSLjemzSzgoFAomvFmXu4VFzIk4h75KyQeta2vdv4KdMZ0/8mHnolii\nVieQeimbZj3qoFL/tQpFqYS6weD6JpzZWvx6bXoXYlZA1yVgWrwySKFWU6FTJyyCg8nYvAX1nDmM\nXn+JyweTWd54PN+6f0Over3pUrsLFgbP9rQEIYQQQpSeJFqEEEIIUSKvMI9N5zax5PQS7l64QK9D\nhnifLEJpoMayf3+sB/R/MMECkJsBG4bA2W3g2RPaTgODB4vZFhVpOPTLeY5uT6JyDQvaDHHDxEK3\nJMmplAx6LziElYk+Kwb7YmtuWNrLfSSFQsHnHdzILyhi9u4E9PWUvPNaTa376xvp0e5td/7YcoHD\n4YmkXblN26HumFS471oVCnBpB3Xawsm1sGkE/NgMui0De+//NVOrqdAxBIvgN0sSLqPWX+TGwdss\n9v2aeXV/pGPtzvSp24fKprqtChJCCCHEsyeJFiGEEEKQkZfBqvhVrIhfgVHyTQYcNsMtpgilYdFf\nCZYB6Fk/4rjhG2dgVSjcSoR2M6DhoOIkwj/k3clnx4JYLp6+Sd2AKgR2q41KT7daI3FXMum14BDm\nhmpWDPalsoVRKa5WO0qlgimdPCgo0vx19LOCIYE1tO6vUCrwDa6OjYMpuxbHsebLaNq+7U4l53+s\nPlEoimu42LoWv46LgqD9V+DV++/N9PSoEPIWFm++QcaWLejPmcuoDUmk/aFkcaNltItbQZvqbelf\nrz91rOo8i5dACCGEEKUgldSEEEKIV1h+YT4/Hv+R1uta8/Oub/lgE3w1vwiPM3nYDBxAzd27sBs1\n6tFJlrgtMK9l8YqWPpug0eCHJlluXb3NuqlHSI5Lo1loHV7r6aJzkuXstSx6zj+EkVrFysGNsbc0\nLs0l60SlVDC9swftPSrzRXg8i/Zf0HmMGg1s6TzaGz21kp9nHiXu98sPb1jJHYb8Bo5+sGk4/Pp/\nUHD3gWYKPT0qvPUW1X/dQpVpU6mkZ8XIDQXMXWZC1rYddNnUiXf3vMvl7EfMI4QQotwxNf37KtHF\nixczfPjwFzb/5cuX6dy58wuZ6/Dhw4wYMUKnPhMnTmTGjBnPKSLdyYoWIYQQ4hV17PoxJv0+icyk\nPxkfbUuNI9kojLKxGjQIqwH90bO0fHTn++uxVPGCbkvBwv6hTRNPpLJz4WlUaiUdPvCkSq3HjPsI\n525kEzrvEHpKBSsGN6aa9fNPstyjp1Iyq5snBYVFTNoci1qlpFdjR53GsK5qSpcxDdk+/xR7lsST\neikbv841Uf3zhCVjK+i5HnZPgt+/gWunoUsYmNk9MKZCTw+L4GDM27cnMzwc/R/mMHz9Bfo7WPOT\n337euvIWwz2HE+oaip5S/uQTQghRelWqVGHdunUvZC4fHx98fHxeyFzPi6xoEUIIIV4xmXcz+fTA\np/QJ743Hwet8u1iPmrEZWA8eTM3du7D9v5GPT7LkpMOqHsVJFs+e0H/rQ5MsGo2Gw+GJ/DrnBBa2\nxnQZ27BUSZbE1NuEzjsIaFgx2BdnGxOdx3haapWSb3t40dLFlk82nmJN9CWdxzA0VfPmu/Wp39KB\nE3uT2fxNDDnZD65YQaUHr38GnRbA5Rj4qTkkH37kuAqVCos336T6ls1UmT4dSz1zPlidw5jtJny3\nbxqhv4YSezNW53iFEEKUD5s3b8bX15cGDRrQqlUrrl27BhSv8ujbty8BAQE4OjqyYcMGRo8ejbu7\nO0FBQeTn5wPg5OTE2LFj8fT0xMfHh6NHj9KmTRtq1KjB3LlzAUhMTMTNzQ0oXk3TsWNHgoKCqFWr\nFqNHjy6JZcGCBdSuXZtGjRoxePDgh666cXd3Jz09HY1Gg7W1NUuWLAGgT58+7Ny5k4iICN54442S\naxgwYADNmzenevXqfPPNNyXjTJ48mdq1a+Pv78+ZM2dKHo+JiaFx48Z4eHgQEhLCrVu3uH79Ot7e\nxfXPjh8/jkKh4OLFiwDUqFGDO3fuPJs34y/y9YYQQgjxitBoNOxI2sGUP6ZQlHqTbyMrYxeTjHGj\nRlT58gvUVas+eZDr8cV1RNKTHluP5W5uAXuWxHHu6A1qNbTjtd4uqPVVOsd8Ke0OofMOcregiJVD\nGlPT1kznMZ4VfT0l3/f0YsjSI3y04QR6KgUdvR6+iudRlCol/l1qYeNgSsSyM6z98jDthrljY/+Q\n63LvDBXrwKqesKjtQ+u23K844fIG5m1e58acObj+NI8FF8z4rt0letzqQS/XXrzj+Q7G6he3GkgI\nIf5tpv4xlfi0+Gc6pouVCx81+uixbXJycvD09Cz5OS0tjeDgYAD8/f05ePAgCoWC+fPnM23aNGbO\nnAnAuXPn2Lt3L7GxsTRp0oT169czbdo0QkJC+PXXX3nrrbcAqFatGjExMXzwwQf069eP/fv3k5ub\ni5ubG2+//fYD8cTExHDs2DEMDAyoU6cO7777LiqVis8++4yjR49iZmZGixYtqF+//gN9mzZtyv79\n+3F0dKR69epERUXRp08fDhw4wJw5c4iOjv5b+/j4ePbu3UtWVhZ16tRh2LBhnDhxglWrVhETE0NB\nQQFeXl7Mhh7FAAAgAElEQVQliZQ+ffrw7bff0qxZM8aPH8+kSZOYNWsWubm5ZGZmEhUVhY+PD1FR\nUfj7+2Nra4ux8bP93SiJFiGEEOIVcDn7MpMPTSYyOZJOl6rQdZMByrwb2H48FstevVAotVjkGrcF\nfh4KaiPou7m4lshDZKbmED7nJGmXs/HrWBPP1g4oHpKMeWLM6TmEzj/I7buFrBjsi0sl3Y6Afh4M\n1Sp+6u3NgMXRfLj2OGqVkjfrV9F5HJfGlbGsZMLWuSdZP+0ILfvWpaa37YMNK7nDkAhYN6C4bsvl\nYxA0BfT0Hzm2Ql8f2/few+y117g8+iPeD0skoVUtJt0NY1fSLsY1HkegfaDOMQshhCg7RkZGxMTE\nlPy8ePFiDh8uXu2YnJxMt27duHLlCnfv3sXZ2bmkXdu2bVGr1bi7u1NYWEhQUBBQvKokMTGxpN29\npI27uzvZ2dmYmZlhZmaGgYEB6enpD8TTsmVLLCyKi7vXrVuXpKQkUlNTadasGVZWVgB06dKFs2fP\nPtA3ICCAyMhIHB0dGTZsGD/99BMpKSlYWlpiYvLgqtX27dtjYGCAgYEBtra2XLt2jaioKEJCQkoS\nJPfiz8jIID09nWbNmgHQt29funTpAoCfnx/79+8nMjKSjz/+mG3btqHRaAgICNDmLdCJJFqEEEKI\nf7GCogJWxK3gu5jvMM7R8MOh2thExWLo7k6VqVMwqF79yYM8UI9lGVg8fPVL+vU7rJ96BI1GwxvD\n61Ot3iOK6D7BtcxcQucdJP12PssG+VKvisWTO70ghmoV8/v60G9RNO+vjkGtUhDkpvuxynZO5nQZ\n68O2H0+xfd4pcrNr49bsIStkjK2g57r/1W25HvvIui33M/LwwPnnDVz/6mtqLV3KkjOVmfOmhnd2\nv0MbpzaMaTQGG6OHHNUthBDikZ608qQsvPvuu4wcOZLg4GAiIiKYOHFiyXMGBgYAKJVK1Gp1yRcf\nSqWSgoKCh7a79++HtftnewCVSvXQNo8SGBjI999/z8WLF5k8eTI///wz69ate2TC42nm+ue8UVFR\nJCUl0aFDB6ZOnYpCoaB9+/alGu9xpEaLEEII8S8VezOW0F9DmX54Oh1vOjM3zACbA2exGfEuTitX\naJdkyUmHld3/qsfS6696LA9PsuTfLWTbj6fQoKHzRz6lTrLcyMojdN5BbmTlsXhAI+o7VCjVOM+T\nsb4eC/s1pL69BcNXHGNX7LVSjWNiYcBbHzTA0d2aqDUJXD2f8fCG9+q2dF4IV47DT80eW7flHqWR\nEZXGfUy1xYvQL4B35qYwPb4Bv13YTfDGYNaeXUuRpqhUsQshhHg5ZGRkUPWv7b9hYWFlFkfDhg35\n7bffuHXrFgUFBaxfv/6h7RwcHEhNTSUhIYHq1avj7+/PjBkzCAzUfrVlYGAgGzduJCcnh6ysLDZv\n3gyAhYUFlpaWREVFAbB06dKS1S0BAQEsW7aMWrVqoVQqsbKyIjw8HH9//6e88gdJokUIIYT4l7mT\nf4cZ0TPo8WsPMm5dZcGJRnT44QRqiwo4rVpFxf/8B4WeFotar8fDvBZwbndxPZYO34Ha8KFNNRoN\nkSvOcPNyNq0H1KOCXen2Ot/MzqPn/INcTs9lUf9GeDvqXjz3RTE10GPxgEbUq2LOf5YfJeLM9VKN\no1IradWvLqaWBmyfd4qcrIcUyL3HrRMM3AEq/eK6LUeXaDWHSePGVN/0CxYdOuD4czRLN1TBP7ca\nnx74lP7b+nM+/XypYhdCCFH2Jk6cSJcuXfD29sbGpuxWKlatWpWPP/6YRo0a0bRpU5ycnEq2F/2T\nr68vtWvXBooTICkpKTolPLy8vOjWrRv169enbdu2NGzYsOS5sLAwRo0ahYeHBzExMYwfPx4oLvqr\n0WhKEjr+/v5UqFABy8cdAFBKCo1G88wHfZ58fHw09/ailUcRERE0b968rMMQoszIPSBedc/7HohM\njmTywclcvn2ZoYpmvL70DIXJKVj160fF999Ded/y28e6vx5L1yWPrMdyz+moFCKWn8GnvRO+b2qx\nUuYh0u/cpce8Q5y/kc2i/g3xq1E+trVk3MkndP5BEq5ns7BvQ/xrlS7uGxezWD/tCJVrWvDmCE+U\nysfUtbmTVly35fxe8Bn4xLot98vavZsr/x1PUVYW13q15BOHP8guvMMg90EMch+EgUrLz0gpye8B\n8SqTz3/5FBcXh6ura1mHUS5kZ2djampKQUEBISEhDBgwgJCQkJLns7KyMDMru8L2unjY+65QKI5o\nNJonnj0tK1qEEEKIf4HUnFRG/TaKd3a/gwn6LE8MouWXe1BqwHFJGHYfjdYuyVJUBHsmw+qeYFMb\nhvz2xCTL9aRMIlefxaGuFQ3bOz+27aNk5OTTe8EfnLuezbw+PuUmyQJgYaxm6UBfqtuYMGhJNAfP\n3yzVOBWrmRHYozbJ8beI3nLh8Y3v1W3xGwGHF0DYm5Cl3fYls5Ytqb55E6bNm2G7aBuLNtvTycSf\nucfn0nlTZ6KvRj95ECGEEOIhJk6ciKenJ25ubjg7O5ecavSqkUSLEEIIUY4VaYpYd3YdwRuD2X1x\nN6MrdGX6EgXqlVuo0Lkzzhs3YnzfctrH0qEeyz25t/PZ9tMpjM30aT2g7uNXYTxCVm4+/Rb9QfzV\nTOb29iKwdkWdxyhrVib6LBvki72lMQMWR3M4Ma1U49RtWgXXppU5HJ5I4snUxze+v27L1RNa120B\n0LO2puo331Bl6hQKE87T+fPfWZQbSn7hXQZsH8D4/ePJyHtEvRghhBDiEWbMmEFMTAzx8fF88803\npTp18N9AEi1CCCFEOXU+/Tz9t/Vn0oFJuJjXZnVaV3w+WUvhrVs4/DiXyp99isr0wWMSH0qHeiz3\naIo07FoUy+30PIKGuGNkqt3WlfvdzitgwOJoTiZn8H2oFy1cHn+SzsvMxtSAFYN8sTM3pN+iaGIu\nPXgcpjYCu9XGxsGUXYtiyUzNeXKHUtZtUSgUWHToQPXNmzD2rI/J10uYu92BYVW7sencJoI3BvPr\n+V8pb9vMhRBCiLImiRYhhBCinCnSFDH/5Hw6be7En+l/8qXjCP67JJeCOWGYt25F9U2bMP2rwr5W\nzkfA/JaQlwV9t0CjwaDFN1BHtiWRdOom/l1qYedsrvN15NwtZGBYNEeSbjG7ewNer1dJ5zFeNrbm\nhqwY7IuViT69FxziVIruq0L09FUEDXEHYNtPpyjIL3xyp0ruMCQCnPxh07uwbSxomSBRV66Mw/z5\n2P33E3Kjj9By3BZWGQynqmlVxkSN4T+7/0NabulW6AghhBCvIkm0CCGEEOVI9t1sPtj7AbOPzqZF\n1ddYlduXmu//wN3ERKrMnEHVr75CT5fq+cmHYWUoVKhW/D/qjk206nYpLo1Dm89Tq6Edbs0ev73o\nYXLzCxmy9DCHLqTxdTdP2ntU1nmMl1VlCyNWDPbF3FBNrwWHiLuSqfMYFhWNaNmvLjcuZhG1JkG7\nTvfqtjQaCgd/gL2TtZ5PoVRi1bMnzj9vwMDJCc2EmUzbZcc4lxFEX42m25ZunL55WufrEEIIIV5F\nkmgRQgghyonzGecJDQ/lt+TfGOf8NiOWppM99WuMGzWk+qZNWLRvr9uA1+NgeWcwrQi9f35iPZZ7\nsm/lsmPBaawqm/BaLxed91/nFRQybNkR9v2ZyvTO9engqXui5mVnb2nMysGNMdRT0XP+Ic5ey9J5\nDGcPG7yCHImNukz8gSvadVKqoO1UaNAbIqfDgR90mtPA2RnH5cuo+P77ZO3ajdeHS1hS4X0UKOgT\n3oeNf27U+TqEEEKIV40kWoQQQohyYPfF3YT+GkpGXgYLqo3F6+NV5Bw/TqVJk3D48UfUdra6DXgr\nCZaGFNf16L0RzLTbtlNYUMS2n05RmF9E0BA31AYqnabNLyxi+Ipj7D1zgy9C3Onsba9b3OVINWtj\nVg5pjJ5SQei8Q5y7ka3zGL5vOlO1TgUiVpwhNVnLZI1CAW/MAtc3YftYiFmp05wKPT1s3h6K85rV\n6FWwRPHhZBbceIMGtp78d/9/+fzg5+QX5ut8LUIIIUrP1NT0bz8vXryY4cOHP/N5xo8fz65du575\nuA8zaNAgYmNjderzz9fhZSWJFiGEEOIlVlhUyDdHv+H9ve/jbO7MUuPhmLw/BaWhIc5r12DZravu\nFf2zrxcnWfLvFK9ksdL+SObf1//JtQuZtOjjimUlLQvt/qWgsIj3Vh1jZ+w1Pu1Qjx6NqukWdznk\nbGPCisG+gIbQeQdJTL2tU3+lSsnrA90wNNZj24+nyMsp0K6jSg86LQDnZvDLOxAfrnPshq6uOK1b\ni3n79mTPnsOkfZUZUKcvq8+sZuCOgdy4c0PnMYUQQrzcPv30U1q1avVC5po/fz5169Z9IXO9aJJo\nEUIIIV5SGXkZvLPnHeadnEfHmiHMutaS26MnYFCnNk6rV2FQo4bug+ZmwLKOkHkZQteCXT2tuyZE\nX+PE3mTqt3CgprduK2gKizSMXHOc8JNX+aS9K32aOOkYePlV09aMZYN8uVtQROi8g1xKu6NTf2Nz\nfdoMdiPrZi67F8dqfwqQngF0Xw6V68PafpC4T+fYlQYGVJk+Deu3h5K5dj2d5sUzw/tT4tPi6bal\nGzHXY3QeUwghxLO1efNmfH19adCgAa1ateLatWsATJw4kQEDBtC8eXOqV6/ON998A0BiYiKurq4M\nHjyYevXq8frrr5OTU3zKXb9+/Vi3bh0ATk5OTJgwAS8vL9zd3YmPjwfgxo0btG7dmnr16jFo0CAc\nHR1JTU39W0xr165l5MiRAMyePZvq1asDcOHCBZo2bQpA8+bNOXz4MFC8UmXcuHHUr1+fxo0bl1zD\nhQsXaNKkCe7u7nzyyScl42s0GkaNGoWbmxvu7u6sXr0agHfeeYdNmzYBEBISwoABAwBYuHAh48aN\ne2av+ZPovbCZhBBCCKG1M2lneH/v+1y9c5X/NvyYgLUJpK2cidnrr1Nl2lSUho8/evmh8nNgZY/i\n2iw9VkM1X627pl25zZ5l8VSuYUGTTroleIqKNIxed4JNxy/zUZALgwKq6xp5uedSyZxlg3wJnXeI\nHvMOsmZoE6pUMNK6f+WaFfDrVJN9axM4tvMiXq87atfRwKy4QO6itrCiO/T/tTjxogOFUont+++j\n7+DAlQkTqTX2OsumzeL9uM/pv70/YxuNpUvtLrqvrBJCiHLo6hdfkBcX/0zHNHB1odLHHz+2TU5O\nDp6eniU/p6WlERwcDIC/vz8HDx5EoVAwf/58pk2bxsyZMwGIj49n7969ZGVlUadOHYYNGwZAQkIC\nK1euZN68eXTt2pX169fTq1evB+a1sbHh6NGj/PDDD8yYMYP58+czadIkWrRowdixY9m2bRsLFix4\noF9AQADTpk0DICoqCmtra1JSUvj9998JDAx8oP3t27dp3LgxkydPZvTo0cybN49PPvmE9957j2HD\nhtGnTx++//77kvYbNmwgJiaG48ePk5qaSsOGDQkMDCQgIICoqCiCg4NJSUnhypUrJTF07979sa/x\nsyQrWoQQQoiXzNYLW+m9tTd5hXksCviBxrMjSF+5EquBA6g66+vSJVkK82Ftf0j6HUJ+hFraLwu+\nm1vAth9PotZX8vogN1Qq7f98KCrS8PHPJ1l/NJmRrWszrHkpVuH8S9SrYsHSgY3IuJNP6LyDXMvM\n1am/Rwt7anjZcnDjeVLO3tK+o4l18RYxowqwtCOk/qlj5MUqdOpEtZ9+JP/KFRjyEWHOE2hSuQmf\nHfyMCb9PIK8wr1TjCiGEeDIjIyNiYmJK/vv0009LnktOTqZNmza4u7szffp0Tp/+3ylx7du3x8DA\nABsbG2xtbUtWijg7O5ckbry9vUlMTHzovB07dnygzb59+0qSFkFBQVg+5LTDSpUqkZ2dTVZWFpcu\nXSI0NJTIyEgOHDhAQEDAA+319fV54403Hphr//799OjRA4DevXuXtN+3bx89evRApVJhZ2dHs2bN\niI6OLkm0xMbGUrduXezs7Lhy5QoHDhzAz8/via/zsyIrWoQQQoiXREFRAbOOzCIsNowGtg2Y5jqG\nOx98wu2zZ6k0cSKW3buVbuCiIvhlOJzdCu1ngntnrbtqNBoilsWTfu0Owe95YmppoFPfCZtOsyr6\nEu+2qMmIlrVKE/2/iod9BRYPaESfBYcInXeQVUOaUNFMu9dUoVDQorcLN1Oy2T7/NN3GNcTEQsv3\nw6JqcdHjhW1g6VswYLvWp0zdz8TPD6eVK7g09G1uDhjGlJnTWeJRlx9P/EjCrQS+fu1rKploV1hZ\nCCHKoyetPCkL7777LiNHjiQ4OJiIiAgmTpxY8pyBwf9+T6hUKgoKCh76+L2tQ/90r939fbXl5+fH\nokWLqFOnDgEBASxcuJA//vijZAvT/dRqdcnKyH/OpcuKyapVq5Kens62bdsIDAwkLS2NNWvWYGpq\nipmZmU7xPw1Z0SKEEEK8BNJy03h759uExYbRvU53fqg2mqy+/yE/KQmHuXNKn2TRaGD7x3BiFbz2\nCTQcpFP3kxHJJBy+jm+H6ti7WOkwrYbPtsSx9GASQ5tVZ2Tr2rpG/q/l7WjJov6NuJyeS8/5B7mZ\nrf1KEH0jPYKGupGfW8D2eacoLCzSfmKbmtBrPeSkFxdDvn2zFNGDQa1axTWCatYkZfgIQk9VYPZr\ns7mQeYFuW7oRfTW6VOMKIYQonYyMDKpWLU6eh4WFPff5mjZtypo1awDYsWMHt249fJVlQEAAM2bM\nIDAwkAYNGrB3714MDAywsLDQaa5Vq1YBsHz58r+NvXr1agoLC7lx4waRkZE0atQIgMaNGzNr1qyS\nrUQzZsx46Cqa50kSLUIIIUQZO33zNN23dOfY9WN83vRz3rsbQErvvgA4rliO6dP8cRA5Aw7NAd9h\nEPihTl2vns9g/7o/cfKw0b4mCMVJlinb4lm4/wL9mzoxJshF6nf8QyNnKxb09SHp5h16LfiD9Dt3\nte5rXcWU13q5cOXPDA5uPK/bxFU8IXQV3EqE5Z0hT8sjo/9Br2JFHJeEYdriNa5NnkzdpQdZHrQU\nCwMLBu8YzJLTS7Qv2iuEEOKpTJw4kS5duuDt7Y2Njc1zn2/ChAns2LEDNzc31q5dS6VKlR66WiQg\nIIBLly4RGBiISqXCwcGBxo0b6zTX7Nmz+f7773F3dyclJaXk8ZCQEDw8PKhfvz4tWrRg2rRpVKpU\nqWTegoICatasiZeXF2lpaS880aIob78EfXx8NPcqE5dHERERNG/evKzDEKLMyD0gXnX/vAc2/rmR\nzw58hrWRNV+/9jVVdp7k6mefY1CnNg5z5qC2syv9ZNHz4df/A4/u8NYcUGr//UpO1l1WT45Gpaeg\ny9iGGJqote771Y4zfLPnT3o1rsZnHdwkyfIYkWdvMCjsMHUqFZ9MZGGk/escufIMJ39LIWioGzUa\n6HYKFPHhsLoXOPlDz7XFJxSVgqawkOvTppMWFoZpixZU+HIS449OZtfFXbRzbsdEv4kY6f296K/8\nHhCvMvn8l09xcXG4urqWdRgvjby8PFQqFXp6ehw4cIBhw4YRE6PdKXRZWVkvdAvP03jY+65QKI5o\nNBqfJ/WVFS1CCCFEGcgvzGfywcn8d/9/aWDbgJXtVmAz/1euTpyEqb8/TkuXPl2S5eQ6+PVDqN0W\nOnynU5KlqEjDjgWnyc3OJ2iIu05Jlm93J/DNnj/p3tCBT4MlyfIkgbUrMre3F/FXM+m36A+ycvO1\n7tu0cy1snczZHRZH+jXdjozGpV3x5+LCb7B+EBQV6hh5MYVKhd3YMdj99xOyIyJI7T+UaXXH8p7X\ne8VFncN7cynrUqnGFkII8XK6ePEiDRs2pH79+owYMYJ58+aVdUgvHUm0CCGEEC9Yak4qA3cMZNWZ\nVfSr148f/L8m56NPSVu0CMvQUOy//w6liUnpJ0jYCT8PBUc/6LIIVNonSgCit1wgOf4WgT1qU7Ga\n9t86zf3tHDN3nqWjV1W+CHFHqZQkizZauNjxXagXJ5MzGLA4mtt52hUbVKmVBA0pPgVq208nyb+r\nY7LEMxTafAFxm2Dze8X1fErJqmdP7H/4nrzERBK7d6eXfiA/tPqBK7ev0H1Ld35P+b3UYwshhHi5\n1KpVi2PHjnH8+HGio6Np2LBhWYf00pFEixBCCPECXci7QNfNXYlPi2d64HTec+pLSv9BZO3aVbIy\nQKH3FIcCXjwEq3uDbV3osRLURk/uc5/Ek6kcDk/E1a8ydZtW0brfgn0XmLI1nuD6VZjeub4kWXTU\npl4lZndvwJGkWwwMiyZHy6SJmZUhrQfW5ebl2/y2/IzudVGavAMBH8KxpbBrou6B3x9L8+Y4LVsK\nhYUkhYbieUHBqjdWUcmkEm/vepv5J+dL3RYhhBCvBEm0CCGEEC/I2rNrmX11NgYqA5a1W8ZrRbVI\n7NadvLNnsf/2G6z69n26rTZXT8GKLmBeBXptAEPtq/oDZKbmsGtRLDYOpgR21/6UoKUHEvlsSyxt\n3SrxVdf6qCTJUirtPSrzdTdPDl1IY8jSw+Tma5dsqVbXmkZvOHPm0FVOR13WfeIWn4B3f9g/C/bP\n1r3/fQzr1sVpzWrU9vZcGjoU060HWNp2KUHOQcw+OpuRESPJK9L+lCUhhBCiPJJEixBCCPGcaTQa\n5h6fy6cHPqW2YW1WvbGKqmdukdgjlKK8PByXLsGsVaunmyTtPCzrCGoT6LMRTCvq1L0gv5BtP51C\no4GgIe7o6au06rfqj4v895fTtHK145seDdBTyZ8WT6ODZ1WmdfIgKiGVYcuOkFegXbLFp60T1epZ\nEbXmLNeTMnWbVKGA9jOhXkfYOR6OLilF5P+jrlQJx+XLMfHz4+r4CWR/M5cpTb9klM8o9lzaw/fX\nvyfzro4xCiGEEOWI/DUkhBBCPEcajYaZh2fyfcz3BNcIZqjtUDThe7k4aBB6thVxWrUKI3f3p5sk\n6yosDYHCu9D7Z6hQTechotYkcONiFq36uWJRUbvtRuuOJDP255M0r1OR73s2QC1Jlmeii48DX4S4\ns/fMDYavOEZ+YdET+yiUClr3r4exuT7bfjxFbrb2RXUBUKog5Eeo0bK4XkvsplJGX0xlaoLDnB+o\n0L0bN+fN4/KHH9KrRldmNpvJxbyLDNw+kJs5N59qDiGEEOJlJX8RCSGEEM9JYVEhkw5MIiw2jB4u\nPfjU71PMN4dzZexYjBv64LRiBfr2VZ9ukpxbsLQjZN+AnuvB1kXnIRIOXyM26jJeQY4419duJcwv\nMSmMXnecpjVsmNvLGwM97VbACO2E+lZjUnA9dsZe471VxyjQItliaKomaIg7tzPz2LM0TvdJ9fSh\n21Ko6g3rB8L5CN3HuI9CT49KEyZgO2oUWVu3cbFff5qbeTHUdiiJGYn029aPq7evPtUcQgjxqjA1\nNS35d3h4OLVr1yYpKemR7Tdt2sSUKVNeRGh/M2jQIGJjY3Xqc/+1/VtIokUIIYR4DvKL8hkbNZb1\nCesZ7D6YMV6juDpmLKbh4Vh07Ei1H39EZW7+dJPcvQ0rusHNBOi+HOy9dY8zr5D96/6kYjUzfN90\n1qpP+MkrjFxznEbOVszr44OhWpIsz0NfPyc+ae9K+MmrjFxznMKiJxeStXMyx/fN6lw4nkrS6VKs\nGNE3gdA1YF0TVvWElCOliPx/FAoF1gMHUHX2bHLj4kjs1h23bBt+bP0jqTmp9N3al4uZF59qDiGE\neJXs3r2bESNGsHXrVhwdHR/ZLjg4mDFjxjzVXAUF2p2Cd7/58+dTt27dp5r330ASLUIIIcQzlleY\nx8i9I9mauJUPvD/g3frvcGXsx2Ru2kz2m29SefLnKPT1n26Sgruwpg8kR0On+VDjtVINc2RbIrfT\n8wjoVhulFlt/dpy+yoiVx2jgUIEFfRtipGUtF1E6gwKqMzqoDpuOX2b0uhMUaZFsqd/SgQp2xuxb\nk0BhwZNXwjzA2Kq4mLKxNSzrDDfOlCLyvzNv8zqOS8IoyszE8utZuBfYsaDNAnIKcui7rS8JtxKe\neg4hhPi3i4yMZPDgwWzZsoUaNWoAsHnzZnx9fWnQoAH/z959xkdVPQ0c/93d9A5JSAdCL4FICYQe\nKdIEe0NROipNOggKgvTelN4EFbD8rUg1EEpC6L2X9EBISC+b3fu8WB80dLKb0Ob7Su85OzPoJ5+E\nyblzWrZsSWJiIgArV66kb9++AGzYsIGAgAACAwNp2rQpAHq9nqFDhxIUFETNmjVZtGgRAKGhoTRp\n0oSOHTve1jDZsGEDgwYNAmDOnDmUK1cOgIsXL9KoUSMAQkJC2L9/P2A8qTJq1CgCAwMJDg6+Wdul\nS5do0KABNWrUYPTo0Tfjq6rK0KFDCQgIoEaNGqxbtw6APn368OuvxldaX3nlFbp16wbA8uXLGTVq\nlNn++5qTCfdHCiGEEOJWWbos+m/vz76EfYyuP5o3K71B/KjRpP3+O+4DB5JYuZJpNwsBqCr8/gmc\n3wod5kK1lwoVJvVaFoe2RFG5vide5e9/Q9Hfp6/S59uDBPg4s6JrEPbW8mNEcfg4pAK6fJVZW89i\nZaEw4eUa97w+W2uhofEbFfl9/hGO/h1DrVYPP7MHJy/jvJ/lbYzzf3rteOgBy7eyDQzEb/kyLnbu\nzJUuXan4zWpWtllJz8096bqpKwtbLiTALcCkHEIIUdTC1p8lKTrDrDHd/Bxo8ua9b/vLzc3l5Zdf\nJjQ0lCpV/n1NuHHjxoSHh6MoCkuXLmXq1KnMmDGjwGfHjRvHpk2b8PHx4caNGwAsW7YMZ2dnIiMj\nyc3NpVGjRrzwwgsAHDx4kOPHj+PvX/Cka5MmTZg6dSoAYWFhuLq6EhsbS1hY2M0Gzn9lZmYSHBzM\nhAkTGDZsGEuWLGHAgAEMGDCAjz76iPfff58FCxbc3P/TTz9x+PBhjhw5QlJSEkFBQTRt2pQmTZoQ\nFsvQJP4AACAASURBVBZGx44diY2NJT4+/mYNb7/99oP+Zy5WcqJFCCGEMJPU3FR6bu7J/sT9TGg8\ngTcrv0nC2C9I/fln3Pr0wa13L/MkOvQNHF4LTYdBnQ8KHWb3D+fRajU0eKX8ffeGnbtG7zUHqOzp\nyKpu9XC0sSx0XvHw+reoQN/nK/DdvmjG/nYCVb33yZYyAa6UreFK5B+XyEwt5HXKruXh3Q2QmQQ/\n9wJDIU7H3MK2enVS+vVHn5xM1Add8MtzYFXbVThYOtB9U3ciEyJNziGEEE8jS0tLGjZsyLJlywo8\nj4mJoXXr1tSoUYNp06Zx4sSJ2z7bqFEjunTpwpIlS9DrjbfZbd68mdWrV/Pcc89Rv359rl+/zrlz\nxtOF9erVu63JAuDp6UlGRgbp6elER0fTqVMndu7cSVhYGE2aNLltv5WVFS+++CIAderU4fLlywDs\n3r2bd955B4DOnTvf3L9r1y7eeecdtFotHh4eNGvWjMjIyJuNlpMnT1KtWjU8PDyIj49n7969NGzY\nsBD/NYue/CpKCCGEMIOk7CR6b+nNpdRLzAiZQXO/5iR+OYEb69fj2qsXbn37mCdR4gn4cyj4N4OQ\nwr97HXXiOpeOJNHglfLYu1jfc+/eC9fpsWo/5d0dWNO9Ps620mQpboqiMPiFSuj0BhbtvIiFRsNn\nL1a95+moRq9X5LtxEYT/7wItPijk+/Lez0HbKcYTVLtmQNOhhfwT/Cvfvyx+S5YQ1aMHUV27UWb1\nKla1WUWvLb34aOtHzAyZSVPf238zKoQQj4P7nTwpKhqNhvXr19OiRQsmTpzIp59+CkC/fv0YNGgQ\nHTt2JDQ0lLFjx9722YULFxIREcEff/xBnTp1OHDgAKqqMm/ePFq3bl1gb2hoKPb29neto2HDhqxY\nsYLKlSvTpEkTli9fzt69e287RQPG5tD/f5/SarUFZr48zOne/z+J89dff9G0aVOSk5NZv349Dg4O\nODo6PnCc4iQnWoQQQggTxWfE0+WvLkSnRzO/xXya+zXn6pSppKxdS8kuXXAf+InprwsB5KbD+g/A\nxtk4l0VTuPko+nwDYevP4exuS2Bzv3vujbycTPdVkZRxtWNN93q42Jk4W0YUmqIojGhbha6NyrJ8\n9yWm/HXmnidbXDzseK6lH6f3JpBwKbXwiet0gYDX4e+JcCms8HH+w652LUovWoguNpaort1wzbNi\nZZuVlHMux4DtA9h0eZNZ8gghxNPEzs6OP/74g7Vr19482ZKamoqPj/EGw1WrVt3xcxcuXKB+/fqM\nGzcOd3d3oqOjad26NV9//TU6nQ6As2fPkpmZed8amjRpwvTp02natCm1atXi77//xtraGmfn+7+C\n/P8aNWrE999/D8DatWsLxF63bh16vZ5r166xc+dO6tWrB0BwcDCzZ8+++SrR9OnT73iK5nEhjRYh\nhBDCBFfSrvD+X+9zPfs6i1otooFXA67NnEXyypWUePddSg0fZp4mi6rC7wMh+QK8tgwcShU61LHQ\nGG4kZtH4zYpoLe/+o8DBqBS6rojE09mGNT3q4+pw75MvougpisLnL1bjveDSLNxxgVlb7z1Etk7b\nstg5WxH2/VnUBxike5ek0GE2lCxnvPY542rh4tzCLigIv68WkHf5MlHdu+OUq2FZ62XUdK/JsJ3D\n+Pncz2bJI4QQT5OSJUvy119/8eWXX/Lrr78yduxY3njjDerUqYObm9sdPzN06FBq1KhBQEAADRs2\nJDAwkB49elCtWjVq165NQEAAvXv3fqBbhpo0aUJ0dDRNmzZFq9Xi5+dH48aNH+rPMGfOHBYsWECN\nGjWIjY29+fyVV16hZs2aBAYG0rx5c6ZOnYqnp+fNvPn5+VSoUIHatWuTnJz8WDdalPu94/u4qVu3\nrvr/U4yfRKGhoYSEhDzqMoR4ZORrQDxNziSfofeW3hhUA4taLaKqa1WuzZtP0oIFuLz5Jp5fjL2t\nyVLor4H9K4yvbzw/GpoV/vWNzNRc1o4Jx7uCCy/2DbzrvmMxqXRaGk5JeyvW9WqAp7NNoXMK8zMY\nVEb+dIx1+6MZ3KoS/VpUvOveMxEJbF1xkubvV6FqQ+/CJ004DktbgF9946DcQp6ouvVrICMsjJiP\n+2BdpQqlly8jz9aCgX8PZHfcboYFDaNztc53DybEE0Z+DnoynTp1iqpVqz7qMp4K6enpj+3rPre6\n0/93RVEOqKpa936flRMtQgghRCEcvXaUbpu6odVoWdl2JVVdq5K0cBFJCxbg/MoreI4dY56TLAAJ\nx2DjcCjfHJoMNilU+C8X0esMNH7j7n8xPxmXxnvLInC2teTbnsHSZHkMaTQKk16twau1fJix5SyL\ndly4695K9TzwLOfE3p8vkJt9/99W3pVnALSbBpd2wM5phY9zC4cmTfCZM4ecU6eI7tUbqxwDc5vP\npVWZVkyNnMrCIwvvO/xXCCGEeJxIo0UIIYR4SPvi99Fzc0+crJxY3XY15ZzLcX35Cq7Nno1Thw54\nfTkeRWOmb7E5aca5LHYl4ZXFYELcxEtpnN4TT2ALP1w87O6450xCOu8ti8DeSst3PYPxcbEtdD5R\ntDQahWlvBNIh0JtJG0+zfNelO+5TFIUmb1UiO0NH5B933vPAanWGmm9D6GS4GGparP9wbP48PjNm\nkH30KDEffohFbj5Tm06lY/mOLDi8gJkHZkqzRQghxBNDGi1CCCHEQ9gRvYOPtn6El70Xq9quwsfB\nh+Rv1nB16lQc27TBe9JEFG3hXqm4jarCbwMg5dI/c1ncCx/KoBK2/ix2TlbUbVf2jnvOX83g3aXh\nWGoVvu0ZjF/JOzdjxONDq1GY+WYgbQM8Gff7Sb7Ze/mO+0qVcaJaI2+ObY8hJeH+ww7vSlGg/Qxw\nqwg/9oT0xMLHuoVT6xfwnjqFrIMHie7TB01ePuMbjeedKu+w8sRKxoWPQ2/Qmy2fEEI8DGn2PltM\n/f8tjRYhhBDiAf116S8++fsTKpSowIo2KyhlV4qU79eROGECDi1b4DNtKoqFhfkS7l8GJ36C5qOh\nbCOTQp2JSCDxUhoNXi2Plc3tNV5KyqTTknBAYW2PYMq63f1qR/F4sdRqmPN2LVpWLcVnv5xgXWTU\nHfcFv1QOC2stYevPmfYDpLUDvLHKeAvWj93BjM0P5/bt8Zo4gazwCGL69QddPiPrjaRnjZ78cPYH\nRoaNRGfQmS2fEEI8CBsbG65fvy7NlmeEqqpcv34dG5vCvzptxp8GhRBCiKfXj2d/5Iu9X1CrVC0W\ntFiAg5UDN378iYSxY3Fo1gyfmTNRLC3NlzDuMPw1Eiq0gkYDTQqVl53Pnp8v4OHvROV6nretRydn\n0WlJOPkGle97BVOhlINJ+UTxs7LQsODd2vRafYARPx3DQqPhtTq+BfbYOlpR70V/dm04x+WjSfgH\nFv6EFB7VjCdbfvnY+BpR81Em/gn+5fLyy5CfT/zoz4gd8Am+c2bTv3Z/7C3tmX1wNtn52UwPmY61\nVm7BEkIUD19fX2JiYrh27dqjLuWJl5OTY1IDo7jY2Njg6+t7/413IY0WIYQQ4j5Wn1jNtP3TaOTT\niFkhs7C1sCX111+JHz0a+0aN8Jk7B42VlfkS5qTChi5g7w6vLDJpLgtA5J+XyU7Po/3HNVE0BQf0\nxt7I5u3F4WTl6fmuZzCVPJ6MmwDE7awttCzqXIceq/Yz9IcjWFpo6BhY8JahgBAfTuyKY9eGc/hV\nK4mFpQmvudV6F67sNg7GLR0MFVqY+Cf4l8vrr6PqdCR8MY7YwUPwmTmD7jW6Y29pz4SICfTZ2oe5\nzediZymvtwkhip6lpSX+/v6PuoynQmhoKLVq1XrUZRQ5eXVICCGEuAtVVfn68NdM2z+NVmVaMe/5\nedha2JK2cSNxI0ZiV68evvPnobE242/WVRV+7Qc3ouD15WDvalK4lIRMjm6LpmpDLzzKOhVYS0jN\nodOScNJydKzpXp9q3k53iSKeFDaWWpa8X5egsiUZuO4wG4/FF1jXajU0ebMiaUk5HN4abXrCdtPB\nvQr81AvS4u+//yGUeOcdPD4dSfqWLcQNH4Gq1/N2lbeZ2Hgi+xP303NzT1JzU82aUwghhDAHabQI\nIYQQd7Ho6CK+OvIVL5V/ialNp2KptSRtyxZihwzFtlYt/L7+Co2tmW/l2bcETv4CLccYTwmYQFVV\ndq0/h4WVhuCXyhdYu5pubLJcz8hjdbd61PB1NimXeHzYWmlZ3iWIWn4u9PvuEFtOFhxY61e1JOVq\nuXNg42UyUnJMS2ZlB2+uAl0W/NAN9CZcH30HJd9/n1JDh5D255/Ef/opql5Ph/IdmBEyg1PJp/hw\ny4dk6kwY7iuEEEIUAWm0CCGEEHfw3envWHB4AR3Ld2Rco3FYaCxI//tvYgcNxjYgAL9Fi9DYmfm1\nhdiDsOlTqNgaGvQzOdzlY9eJOplMvQ7lsHP699Wm6xm5vLskgoS0HFZ0DaJW6RIm5xKPF3trC1Z0\nDSLAx5mP1x7g7zNXC6w3eq0Cqgp7frpgejL3yvDiLIjaA6ETTY93C9fu3XEf0J/UX34lfswYVIOB\nFqVbMDNkJqeSTzFg+wBy9blmzyuEEEIUljRahBBCiFv8cfEPJkZMJMQvhC8afoFG0ZARtovY/gOw\nqVQJvyWL0TqY+Vae7BvGuSwOHvDKQpPnsuh1BnZtOEcJTzsCQnxuPk/JzOPdpRFEp2Sx7IMggsqW\nNLFw8bhytLFkVbd6VPZ0pPc3B9h1LunmmpObLbVeKM25yETizt0wPVng21CrM4TNgHNbTY93C7eP\nPsLt449I/eFHEsaPR1VVQvxCGN9oPBEJEQzfOZx8g3lP0wghhBCFJY0WIYQQ4j92xuxk9K7R1PWo\ny/Rm07HQWJAZHk5M375YlS9P6WVL0TqZeZaJqsIvfSAtFt5YCXamNz8Ob4si7Vo2Td6shFZr/Haf\nmqXjvWURXEzKZMn7dWlQ3rT5L+Lx52xryTfd6lPOzZ4eqyPZe+H6zbXarcvgUMKasPVnMRjMcGVp\nu2lQqjr81BNSY02Pdwu3fv1w7dGdG999T+KkSaiqSofyHRgeNJxtUdsYt3ecXL0qhBDisSCNFiGE\nEOIfBxMPMih0EBVLVGRe83lYa63J2r+f6I8+xqq0H6VXLEfr4mL+xBEL4fTv0PIL8AsyOVxGSi77\nN17BP9ANv2rGpk16jo73V+zjXGIGizrXoUlFE672FU+UEvZWrO1RH78SdnRfFcn+y8kAWFppafha\nBZKiMzi5K870RJa2xnkt+rx/5rXoTI/5H4qi4D54MCU/eJ+U1d9wdfp0VFXlvWrv0btmb34+/zMz\nD8yUZosQQohHThotQgghBHAm+Qx9t/XFy96Lr1t+jYOVA9knThDdqzeWXl6UXrECixJFMMsk5gBs\n/gwqt4MGfcwScu/P51H1Ko1erwhAZm4+XVZEciI2lQXv1ub5yqXMkkc8OVwdrFnbsz6eTjZ0WRHJ\noagUACrUKYV3RRcifrlITqYZGiNuFaHDHIgOh+3jTY93C0VRKDViBCU6vUPysuUkff01AH2e68Pb\nld9m5YmVLDu+zOx5hRBCiIchjRYhhBDPvKi0KHpv6Y2dpR2LWy3G1dYVXUICMR9+hMbF2dhkcXMz\nf+KsZONcFkcvePkrUBSTQ8afv8HZfYnUeqE0zu62ZOXl03VlJIejbzDvnVq0quZhet3iiVTK0YZv\newbj6mDF+8v3cSwmFUVRaPJWJXKzdOz77ZJ5EtV4Hep0gd1z4Mxf5on5H4qi4DF6NM4vvUTS3Hmk\n/vYbiqIwsv5I2vq3Zc7BOWw4u8HseYUQQogHJY0WIYQQz7TEzER6bemFXtWzuNVivBy8MGRmEv3h\nRxiysvD7eiGWHkVwAuT/57KkxxvnstiaflrGYFDZue4sDiWsqd26DDk6PT1X72f/5WRmvhlI2xpe\nptctnmiezsZmi7OtJe8ti+BkXBpuvg4ENPXh+I4YrsdmmCdRm8ngUQP+9yHciDZPzP9QNBq8xo/D\nLiiI+E9HkXXwIBpFw4TGE2js05jxe8ez6fIms+cVQgghHoQ0WoQQQjyzbuTcoPeW3qTkpLCw5ULK\nuZRD1euJHTyE3LNn8Zk9C5vKlYom+d4FcOZPeGE8+NYxS8hTu+NIis6g4WsVMGih9zcH2HPhOtNe\nD+Sl53zuH0A8E3xcbPmuZzB2VlreWxbB2cR06nUsh5WdBWHrzppnxsnNeS35RTKvBUCxssJn7hws\nvb2J6dOXvKgoLDWWzAyZyXOlnmNE2Aj2xO4xe14hhBDifqTRIoQQ4pmUpcuiz7Y+RKdHM6/5PKq7\nVQfg6tSpZISG4jF6FA5NmhRN8uhI2DoGqnaA+h+aJWROpo7w/13Eu6ILpQPd6LP2IDvOXmPyqzV4\nrY6vWXKIp4dfSTu+6xmMhUah05IIYjJzCX6pPLFnb3Dh4DXzJHEtDx3nQsw+2DrWPDFvYVGiBH6L\nFoLBQPSHH6FPTcXWwpb5LeZT3rk8n4R+wpFrR4oktxBCCHE30mgRQgjxzMnT5zHg7wEcv36cqc2m\nUs+rHgDJ335L8qrVlPzgfUp26lQkuS10aca5LE4+0HG+WeayAOz7/RK5WToavF6BAd8fZuupq4x/\nOYC3gkqbJb54+pR1s+fbnsEAdFoSjn0VZ1x9Hdj9wzl0eXrzJAl4FYJ6wN75cPpP88S8hVXZsvjO\nn0dedDQxAz5B1elwsnJiYauFuNm68fHWjzmXcq5IcgshhBB3Io0WIYQQzxS9Qc+IsBGEx4fzRcMv\naFG6BQAZYWEkTpiIQ0gIpYYNK5rkBgNVT82BzKv/zGUxz1XR12MzOL4jlqqNvZmw5wJ/nUjg8xer\n0Tm4jFnii6dXhVIOrO1Rn3yDyrvLIqjStjQZKbkc3HTFfElemACeNY3zWlLMGPc/7IKC8Bo/jqzw\ncOK/+AJVVXGzdWNxq8XYaG3ovaU3MekxRZJbCCGEuJU0WoQQQjwzVFVlfPh4tlzZwpC6Q3i5wssA\n5Jw5S+wnA7GuVAmfGdNRtNqiKWDvPFyT9xv/4ulT2ywhVVUlbP05rGy0/KFm8duROEa2rUK3xv5m\niS+efpU9HVnTvT6ZeXr6bj2JT6ArhzZHkZaUbZ4EljbGeS2qCj90RTGYf14LgMvLL+P60Yek/vAj\nycuMVzz7OvqysNVCcvW59NrSi6TspCLJLYQQQvyXNFqEEEI8M2YfnM2P536kZ42efFD9AwDyr10j\n+qMP0djZ4ff1V2js7YsmecIx2DaOq+4NoV5Ps4W9eOgasWdSiPOz5ofj8Qx5oRK9m5U3W3zxbKjm\n7cSa7vVJzdax8MZ1APb8eN58CUqWg5fmQ+wBylxZb764t3Dv1w+ndm25On0GaZs3A1CxREW+avkV\nSdlJ9N7Sm7S8tCLLL4QQQoA0WoQQQjwjlh9fzvLjy3mj0hv0q9UPAEN2NtF9+qJPuYHv119j6elZ\nNMn1+carnG1LcLbSR2aby6LL07Prh3PoHLSsSEiif4uK9G1e0SyxxbOnhq8zq7vVIyZHxxEnlQuH\nrhF9Otl8Caq9BDXfonTUj8bGYxFQNBq8Jk7ENjCQuGHDyT5mzBPoHsjs52dzMfUifbf1JTvfTKd1\nhBBCiDuQRosQQoin3o9nf2TWgVm0KduGUfVHoSgKqsFA3IiR5Bw7hs+0qdgGVC+6AvbMhfgj0G46\n+ZZOZgt7aNMVMpJz+YEseoeUZ2BLabII09QqXYIVXYPYpckl0xJ2fHcWvd5gvgRtJpNv4WBsPOrz\nzRf3PzQ2Nvh+tQALV1eiP/4YXVwcAA29GzK5yWQOXz3MoNBB6IrgymkhhBACpNEihBDiKbflyhbG\nhY+jkU8jJjaeiFZjnL9ybfYc0jdtotTQoTi2bFl0BSSdg9DJULUjVH/ZbGHTkrLZt/EypyzzaR1S\nhuFtKqOY6aSMeLYFlS3J4i5B/G2rIzUxi8gtUeYLbleScxV7GxuPe+aaL+4tLFxd8Vu0EDU7x3jt\nc0YGAK3LtubzBp+zK3YXo3aPwqCasYkkhBBC/EMaLUIIIZ5ae+P2MnzncGq61WRms5lYai0BuPHj\nT1xfvBiXt96iZNcuRVeAwQC/9AVLW2g33WxhVVVlxcLD5BtU3Bp5MLp9VWmyCLNqUN6VkT1qccXS\nQPivF7l6Pctssa+VagRVOxgbkElFd+2ydYUK+MyZTe6FC8QOGoSabzxB83ql1/mk9idsvLSRiRET\nUVW1yGoQQgjxbJJGixBCiKfS0WtHGfD3AMo6l2V+i/nYWdoBkBkeQfyYMdg3bIjn6FFF26CIXALR\n4dBmMjh6mC3s3J9PoY3JItvfjs/frClNFlEkmlYqxfNvVsTSAJPmRJKeY8ZXbdrNMDYgf+lrbEgW\nEYdGjfD8/HMyd4aROHnKzefda3Sna/WurDuzjgWHFxRZfiGEEM8mabQIIYR46pxPOc/H2z7G1caV\nRS0X4WztDEDuxUvEDBiAVdky+MyehWJpWXRFpFyGrV9AhZYQ+LbZwn4Vep6zf8egahX6f1QbjUaa\nLKLotG1SBvtyjvhey6f70n1k5ppproqjB7SZZGxERi4xT8y7KPHWm5Ts2pWUNWtI/mbNzecD6wzk\n1YqvsujoItacXHOPCEIIIcTDkUaLEEKIp0psRiy9t/TGUmPJ4hcW427nDkB+SgrRH36IotXit3Ah\nWifzDaW9jarCbwOMtwu9ONtstwwtDbvIkj/OUlVnQa3n/bB3sjZLXCHupf3bVbBRFSwuZNBtZSTZ\neXrzBA58x9iI3PoFpFwxT8y7KDVkMA4tW5A4aRLpoaEAKIrCZ8Gf0bJ0S6ZETuHXC78WaQ1CCCGe\nHdJoEUII8dTIyMugz9Y+ZOuzWdRqEX6OfgAY8vKI6duP/IQEfBfMx8rXt2gLOfQNXAyFVuPAxc8s\nIVftucyXf5zidVtHLC011H6hjFniCnE/7qUdKVvTjcYGa45cSqbn6v3k6MzQbPlvI/K3/sYGZRFR\ntFp8pk7FpkoV4gYNJuf0aQAsNBZMaTqF+l71GbN7DJEJkUVWgxBCiGeHNFqEEEI8FfQGPcN2DuNy\n2mVmhsykUolKgHFwbPzo0WQfOID35EnY1apVtIWkxcOm0VCmMdTpapaQ30ZEMebXE7T3d6fENR3V\nm/lg52RllthCPIig9mVRcw2MrOjH7gtJ9P7mALn5Zmi2uPhBqy+MjclD35ge7x40dnb4fv01GkdH\noj/8CN3VqwBYaa2YFTKL0k6lGRg6kOi06CKtQwghxNNPGi1CCCGeCjMPzCQsNoxP639KsFfwzedJ\nX39N2q+/4T6gP07t2hVtEaoKfwwCfR50nAsa07/Nbtgfzac/H+P5yu68bO2AxkJDrValzVCsEA+u\nVBknygS4kn8ylYkvVmfH2Wv0WXuQvHwzDLKt0w3KNDI2KNPiTY93D5YepfBb+DX6tDRiPvoYQ5bx\nNiVHK0fmN58PQJ/tfUjPSy/SOoQQQjzdpNEihBDiiffTuZ9YfXI171R5hzcrv3nzeervf5A0dx7O\nL72E64cfFn0hx3+EM39C81HgWt7kcP87FMuwH4/SpKIbU9pU49y+RKo38cbeWWaziOJXt31ZcjJ1\nVM5QGP9SdbaeusqA7w+Rrzex2aLRQMd5oM81NiqL+Lplm6pV8ZkxnZxTp4gbPhz1n1uP/Jz8mBUy\ni+i0aIbuGEq+wUyDf4UQQjxzpNEihBDiiRaZEMn48PE09G7IsKBhN59nHTxE/KefYle3Lp7jxxX9\nFciZSbBxGPjUgeCPTQ73x9F4Bq0/TLC/K4s71+XE1mg0GkVms4hHxtPfmdLVSnJ4axRv1/bjsxer\nsfF4AgPXH0FvMLE54loenh9lbFQe/9E8Bd+D4/PP4zFiBOlbtnJt5sybz4M8gxgdPJrdcbuZsX9G\nkdchhBDi6SSNFiGEEE+s6PRoBoUOwtfBl2nNpmGhsQAgLzqamL59sfDyxGfeXDRWxTDPZOMwyEmD\nlxaARmtSqE0nEuj//SHqlCnB0g/qokvL4/TeBKo19sbeRU6ziEenbnt/stN1nAiLpXtjf0a0rcJv\nR+IYusEMzZYGfYyNyo3DjI3LIlai83uU6NSJ60uXkbJhw83nr1V6jc7VOrPm1BrWn1lf5HUIIYR4\n+kijRQghxBMpPS+dftv6YVANzG8xHycr43XN+rQ0ont/iKrX47dwIRYlShR9Maf/+S18s2FQqqpJ\nobafTqTvtwep4ePM8i5B2FtbcHDTFdBA7dYym0U8Wl7lnfGtUoKDm6PQ5en5sFl5BreqxE+HYvn0\np2MYTGm2aLTGRmVOGmwcbr6i70JRFDw+HYl9kyYkfDGOzL17b64NrjOYxj6NmRQxiX3x+4q8FiGE\nEE8XabQIIYR44uQb8hm6cyhX0q4wK2QWZZyMr9OoBgOxQ4eSFx2N79y5WPv7F30x2Tfg94HgEQCN\nB5oUaufZa3z4zUGqeDqxqls9HG0sSU/O4dSeeKo19MahhI2Zihai8ILa+5OdlsfJsDgA+rWoSP/m\nFVi3P5rPfz2OasqMlVJVoelQOP6DsYFZxBQLC3xmzcTa35+YAZ+QFxMDgFajZWrTqZRxKsPA0IFc\nSbtS5LUIIYR4ekijRQghxBNnxv4Z7I7dzcj6I6nnVe/m8+uLl5C5YyceI0dgX7/ePSKY0ebRkHkN\nXpoPWstCh9lzPomeq/dTvpQD33Svh7OtMdbBTca/4NVuI7NZxOPBu6ILPpVcOLj5Cvk64xXPA1tV\nonezcqwJj2Lc7ydNa7Y0HgilqhsbmNk3zFT13WkdHPD9agGoKrEDPsGQlwcYbyKa12IeGkVD3219\nSctLK/JahBBCPB2k0SKEEOKJ8sPZH1hzag3vVn23wA1DmXv3cm3uXJzat6fEO+8UTzEXtsOhb6Bh\nP/CuVegw+y4l033Vfsq42rG2R31c7IwzZTJScjm5O44qDb1wLCmnWcTjI6i9P1mpeZzcZbyOKh1l\nwAAAIABJREFUWVEURrSpQrdG/qzYfZnJG08XvtliYWVsXGZeNTYyi4GVnx/eUyaTc+IEiRMn3nzu\n52i8iSgmI4YhoUPkJiIhhBAPRBotQgghnhiRCZFMCJ9AI+9GDKk75OZzXWIisUOGYuXvj9e4L4r+\nhiGA3Az4dQC4VoCQEYUOc+BKCl1X7MPbxYa1PYIpaf/v4N6Dm6+AAeq0ltMs4vHiXckFrwrOHNx0\nBb3OeD2yoih89mJVOgeXYdHOi8zccrbwCXxqGxuYh76BC3+bqep7c2zeHNeePbjx/TpSf/315vO6\nnnX5LPgz9sbvZWrk1GKpRQghxJNNGi1CCCGeCFFpUQwMHUhpp9IFbhhSdTpiBw7CkJ2N79w5aOzt\ni6egbeMgNdo4vNPStlAhjsbcoMvyfbg7WvNtz2DcHf+9USgzNZeTYXFUDvbEya1w8YUoKoqiENTe\nn8wbuZzaE1fg+Rcdq/N2kB/ztp9n7rZzhU8SMtLYyPytv7GxWQzcBwzALiiI+DFjyT33b+2vVnyV\nD6p9wHenv2Pd6XXFUosQQognlzRahBBCPPbS89Lpu70vAPObz8fRyvHm2tUZM8k+eBCv8eOwLl++\neAqKCod9i6FeLygdXKgQJ+JSeW9pBC72lnzbMxgPp4KvBh3aFIXBoFKnrZxmEY8n3yol8CznzIG/\nrqDPN9x8rtEoTHylBq/V9mXmlrN8HXqhcAksbaHjfLgRbWxsFgPFwgKfmTPQONgT038A+ozMm2sD\n6wykqW9TJu2bxN64vfeIIoQQ4llXpI0WRVHaKIpyRlGU84qi3HauWlGU0oqi/K0oyiFFUY4qitKu\nKOsRQgjx5Mk35DN0x1Ci06KZFTILPye/m2tpmzeTvHIlJd59F+f27YunIF02/NIHXPygxeeFCnEm\nIZ33lkbgYG3Btz2C8XYpeGIlMzWX42GxVK7ngbO7nTmqFsLsjKdaypKRksvpvfEF1jQahamv16Rj\noDdT/jrN0rCLhUtSpgHU62lsbEaFm6Hq+7Nwd8dnxgzyoqKI/2z0zVkzWo2WKU2m4O/sz+Adg7mc\nerlY6hFCCPHkKbJGi6IoWmAB0BaoBryjKEq1W7aNBtarqloLeBv4qqjqEUII8WSavn86u+N2Mzp4\nNEGeQTef512+TPyno7CpWZNSw4cVX0Ghk+H6eegwB6wdHvrjcRkG3l0ajpWFhu96BeNX8vZGyuGt\n0RjyDdRpW9YMBQtRdPyqlcTD34kDG6+g1xsKrGk1CjPfDKRtgCdf/nGK1XsvFy5JizHg7Ae/9AVd\njsk1Pwj7evUoNfAT0jf+Rco3a24+d7ByYF7zeVgoFvTb3o/U3NRiqUcIIcSTpShPtNQDzquqelFV\n1Tzge+ClW/aogNM//+wMxCGEEEL8Y/2Z9aw9tZbO1TrzWqXXbj43ZGcTM+ATFK0W39mz0FhZ3SOK\nGcUdgj3zoNZ7UL75Q3/8UlImUyNzAIVvewZTxvX2eTJZaXkc3xFDxXoeuHjIaRbxeFMUhbrtypKe\nnMOZ8ITb1i20Gua+U4tW1Tz4/JcTfLcv6uGTWDtAh9lw/RzsmGyGqh9Mye7dcWjenMSpU8k6dOjm\nc19HX2Y/P5uYjBgG7xiMzqArtpqEEEI8GYqy0eIDRP/n32P+efZfY4H3FEWJAf4E+hVhPUIIIZ4g\nEfERTIqYRGOfxgyuM/jmc1VVSRg3ntyzZ/GePg1Lb+/iKSg/z/gbdXt3eGHCQ3886noWnZaEozeo\nfNuzPuXd73wa5si2KPJ1BurKaRbxhCgT4EqpMo4c2Hj5tlMtAJZaDfM71eL5yu58+vMxwmIK0Zio\n0MLY4Nw9F+IOm6Hq+1MUBe/Jk7D08iJ24CDyk5NvrtX2qM2YBmOIiI9gyr4pxVKPEEKIJ4fy/++d\nmj2worwOtFFVtcc//94ZqK+qat//7Bn0Tw0zFEVpACwDAlRVNdwSqxfQC8DDw6PO999/XyQ1F4eM\njAwcHB7+qLkQTwv5GhAP4qruKjMSZuCkdWKQ5yBsNf/OMLHdtQunNWvJaN+OzA4diq2mMpfX4X/5\nW44FfMp1t/oP9dmkbAOTInLI0av0q65SxfPOXwP5uSrnflNx9AbfhjKvXjw50mNVosJUfOoruPjf\n+Xr1PL3KnIM5nLyup1dNGxp4WzxUDgtdBkGRfdFZOnOgznRUjaU5Sr9/3qhoSk6dSl7Fitzo1xc0\n/35t/i/lf2xL28YbJd+gqWPTYqlHPNnk5yDxrHvSvwaef/75A6qq1r3fvof7DvdwYgG///y77z/P\n/qs70AZAVdW9iqLYAG7A1f9uUlV1MbAYoG7dumpISEgRlVz0QkNDeZLrF8JU8jUg7ictL413/3gX\nK0srlrdfjp/jv99Kck6e5PL6Ddg1bEiVqVNRtNriKerqKdi5AQJeo8brwx/qowmpOby5aC86tKz7\nMJikc4fu+jUQ/r8LGPRXaNelPiW9i+maaiHMQFVV1l+OJOOino7v10ejvXOjsEkTPa/M3szS43nU\nDKhO+5peD5fIT8H6+0400x6CZsU3mynF1oaEzz6n+omTuPe7+TtDmhia8Mnfn/BT7E+0rNOSht4N\ni60m8WSSn4PEs+5Z+Rooyl+XRQIVFUXxVxTFCuOw219v2RMFtABQFKUqYANcK8KahBBCPMbyDfkM\nCR1CTEaM8Yah/zRZ9GlpxAz4BG3JknhPn1Z8TRaD3njLkI0TtJ36UB+9mpZDpyXhJGfmsbp7fQJ8\nnO+6NydTx9HQGCrULiVNFvHEMd5A5E/qtWzO7b961322Vlo+qW1DLT8XBnx/iE0nbp/rck9V2kP1\nV2HHVGMDtJi4vP46zq+8QtJXX5ERFnbzuVajZXLTyZRzKceQ0CFcTC3k7UpCCCGeKkXWaFFVNR/o\nC2wCTmG8XeiEoijjFEXp+M+2wUBPRVGOAN8BXdSiepdJCCHEY29q5FT2xu/ls+DPqOv576lMVVWJ\nGzESXXw8PrNmYlGyZPEVFf4VxB4wNlns3R74Y0kZuXRaGkFCWg4ruwbxnJ/LPfcf2RaNLkdP3XZl\nTSxYiEfDv6Ybrj4O7P/zMgbD3X+cs7FQWNE1iAAfZ/p+e5DtpxMfLlG7aWDtaJyZZNCbWPWDURQF\nz88/w7pSJeKGDkMX9+/9DfaW9sxrPg9LrSX9tslNREIIIYr2RAuqqv6pqmolVVXLq6o64Z9nn6uq\n+us//3xSVdVGqqoGqqr6nKqqm4uyHiGEEI+vdafX8d3p7/ig2ge8WvHVAmvJy5aRsX07HsOGYler\nVvEVlXwJtk+Ayu0g4LX77/9HSmYe7y2NICYli+Vdgqhb9t6NodwsHUe3R1OuljuuPk/ue8vi2aZo\njDcQ3UjM4vyBezdPHG0sWdWtHlU8nfhwzUF2nn2IA832bsZmS+x+iFhoYtUPTmNri++c2ag6HTED\nB6Lm5d1c83HwYfbzs4nPjGdwqNxEJIQQzzqZtCeEEOKRC48PZ9K+STT1bcrAOgMLrGXu28fVmbNw\nbNOGEp07F29hf40EjRbazwDlzgM+b5WapeO9ZRFcTMpk6ftBBJdzve9njmyPIU9Os4inQPla7pT0\ntmf/H5dR73GqBcDZ1pJvutejvLsDPVfvZ8/5pAdPFPAaVHwB/p4E6Q/5+pEJrMqWxWvSRHKOHCVx\nSsFXCWuVqsXYhmOJSDDemCaHtIUQ4tkljRYhhBCPVFxGHEN2DMHf2Z8pTaag1fw7e0V39SqxgwZj\nVbo0Xl+OR3nAZodZnN0EZzcaB246PdgV0mk5Ot5fHsG5xAwWd65D44r3f9UoNzufo9uj8Q90w93P\n0dSqhXik/v9US0pCFhcO3f+UioudFWu616OMqx3dV+1n36Xk+37GmEiBNpNBnwtbxphY9cNxeuEF\nSnbpQsrataT+8UeBtY7lO9ItoBsbzm7gp3M/FWtdQgghHh/SaBFCCPHI5OnzGBw6GL1Bz+znZ+Ng\n9e9rM2p+PnGDBmPIzMRn7hy0xXkVYH4u/DUCXCtC/Y8e6CMZufl0XRHJibg0vnq3NiGVSz3Q5479\nHU1uVj5B7f1NqViIx0b52qUo4WlH5B+X7nuqBcDVwZq1PYLxdrGh64p9HLiS8mCJXMtDw35w9HuI\nCjex6odTavAgbGvXJv6zz8m9cKHAWv9a/Wng1YCJERM5ef1ksdYlhBDi8SCNFiGEEI/M1MipHL9+\nnC8bfUkZpzIF1q7NmUPW/v14jR2DTaVKxVvY3vmQfBHaTgELq/tuz8rLp9vKSA5H32B+p1q0rObx\nQGnycvI5vDWasjVccS8tp1nE00Hzz6mW5LhMLh55sNkr7o7WfNszGHdHa7os38fRmBsPlqzJYHDy\ngT+HFNtgXADF0hKfWTPR2NgQ038AhszMm2tajZYpTadQwqYEg0IHyXBcIYR4BkmjRQghxCPx+8Xf\nWXdmHV2qd6FFmRYF1tK3b+f6kqW4vPUWzi+9VLyFpcbAzulQtQNUaHHf7Tk6PT1W7Wf/5WRmvfUc\nbQK8HjjVsdAYcrPyqSunWcRTpkJdD1w87Ih8gFkt/8/DyYZvewbjYm/Je0sjOBH3AA0KK3toPQES\njsGBFSZW/XAsPTzwmTGdvEuXiB8ztsBMlhI2JZgRMoPErERG7RqFQTUUa21CCCEeLWm0CCGEKHbn\nU84zbu84apeqzYDaAwqs5UVHEzd8BDbVq+Px6cjiL27zaFAN8MKE+27N0enp9c0B9l68zvQ3AukY\n+GCzXOCf0yxboild3RWPsk6mVCzEY0ejUajbtgzXYzK4dPTBh9x6u9jybY9gHKwteG9pBGcS0u//\noWovg39T2DYeMq+bUPXDs2/QAPf+/Uj7/XdufP99gbVA90CG1B3CjpgdLD++vFjrEkII8WhJo0UI\nIUSxysjLYGDoQOws7JjebDoWGouba4bcXGIGDACNBp85s9FYWxdvcRd3wImfofEgKFHmnlvz8g30\nWWu8lnbKqzV5tbbvQ6U6vjOWnEwdQe3LmlCwEI+vikEeOLvbsv/Pyw91A49fSTu+6xWMlYWGd5eG\nc/7qfZotigJtp0JuOmwfZ2LVD8+1Vy/smzUlceIkso8dK7DWqUon2pZty7xD89gXv6/YaxNCCPFo\nSKNFCCFEsVFVlc/3fE50ejTTmk3D3c69wHril1+Se/IU3lMmY+X7cI0Lk+l1sHEYuJSBRv3vuVWn\nN9Dvu4NsO32VL18O4M0gv4dKpcvVc3hLFH7VSuJZztmUqoV4bGm0Guq0Lcu1qHSuHHu4kyZlXO35\ntmcwoNBpSQSXkjLv/YFSVaH+h3BgFcQeLHzRhaBoNPhMmYKFuzsxAwaQn/LvMF9FURjbcCxlncoy\ndOdQEjMTi7U2IYQQj4Y0WoQQQhSbNafWsOXKFvrX7k+QZ1CBtRs//cyNDT/g2rs3jiEhxV/cviVw\n7bTxylhL27tuy9cbGLjuMJtOJDKmQzXeC773yZc7OREWS3a6jqB2ZU0oWIjHX6X6Hji52RhvIHqI\nUy0A5d0d+K5nffQGlU5Lwom6nnXvD4QMB3t3Y8PUULwzUbQuLvjMmYP+WhJxw4ej/ie/naUds0Jm\nkZ2fzdCdQ9EZdMVamxBCiOInjRYhhBDF4tDVQ8zcP5Pn/Z6na/WuBdZyzpwh4YsvsKtfH/d+fYu/\nuPRECJ0EFVpC5bZ33aY3qAz94Si/H43n03ZV6Nro4YfYGvJVDm6OwrdKCbwquJhStRCPPe0/p1qu\nXkkn6kTyQ3++oocja3rUJ1un550l4cSk3KPZYuMMrcZBTCQc+c6EqgvHtkYAHp+OJHNnGNcXLSqw\nVs6lHF80/IJDVw8x68CsYq9NCCFE8ZJGixBCiCJ3Pfs6Q0KH4OXgxZeNv0RRlJtrhqwsYgd8gtbJ\nCZ8Z01EsLO4RqYhsHQu6bGgzxTjv4Q4MBpURPx7l50OxDG1dmV5NyxcqVcoFyE7Lk9ks4plRub4n\njiULd6oFoKqXE2u61yc9R0enJRHEp2bffXPNt8CvPmwdA9kPeEW0Gbm8/TZOHTpwbe48MvcVnMnS\n1r8tnap04puT37D58uZir00IIUTxkUaLEEKIIqU36Bm+czipeanMCpmFk1XBG3YSJ08h78oVvKdN\nw8LNrfgLjIqAI99Cw77gVuGOW1RVZfQvx9lwIIYBLSrS5/k777uffJ2epFMq3hVd8K5YwpSqhXhi\naC001G5ThsRLacScSrn/B+4gwMeZ1d3rk5yZx7tLIrialnPnjRqNcTBuZhKETjah6sJRFAWvsWOw\nLO1H3PAR6NPSCqwPqTuEmu41+XzP51xKvVTs9QkhhCge0mgRQghRpBYcXkBEQgSj6o+icsnKBdbS\nt23jxvr1uHbvhn1w/eIvzqCHP4eAozc0GXLHLaqq8sVvJ/k2IoqPQsrzScuKhU53clc8+TkQ9OLD\nv3IkxJOsagMvHEpYF/pUC8Bzfi6s6hZEQloOnZZGkJSRe+eN3s9B3a6wbzEknjSh6sLR2NvjM20a\n+VevkjD2iwJ/XkutJTOazcBKY8Wg0EFk6e4zd0YIIcQTSRotQgghisyO6B0sObaE1yq+xisVXymw\nprt6lfhRo7GuVhX3/ve+5afIHFwFCUeh9Zdg7XDbsqqqTPzzFCv3XKZHY3+Gta5c4LWnh6HPN3Bo\n8xXs3MCnksxmEc8WraWG2q3LEH8hlayrhY9Tp0xJlncJIiYli/eWRpCcmXfnjc0/Axsn42DcQjZ2\nTGFbsybuffuQ9uefpP32W4E1T3tPJjedzIUbFxgfPr7QjSchhBCPL2m0CCGEKBLR6dGM3DWSqiWr\nMrL+yAJrqsFA/MhPMeTk4DNtGoqVVfEXmJUM28ZB2SZQ/dXbllVVZdqmMywJu8QHDcowqn3VQjdZ\nAM4fuEpGSi5u1RST4gjxpKrayAtbR0uSzpjWWAgu58qyD4K4lJRJ52URpGbd4RYfu5LQ4nO4HAYn\nfjIpX2G59uqFbZ06JIwbT15MTIG1ht4N+fi5j/n94u9sOLvhkdQnhBCi6EijRQghhNnl6nMZHDoY\ngBkhM7DWWhdYT1mzhszdu/EYPgzr8oUbKmuy7eMhJw3a3nkA7pxt5/gq9ALv1CvNmA7VTWqOqKrK\n4a1RlPC0w8HLlKKFeHJZWGqpEeJLRhwkx2eaFKtRBTcWda7DucQM3l8eQVrOHZottT8Ar0DYNBpy\nM0zKVxiKVov3lCkAxA0bjpqfX2C9V81eNPZpzOR9kzmedLzY6xNCCFF0pNEihBDC7CZFTOJU8ikm\nNp6In6NfgbWcM2e5On0GDiEhuLz99qMpMO4w7F8B9XqBR/Xblhf8fZ7ZW8/xeh1fJrwcgEZj2gmU\n2LM3SIrO4LmWpeU0i3imBTT1QdHCke3RJscKqVyKr96tzYm4NLos30dGbsFGBhottJsO6XEQNt3k\nfIVh5euD55jPyT54kOtLlhQsT9EwqfEk3GzdGBQ6iBs5xX9LkhBCiKIhjRYhhBBm9b/z/+PHcz/S\no0YPQvxCCqwZcnOJGzoUjaMjXhO+fDRNB4MB/hwK9m4QMuK25SU7LzJt0xlefs6bKa/VNLnJAnB4\naxS2jpZUqu9hciwhnmS2jla4lIUz4Qlkp99lvspDaFnNg/mdanEkJpVuKyPJyrul2eJXDwI7wZ75\nkHTe5HyF4dyhA07t23Nt/gKyjxwpsOZi48LMkJkkZScxctdIDKrhkdQohBDCvKTRIoQQwmzOJJ/h\ny/AvqedZjz7P9blt/drMmeSePYv3pIlYuLo+ggqBo+sgZh+0HAu2BYfSrtx9iQl/nqJ9DS+mvxGI\n1gxNlpSETK4cu05AM18sLLUmxxPiSedaWUGvM3B8Z6xZ4rUJ8GL2W8+x/3IyPVbtJ0enL7ih5Viw\ntIW/hj+SwbgAnmM+x8KjFLFDh2HILPjaVIBbACPqjWBX7C4WH138SOoTQghhXtJoEUIIYRbpeekM\nCh2Ek5UTU5pOwUJjUWA9Y9dukletpsS77+LQtOmjKTInFbZ8Dj51jb/l/o+1EVcY+9tJXqjmwey3\nn8NCa55vkYe3RaO10BDQ1Mcs8YR40lk7KZSp4cqx0Bjyb22KFFKHQG+mvxHI3ovX6fXNgYLNFkcP\nCBkJ57fCmY1myfewtE5O+EyZgi46moSJE29bf6PSG7xY7kW+OvwVe+L2PIIKhRBCmJM0WoQQQphM\nVVVG7xpNbEYs05tNx83WrcB6fkoKcSNHYFWhPKWGDnlEVQKhUyDzGrSbBpp/vwWuj4xm1M/HaV6l\nFPM71cbSTE2W7PQ8zoQnUDnYEzunR3CzkhCPqedaliY7XcfZfYlmi/lqbV+mvFqTnWev0WftQfLy\n//MaTr2e4F4V/hoBumyz5XwYdkFBuPbqReqPP5G2aXOBNUVR+Cz4M8q7lGf4zuEkZCY8khqFEEKY\nhzRahBBCmGzliZVsj97OoDqDqO1Ru8CaqqrEj/4Mw41UfKZPR2Nj82iKvHoKIhZCnQ/A598afz4U\nw/CfjtKkohtfvVsbKwvzfWs8vjMWvc5AYAu/+28W4hniU8kFNz8HDm+NRjXj6zxvBvnx5csBbDt9\nlX7fHUSn/6fZorWEdlPhxhXYPdds+R6We98+2AQEEP/55+gSCzaZ7CztmBkyE51Bx+DQwej0d7hJ\nSQghxBNBGi1CCCFMsj9hP3MOzqFVmVZ0rtb5tvUbGzaQsW0b7oMGYVOlyiOoEONcho3DwNoRmn9+\n8/HvR+MYvP4IDcq5suT9utiYcYZKvk7PsdAYygS4UtLL3mxxhXgaKIrCcy1LkxKfSdTJZLPGfi+4\nDGM6VGPTiUQGrjtM/v83W/ybQvVXYNdMSLli1pwPSrG0xHvaVNS8POJGjEA1FBx+6+/sz7iG4zia\ndJTp+x/NTUlCCCFMJ40WIYQQhXYt6xpDdw7Fz9GPcQ3H3XaLUO6lSyROmox9wwaU/OD9R1QlcPJ/\ncGknNB8N9sYhvH8dT2DA94epW6YkSz8wb5MF4Oy+RLLTdQS2lNMsQtxJhTqlsHe24vCWKLPH7trI\nn0/bVeH3o/EM/eEoesM/p2Ze+BIUDWweZfacD8ra3x+PkSPI2htO8spVt62/UPYFOlfrzLenv2Xj\npUczU0YIIYRppNEihBCiUPIN+QzdOZRMXSYzQ2biYOVQYF3V6YgbOgyNlRVekyahaB7Rt5y8TNg0\nCjxrQN1uAGw7lUi/7w4S6OvM8q5B2FlZ3CfIw1FVlcNbo3H1dcC3cgmzxhbiaaG10FCzuR8xp1NI\niskwe/xeTcsztHVlfj4Uy4gfj2IwqODsC02HwKnf4Pw2s+d8UC5vvIFDyxZcmzWLnFOnblsfWGcg\ntUrVYsyeMVy4ceERVCiEEMIU0mgRQghRKHMPzuVA4gE+C/6MiiUq3rZ+bf4Cco4fx3P8OCw9PB5B\nhf8ImwFpsdBuOmi07Dh7jY/WHKSqlxMru9XDwdq8TRaAqJPJpMRnUqul322nfIQQ/6rW2BsLay1H\ntpr/VAtAn+crMKBFRTYciGH0L8eN82Aa9IWS5WDjcMjPK5K896MoCl7jx6N1cSF2yFAMOTkF1i01\nlkxvNh1bC1sGhQ4iS5f1SOoUQghRONJoEUII8dB2xuxkxYkVvFnpTTqU73DbelZkJNcXL8b59ddw\neuGFR1DhP65fgD3zoObbUDqY/2PvPuOqurI+jv/OvXQQBKRJsXfFithL1GSSTOKTMoktTcXUmSQm\nVlSaWBMnpifWJMY0k0x6JnZFxC5g7wpIV0A63HueFzd1qMItCOv7asJZd+9lPoPwWTl7//ecy2La\nhwdp7+nER5ODcbazNsm2RzdfwdHFhvb9LDhgEuIWYOdoTZdBPpw5kE5BTolJ9nhhdAeeHtGOjfuu\nEPHdCVStDdy5DLLPwr53TLJnbVi5uuKzeDGl58+TsbzifSyeDp4sH7acS3mXiN4XbYEOhRBC1JUM\nWoQQQtyUzMJM5sXMo6NrR2b2n1nhuS4vj5RZs7AO8Md7zhwLdPgnP88BrS2MiWDfhWymfHCA1u6O\nbJgajIuDaYYsWcn5JJ+6To+RfmiNmGAkRGPV8zY/9HqVxB3JJllfURRm3tGJqUPasD72Eot+PIna\nfjR0vBN2LoO8VJPsWxtOQwbj9tijXP/4Y/J37qzwvL9Pf54KfIpvz3/Ld+e/s0CHQggh6kJ+AxRC\nCFFrelXPnJg5FJUXsXzYcmy1thVq0iIiKU/PwHf5cjSOFkzbOf0znP0vjJjFoWs2PLH+AL7N7fk4\nJBg3RxuTbRu/5QpWNhq6DfU12R5CNCYuHg607eXBsV0plJXoTLKHoiiE3t2Fxwa2YtXuiyz/72nU\nOxaBrgw2L6h5ARPymD4d244duTo3lPLs7ArPQwJD6OPZh4VxC0nKS7JAh0IIIW6WDFqEEELU2rpj\n69iXuo/Z/WfTtnnbCs9zv/uOvB9+wOO5Z7EPDLRAh78qK4afZ0GLTsT7juPxtQfwcrbjk5ABtHCq\nOBwyloLcEs4cSKfLoJbYOZrmjRkhGqNeo/wpKSzn1F7TvV2iKAph93RjfP8A3t5xnpVHymHw85D4\nOVzaY7J9a6KxtaXlK8vR37hB6txQwz0yf2KlsWLJ0CVYaayYuWsmZboyC3UqhBCitmTQIoQQolYS\nMxN588ibjGk1hvs73F/heWlyCmkRkdj36YP7tGkW6PBPYt+A65e42H8Bj6w7jKujDRtDgvF0tjPp\ntonbk9HrVQJv8zPpPkI0Nt7tXPBq40z81iRDOpCJaDQK0f/XnQf7+vHalrO8p78XXPzhp5mgKzfZ\nvjWx69gRz5dfIn/nTnI+/bTCcx8nHyIGRXAs+xhvHH3DAh0KIYS4GTJoEUIIUaP80nxm7pqJh4MH\nYQPDKiTpqOXlXJ1puK+l5bJlKFqtJdo0yLkCu18lr+3d3PezDc3srNkYEoyPi71Jty0r0XFsdwpt\ne3rQ3NPBpHsJ0dgoikLPUf7kZhZxKSHLpHtpNApLHwjk/3q1ZPGWK2z2fx7Sj8HBtSZU8cjcAAAg\nAElEQVTdtyaukybhOGQI6UuWUnK+YqTz6Faj+UfHf7Du2DpiU2It0KEQQojakkGLEEKIaqmqSlRc\nFFcLrrJ02FJcbF0q1GSvWkXR4cN4L5iPjZ+F7ybZHIYelfGX/o6dlZaNIcH4uZp+8HFqbyolBeX0\nHO1v8r2EaIza9fagmZsdR00U9fxnWo3CK//oyd09fAg56MNVt2DYvhAKr5l876ooGg0+i6LRODgY\nIp9LK0ZPzwiaQTuXdsyNmUt2UcX7XIQQQjQMMmgRQghRre8ufMePF3/k6Z5P09uzd4XnRQkJZL75\nFs53343zPRWjns0q6QAc/4q1+r+TofVkY0gwrdxNfyGvqleJ35qEZ2tnfNpVHEQJIWqm0WoIvM2P\n1HO5pF/KM/l+VloNr43rxe1dvXk89X70xTdg13KT71sda09PfBZGUXLyJJkrV1Z4bm9lz7Lhy7hR\neoN5e+ahV/UW6FIIIURNZNAihBCiSpdyL7EwbiF9vfoS0iOkwnN9QQEpM2Zg5eWJd9iCCkeKzEpV\nKf5hFlk0Zz1j2Tg1mLYeTmbZ+mJCFrmZRfQa7W/ZfwdC3OK6Dm6JjZ2WeDO81QJgrdXw5oQ++HXq\ny6flw9Htex+yKx7bMadmo0bR/KGHuLZ2HQVxcRWed3TtyIygGcSkxPDxyY8t0KEQQoiayKBFCCFE\npcp0ZczcNRMbrQ1Lhi5Bq6l470ra4sWUXUnCd+lStM7OFujyD9kHPscu7RBvK+NYPW0EHbyamW3v\n+K1JOLnZ0q63h9n2FKIxsrG3ouuQlpw7nMmNa8Xm2dNKw9sT+xAb8CRFeitSNs00y77V8Zo9C5tW\nrbg6aza6nJwKzx/u9DAj/Uey4tAKTmSfsECHQgghqiODFiGEEJVaeXglJ6+dJGJQBN6O3hWe5/3y\nC7mbvsQ9JASHoCALdPiH1Owcin+az1n8uX/yLDp7m2/ok3E5j6tnc+h5mz8arfxYFaK+Am8z3HOU\nsC3JbHvaWWt55Ynb+dH5YXxTtxC77Vuz7V0ZjYMDLV95hfLsbFLDwitEPiuKQuSgSNzs3Ji1axaF\nZYUW6lQIIURl5DdCIYQQFcSkxPDBiQ94uNPDjAoYVeF5WUYGafMXYNe9Ox7PPWuBDv+QnlfM1+9F\n4Kumo70jmu7+bmbd/+iWJKzttHQd3NKs+wrRWDVzs6N9Hw9OxFyltMh8kct21lr+/tRCsjUtcNwR\nzs+JV822d2Xsu3fD41//4sZ//0vuN99UeN7crjlLhi7hct5lFu9fbIEOhRBCVEUGLUIIIf4iqyiL\n0JhQ2jdvz8v9Xq7wXFVV0sIj0BcXG6KcbWws0KVB5o0Snnr/FyaWfEau7zDaDhxr1v1vXCvm3KEM\nug5piY29lVn3FqIx6zUmgNJiHSf2mHfY4eDojOOd4fTUnOe/n73F1pPpZt3/f7lPmYx9nz6kRy+i\nLL1iL0HeQUwLnMZ/zv2HHy/8aIEOhRBCVEYGLUIIIX6nV/WExoRSUFbA8mHLsbOyq1CT99135G/b\nhsfzz2Pbto0FujS4VlDKpNX7uC9vI86aIlzuXWr2HhK2JwPQ8zaJdBbCmDxbOePT3oWEbcnodeZN\n1rHrOxGdVw9m23zO8xvi2Hkm06z7/5mi1dJyUTRqWRmpCxZUOEIE8FTPp+jl0YuouCiSbpjvuJUQ\nQoiqyaBFCCHE7z468RGxV2OZGTST9q7tKzwvy8ggLXoR9r174/bYoxbo0CCn0DBkUbPPMUm7GaX3\nI+DV1aw9lBaVc2J3Cu37eNDMreJASghRP71GB3DjWjHnj5h50KHRoP3bIrz0GUx33sa0Dw+y51yW\neXv4E5vWrfF88QUKdu4i9+v/VHhupbFiybAlKCjM3jWbMn2ZBboUQgjxZzJoEUIIAcDxrOO8dvg1\nRgWM4h8d/1HhuaqqpIWFoxYX47MoGkVbMYXIHPKKy3h07X7OZeTzceuf0FjbwchQs/dxYs9VSot1\n9BwdYPa9hWgKWge2wMXDnqNbkip9k8Ok2gyDjnfyuO5LerqWM/WDg+y7kG3eHv7E9ZFHsO/bl/TF\niys9QuTr5EvYoDASshJ4++jbFuhQCCHEn8mgRQghBAVlBczcNRN3O3ciBkWgKEqFmrxvvyV/+3Y8\nXngB2zaWOTKUX1LOY2v3czI1j09u1+GR/AsMfgGaeZm1D71OT8K2ZHzau+DV2rKx1kI0VhqNQs9R\n/mRcyiPtfK75GxgTiaaskA/abaVlczueWH+AQ5evmb8PQNFo/jhCNH9+pYOnO1rfwQMdHmBN4hri\nUuMs0KUQQojfyKBFCCEEi/YtIjk/mSVDl+Bi61LheVn6r0eG+vTB7dFHLNAhFJaW88S6/SQk5/LG\nuF70Pf0KNGsJA82fenT+SCY3rhXTS95mEcKkOg/0wdbBiqNbLHD3iEdH6DcZ+/gP+fx+N7yc7Xh8\n7QHik3LM3wtg06oVntOnU7BrN7lffV1pzcygmbR2ac3c3XO5VmyZoZAQQggZtAghRJP33fnv+Pb8\ntzwZ+CT9vPtVeG44MhSGWlKCT/RCixwZKirVMWX9QQ5dvs7Kcb34mxoDV4/AqAVg42DWXlRV5eiW\nJFw87Gkd2MKsewvR1Fjbauk+zJcL8ZnkZhaav4ERs8HGEfe90WwMCcbV0YZH1uzjWIoF3rABXCdN\nxKFfP8MRorS0Cs8drB1YPmw5OSU5zN9T+ZsvQgghTE8GLUII0YQl5SWxMG4hfTz7MC1wWqU1ud98\nQ/6OHXi8aJkjQ8VlOqZ9dJC4i9mseKgXf+/iClsiwKcnBD5s9n7SzueScSmPnqP80WgqHrESQhhX\njxF+aDQK8VuTzb+5YwsY+hKc+Rmf7P1sDAmmmZ01k9bs41RantnbUTQafBZFo+p0pM6vPIWok1sn\nXur3EruSd7Hx1Eaz9yiEEEIGLUII0WSV6cqYuWsmWo2WJUOXYKWxqliTnkH6osWGI0OPmP/IUEm5\njqc3HGL32SyWPhDI//X2hbh3IC8Zbo8Gjfl/jB3dmoStgxWdB/qYfW8hmiLH5rZ0DPLiZOxVigss\nkKgT/BS4BMAvofi52LIxJBg7Ky0TV+3jbPoNs7djExBgOEK0eze5X31Vac2EzhMY7jecVw++yqlr\np8zcoRBCCBm0CCFEE/XG0Tc4ln2MiEER+DhVHBqoqkraggWopaW0tEDKUJlOz3Mbj7D9dCaL7uvB\nQ/38IT8Tdq+ATndBm6Fm7QcgN7OQC0cz6TbMF2tby6QuCdEU9RwdQHmpnuO7U8y/ubUdjA6DtESI\n/5RW7o5sDAlGo1GYsHofFzLzzd6S68QJOAQFkb54CWWpqRWeK4pC1OAomts2Z+aumRSWWeDYlRBC\nNGEyaBFCiCYo9mos646t48GODzKm1ZhKa3L/8w35O3fi+eIL2LRubdb+ynV6Xvj0KJtPpBNxbzcm\nBP966eyOxVBWCGMizdrPb+K3JaPRKASO8LPI/kI0VS38nPDr7Eri9mR05XrzN9D9AfDtB9uioLSA\nth5ObJwajF6vMmHVPi5nF5i1ndocIXK1c2Xx0MVcyr3EsgPLzNqfEEI0dTJoEUKIJia7KJvQmFDa\nurRlZtDMSmvK0tNJX7QI+359cTXzkSGdXuWlL+L5ITGVeXd34bFBrQ0PMk/DofXQbzK06GDWngCK\nC8o4GZtKhyAvHJvbmn1/IZq6XmMCKMgt5dzBdPNvrihwRzTcSIXYNwHo4NWMj0OCKSnXMWHVPpKv\nm/etERt/fzxfeomCmBhyv/yy0ppgn2Cm9JjCl2e/5OdLP5u1PyGEaMpk0CKEEE2IXtUzb8888kry\nWDZsGfZW9hVqVFUldcEC1LIyWkZHo5jxHhS9XmXWlwl8c/QqM//WialD2/7x8Jf5YONoSAGxgBMx\nVykv0dFrtL9F9heiqQvo6oarjyNHtyZZJk0nYAB0uRf2rIQbhsSfzt7OfDQlmBvFZYxfFUdqbpFZ\nW3KdMB6H/v1JX7K00iNEAM/0eobAFoFExkaSkm+Bo1dCCNEEyaBFCCGakI9PfkxMSgwvB71MJ7dO\nldbkfv0fCnbuwnP6dGxatTJbb3q9Suh/Etl0KJkXR3fkmRHt/3h4YQec/a8h/cPR/JHKunI9CduS\n8OvsSgu/ZmbfXwhhuHek12h/spLySTl93TJNjIkAXSlsj/79S919XfhoSjA5BWVMWLWPjLxis7Wj\naDT4RC9E1eurPEJkrbFm6bClqKjM2jWLcn252foTQoimSgYtQgjRRJzMPsmKQysY4T+CcZ3GVVpT\nlp5O+uLFOPTrh+ukiWbrTVVVwr87zif7k3h2ZDv+NepPQxa9Dv47z5D6EfyU2Xr6s3OHMijILaXX\n6ACL7C+EMOjY3wv7ZtYc3ZpkmQbc2kL/aXBkA6Qf//3LPf2bs35yEBl5xYxfFUfmjRKztWQ4QjSd\ngpgYcjZtqrTGr5kf8wfMJz4znnfi3zFbb0II0VTJoEUIIZqA4vJi5uyeg6utK5GDIlEUpUKNqqqk\nzp+PWl6OzyLzHRlSVZWFP5zkw72XmTasLS/f3umv/cV/AumJhtQPazuz9PS//R3dcgVXbwcCurqZ\nfX8hxB+srLX0GOHH5cRsrqWa9wLa3w17GWyd4Zd5f/ly31ZurH08iKs5xUxavY9rBaVma8l1vOEI\nUcaSpZRdvVppzV1t72Jsu7GsTlzN0YyjZutNCCGaIhm0CCFEE7Dy8ErO554nanAUrnauldbkfvU1\nBbt2G44MBZjnzQ1VVVn682nWxFzk8UGtmXNn578OWUoLYGuUIe2j+wNm6el/pZzJISspn16jA1A0\nFQdUQgjz6j7MF621hvhtFnqrxcENhs+C89vg7Ja/PApu687qx/pxKbuASav3kVNonmHL7ylEqkrq\nvPlV3mEzu/9sfBx9mLN7DgVlFhpUCSFEEyCDFiGEaOT2Xt3LhpMbGN95PIN9B1daU5aWZjgyFBSE\n68QJZuvt31vO8u7O80wMDiDsnq4V37SJfRPy0+CORYbUDws4uuUK9s2s6RjsZZH9hRB/Zd/Mhk4D\nvDkdl0bRDfO9NfIXQVMNx4h+mQe6v955Mrh9C95/tB/nMvJ5dO1+8orLzNKSjZ8fni+/REFsLDlf\nfFFpjZONE9FDoknJT2H5geVm6UsIIZoiGbQIIUQjlluSy7w982jj0oYX+75YaY3hyNACVJ3OrEeG\n3tx2lte3nuWhfn5Eje1ecchyI82Q7tF1LAQEm6Wn/3U9rYDLidl0H+6HlbXWIj0IISrqNcofXZme\nY7sslKJjZQOjIyDzJBz5qMLj4R09eGdSH06m5vHY2v3kl5jnAlrXceNwCA4mY+myKo8Q9fXqy+Tu\nk/ny7Jdsv7LdLH0JIURTI4MWIYRoxKLjorlWdI3FQxdXGuUMkPvVVxTs3o3nSy9h42+e6OL3dp7n\nlV/OcH9vXxbfH4imsiM52xYa0j1Gh5ulp8okbk9GY6XQfZivxXoQQlTk6u1IQDd3ju1MQVeut0wT\nXe6BgEGGBKKSGxUej+rixRvj+5CQnMsT6/ZTWGr6YYshhSgaajhC9GyvZ+ns1pnwveFkFWWZvC8h\nhGhqZNAihBCN1A8XfuCnSz/xdK+n6eberdKastRU0hcvwaF/f1wnjDdLX2tjLrL4p1P8PdCHZQ8G\noq1syJJ2zJDqEfyk4fV8CygpKudkXBod+3nh4GxjkR6EEFULvM2PwrxSzh/OsEwDigJ3LISCTIh5\nrdKSv3X3ZuW4Xhy6fJ0p6w9SVKozeVs2fr54zpxhOEL0eeVHiKy11iwespj80nwiYiOqHMgIIYSo\nGxm0CCFEI5RWkEZ0XDQ9PXoyufvkSmt+PzKk1+MTvdAsR4Y+irtM5Pcn+Fs3b/79cC+stJXsqaqG\new/smxvSPSzkVGwq5SU6eoz0s1gPQoiqBXRxw8XTnoTtyZZrwrcv9PgH7H0Tcivv4++BLXn1oZ7E\nXcxm2kcHKS4z/bCl+cMP4zBwABlLl1KWUvnxqvau7Xmh7wvsSN7Bl2e/NHlPQgjRlMigRQghGhm9\nqic0JpRytZzFQxZjpbGqtC73yy8piInB86XpZjky9NmBK8z/zzFGd/Hk9fG9sa5syAJwbgtc2G5I\n9bCvPCHJ1FS9SsKOZLzbuuDZytkiPQghqqdoFAJH+pF+MY/0i3mWa2TUAsOAeGtUlSX39fZj6QOB\n7D6bxTMfH6bUxMedFEWh5cKFAKTOr/oI0cQuEwn2CWbZgWVcybti0p6EEKIpkUGLEEI0MhtObGB/\n2n5mBc3C37nyAUpZairpS5YajgyNN/2RoS8PJTP7q0SGd/TgrYl9sLGq4sePrtzwNotbW+g3xeR9\nVeXy8WzyMosIlLdZhGjQOg/wwdpOS8IOC0U9AzQPgIHPQMKncPVIlWUP9fMn+r7ubDuVwXMbD1Om\nM+2wxdrXF8+ZMymI3UvOZ59XWqNRNCwcvBArjRVzYuZQrjfPpb1CCNHYyaBFCCEakbPXz7Ly8EpG\n+I/g/g73V1rzlyNDZkgZ+jb+KjM2xTOonTvvPdIXW6tq0nuOfAiZpwxpHlaWuxclcXsyji42tO3j\nYbEehBA1s7G3ovNAH84dzKAgt8RyjQx5ERzc4b/zDG+3VGFicCvC7+nKLyfSeeHTo5SbeNjS/OGH\ncBw0kIxlyyhNrvwIkbejN/OC55GQmcCaxDUm7UcIIZoKGbQIIUQjUaorZc7uOTjZOBE+MLxiXPKv\ncjZtMhwZevklbPxM+8bGT4mpvPjZUfq1dmPVo/2wqy4iuTgPti8ypHh0ucekfVXneloBV05co/tw\nX7RVHW8SQjQYgSP80OtUTsRUHmdsFnYuMGIOXI6B0z9WW/r44DaE3tWFHxJTeemLeHR6011EqygK\nPlFRoCikzp9X5RGiu9rexZ1t7uTd+Hc5nnXcZP0IIURTIb9BCiFEI/Hm0Tc5ff00EYMicLd3r7Sm\n7OpVMpYsxSE4GNdx40zaz+YT6fzzkyP09HNh7eNBONhUflfM7/a8ZkjvuGOhIc3DQn6LdO46RCKd\nhbgVNPdyIKCbm2WjngH6PgEtOsLmBaArq7Y0ZFhbZtzRiW+OXmXWlwnoTThs+e0IUeHeOHI++6zK\nutDgUNzt3Zm9ezZF5UUm60cIIZoCGbQIIUQjcDDtIOuPreeBDg8wwn9EpTWqqpI6z3ApoqlThraf\nzuDZjw/TraUz6yf3x8m2hiFLbjLsfcuQ3uHb12R91aSkqJxTcWl0kEhnIW4pgSP9DVHPRywU9Qyg\ntYIxUZB9Dg6uq7H82ZHteWF0BzYdSib0P4kmHbY0f+gfOA4aRMay5VUeIXKxdWHhkIVcyrvEioMr\nTNaLEEI0BTJoEUKIW9yN0huExoTi18yPmUEzq6zL/fJLCmJj8ZrxskmPDMWczeLJjw7RwcuJDycH\n42xnXfOHtkYZ7jUYtcBkfdXGqdhUykp0cgmuELeYgK6/Rj1vs2DUM0DHO6DNMNixGIpyaix/flQH\nnhnRjk/2JxH+3fEqj/bUl6Io+Cys+QjRAJ8BTOoyiU9Pf0pMSoxJehFCiKZABi1CCHGLW7J/CWmF\naSwasggHa4dKa8oyMkhfthyHoCCaP/ywyXqJu5DN1A8P0LaFIxumBOPiUIshS2oCJHwGA542pHdY\niKpXSdyRjHdbZ4l0FuIWo2gUeoz4Ner5kgWjnhUFbl8IRddgz8palCvMuKMTIUPb8OHeyyz84aTJ\nhi3WLVviOeNlCvfGkfv1f6qse6HvC7RzaceCPQvIKa55WCSEEKIiGbQIIcQtbPPlzXx7/lum9phK\nL89eVdalL4xGLS7GJyrSZEeGDl66xuT1B/BzdWDD1GBcHWt59GZLONg3N6R2WNDl49nkZhYROLLy\nSGwhRMPWZaAP1rZaErdb+K0Wn57Q4yGIewfyar6gV1EU5t7VhccHtWZNzEWW/nzaZMOW5g89hH2/\nvqQvXUp5VlalNbZaW5YMW8L1kutExkWarBchhGjMZNAihBC3qMzCTCL3RtLVvStP9Xyqyrq8zZu5\n8csvtHjuOWxatzZJL0euXOfxdQfwcrZj49RgWjjZ1u6DF3bA+a0w9GXDsMWCErcn4yCRzkLcsmzs\nreg8yIezB9MtG/UMcNs8UHWGJLVaUBSFsHu6MiE4gHd3nuffW86apC1Fo8EnMgq1sJC06Ogq6zq7\ndea5Xs+x+fJmvr/wvUl6EUKIxkwGLUIIcQtSVZX5sfMpLi9m8dDFWGsqP6Kjy8sjPTIK286dcX/i\ncZP0ciwll0fX7sfN0YaNIcF4OtvV7oN6vSGdwyUA+oeYpLfa+j3SeZhEOgtxK2sQUc8Arq0gKASO\nfgwZp2r1EUVRWDi2O//o68frW8/y5jbTDFts27ahxbPPcOOnn7mxbVuVdY93e5w+nn1YtG8RV/Mt\n/O9TCCFuMfLbpBBC3II+O/0Ze1L2ML3fdNq6tK2yLuPVFZRnZ+MTFYViXYv7Um7Siat5TFqzD2c7\nazaGBOPjYl/7Dx//ClLjDf/l16qWb8CYSOKOFDRWCt2GSqSzELey36Oed1k46hlg2Mtg42Q4HllL\nGo3CkgcCua+3L6/8cob3dp43SWvukydj27EjaRGR6PLzK63RarQsGroIFZW5MXPR6XUm6UUIIRoj\nGbQIIcQt5mLuRV49+CqDWw5mXKdxVdYV7N9Pzmef4fbYY9j36G70Ps6k32DSmn3YW2v5JGQAfq6V\nX8RbqfIS2BoJXj0Mkc4WVFpUzqm9qXToK5HOQjQGgSP9Kcy1cNQzgIMbDHkBzvwEl2Nr/TGtRmH5\ng4HcHejD4p9OsTbmotFbU2xs8FkYRXlmJpkrqo5y9nXyZXb/2RxKP8SHJz40eh9CCNFYyaBFCCFu\nIWX6MubsnoOtlS2RgyNRFKXSOn1JCWnzF2Dt74/Hv/5p9D7OZ+YzYdU+rDQKG0MGEOB+E0MWgIPr\nIOcyjAkHE13OW1sn9xoinXtIpLMQjcJvUc8WvxQXIPhpaNbScEzyJi6VtdJqeO3hXtzRzYvI70/w\nUdxlo7dmHxiI2yOPcH3jJxQeOlRl3dh2YxkdMJrXj7zO6Wunjd6HEEI0RjJoEUKIW8j7Ce9zPPs4\nCwYswNPBs8q6rLffofTyZXwiwtHY38Rxnlq4lFXAhFVxqKrKxpBg2rRwvLkFivNg1zJoMxzajTJq\nbzdL1askbk/Gq40zXq0l0lmIxuC3qOe0CxaOegawcYCRcyD5AJz87qY+aq3V8Mb4Pozq7Mn8/xzj\nswNXjN6ex/P/wtrXl9T5C9CXVH6BsKIoLBi4gOa2zZm9ezYlOgtfNCyEELcAGbQIIcQtIj4znlUJ\nq7i33b3c3vr2KuuKT50ie80aXO67D8dBg4zaQ9K1QiasiqO0XM/HIcG092x284vsWQmF2TAmAqp4\nI8dcrpy4Zoh0vk3eZhGiMWkwUc8APSeAR2fYGgG6spv6qI2Vhrcm9mFYRw9mf5XIl4eM++fRODjg\nHR5O6YULZL/3XpV1rnauRA6K5FzOOd44/IZRexBCiMZIBi1CCHELKCwrZO7uuXg6eDK7/+wq61Sd\njtR589G6uOA5c4ZRe7iaU8T4VXEUlOrYMDWYzt51eAMkLxX2vgXdH4CWvY3aX10kbE/CwcWGdr2r\nfjtICHHrsbG3ovNAH84eSqcwr9SyzWitYFQYZJ+DIx/d9MftrLW8/0hfBrZ1Z8ameL6NN24CkNPQ\nIbiMvZes91dRfPpMlXVD/YbycKeH+fDEh+xP3W/UHoQQorGRQYsQQtwClh9cTtKNJKKHRNPMpuq3\nSK59+BHFx47hHToXK1dXo+2fnlfM+FVx5BaW8dGU/nRr6VK3hXYuAX053DbfaL3V1fW0Aq4c/zXS\n2Up+HArR2PQY4Yu+XOX47hRLtwKd7oSAgbBjCZQW3PTH7ay1rH6sH/1aufHiZ0f5KTHVqO15zp6N\ntlkzUhfMR9VVnS40ve90ApwDCN0TSl6phY9lCSFEAya/WQohRAO3M2knm85s4vFujxPkHVRlXWlS\nEpkrV+I0YgTN7rzTaPtn3ihh/Ko4sm6UsH5yfwL9mtdxoTNw+CMImgJubYzWX10l7kxBo5VIZyEa\nK1dvRwK6NpCoZ0WBMZGQn254q68OHGysWPtEED39XPjnJ0fYciLdaO1ZubriNXcuxfEJXP/446p7\nsHZg8ZDFZBZmsnjfYqPtL4QQjY0MWoQQogHLLspmQewCOrp25Lnez1VZp6oqaWHhKFot3uFhVaYR\n3fT++SVMXB1Hak4x657oT99W9XhLZmsEWDvAMOMeaaqL0qJyTsWm0qGfRDoL0Zj1GOlHYW4pF45k\nWroV8O8PXe4x3FOVX7d+nGytWD+5P91aOvPMx4fZftp4EdbOf78bx+HDyHhtJaXJVb8F1MOjB08G\nPsn3F77n50s/G21/IYRoTGTQIoQQDZSqqkTujeRG6Q0WD12MjbbqgUDuN99QEBuLx0vTsfb2Nsr+\nOYWlTFqzn8vZhax5rB/927jVfbErcXDqexj8PDi2MEp/9XEqTiKdhWgKWnVzx8XDnoTtSZZuxWBU\nGJQVwa7ldV7C2c6aDycH08HLiSc/OkTM2SyjtKYoCj5hYQCkhYejVhNHHRIYQo8WPYjaG0VGofGG\nPUII0VjIoEUIIRqo7y98z7akbfyz9z/p6Nqxyrry7GwyFi/BvndvXMeNM8reuUVlPLJmP+cz8ln1\naD8Gta/HcERVYfMCcPKGgc8Ypb/6UPUqCRLpLEST8Oeo54zLDeBOkRYdoM+jcHAtXLtQ52VcHKz5\naEowbVs4MvXDA8RdyDZKe9YtW+L54osUxMSQ9/33VdZZaaxYNGQRpbpSwmOrH8oIIURTJIMWIYRo\ngNIK0li8bzG9PXvzaNdHq61Nj16EvrAQn6hIFE39/1q/UVzGY2v3cyotj3cfMcSK1svpHyFpH4yY\nDTaO9e6vvq6cuEZuRhGB8jaLEE1C50GGqOeEhhD1DIa/C7XWsDWqXsu4OdqwYXGq1/UAACAASURB\nVGowfq4OTF5/gIOXrhmlPdcJ47Hv2ZP06EWUX6t6zdYurXmh7wvsTtnN1+e+NsreQgjRWMigRQgh\nGhhVVQmLDaNcLWfh4IVoNdoqa29s307ejz/i/tST2LZvX++9C0rKeWLdAY6l5PLmhD7c1tmrfgvq\nymFLOLToCL0fqXd/xpCwPRkHZxva9ZFIZyGaAtvfop4PNoCoZ4Bm3jDwOTj+FaQcqtdSLZxs2Tg1\nGC9nOx5fd4AjV67Xuz1Fq8VnYRS6ggLSlyyptnZ85/H09+7P0v1LSclvAOlOQgjRQMigRQghGpgv\nznxB7NXY32M0q6LLLyAtIhLbDu1pERJS732LSnVM+eAAh69cZ+W43tzRzQh3vRzdAFlnDPcSaK3q\nv1495aQXcuV4Nt2HS6SzEE3Jb1HPJ2IayDBg0D/BoQVsDjMcr6wHT2c7NoYE4+Zow6Nr93MsJbfe\n7dl26ECLadPI+/Y78nfvrrJOo2iIGhyFoijM3zMfvWrhdCchhGgg5LdMIYRoQJLyknjl4CsM9BnI\nw50errY2c8UKytPT8YmKQrGpX3JOcZmOaR8dZN/Fa/z74V7cHehTr/UAKC2A7YvBPxg6313/9Ywg\ncUcyGq1C1yEtLd2KEMKMfot6TtyZgk7XAIYBds4wfCZc2g3nttZ7OR8XezaGBONsZ82kNfs4cbX+\n99G4PzkNm3btSA0LQ19QUGVdS6eWzAqaxYG0A3xy6pN67yuEEI2BDFqEEKKB0Ol1zNszD62iJXJw\nZLURzYWHD3P9k09wnTQJ+1696rVvSbmOpzccYvfZLJY9EMjYXr71Wu93cW9DfhqMiQQjxU3XR2lR\nOSf3ptK+nyeOLraWbkcIYWa/Rz0fbgBRzwB9nwDXNrAlDPS6ei/n5+rAJyEDsLfWMmnNPs6k36jX\nehobG3yioihPTSNj5cpqa/+v/f8xzG8Y/z70by7mXqzXvkII0RjIoEUIIRqIDSc3cDjjMLP7z8bb\nsepjO/rSUlLnL8DKxxuP55+v156l5Xqe/fgI209nsui+Hvyjn3+91vtdQTbErIROd0PAAOOsWU+n\n4lIpK9YROMJIf0YhxC3lj6jnBnIprpUNjJoP6ccg4XOjLBng7sDGkAFYaRQmrNrH+cz8eq3n0Kc3\nruPHc/2jDRTFx1dZpygK4QPDsdXaMi9mHuX68nrtK4QQtzoZtAghRANwPuc8rx9+nRH+I7i33b3V\n1ma/9z6l58/jEx6O1qnuKT7lOj3Pf3qELSfTiRzbjQnBVd8Hc9N2LYeyAhgdZrw160HVqyTuSDFE\nOreRSGchmqI/op5zG0bUM0DX+6Blb9geDWXFRlmyTQtHNoYEAyoTVsVxKavqYz+14TH9Ray8vEid\nNx+1tOrLhD0cPJg3YB4JWQmsP76+XnsKIcStTgYtQghhYWX6MkJjQnGwdiBsYFi1R4ZKzp4l6/33\ncf7733EaNqzOe+r0KtM/j+enY2nMu7sLjw5sXee1Krh2EQ6sht6TwKOT8dathysnr5GTXiiRzkI0\ncZ0H+WDVkKKeNRoYHQG5SXBgldGWbe/ZjI+nDqC0XM+EVXEkXSus81paJye8wxYYfv6sXl1t7Z1t\n7uSO1nfw1tG3OH3tdJ33FEKIW51JBy2KovxNUZTTiqKcUxRldhU1DymKckJRlOOKomw0ZT9CCNEQ\nrUlcw/Hs48wfMJ8W9i2qrFN1OlLnzUfr6IjX3Dl13k+vV5mxKZ5v468y62+dmTq0bZ3XqtS2haCx\nghFzjbtuPSRKpLMQAkPUc5cB3g0n6hmg7XBoPxp2vQJF9Y9n/k0n72ZsmBpMQamO8aviuJpTVOe1\nmo0cifNdd5H9zruUnD9fbW1ocCguNi6ExoRSpiur855CCHErM9mgRVEULfAWcCfQFRivKErX/6np\nAMwBBquq2g14wVT9CCFEQ3Qy+yTvxb/HnW3u5PbWt1dbe33jJxTFx+M1dw5Wbm512k+vV5n7dSJf\nHU5h+piOPD2iXZ3WqdLVI3BsEwx8BpyNkFxkBDnphVw+lk23YRLpLIQwXIrboKKewfBWS3EuxPzb\nqMt2a+nCR1P6k1tYxvhVcaTn1f14klfoXDQODqTOX4Cqrzq5ydXOlbCBYZy+fpp34t+p835CCHEr\nM+VvnP2Bc6qqXlBVtRT4FBj7PzUhwFuqql4HUFU1w4T9CCFEg1KqK2VuzFxc7VwJDQ6ttrbs6lUy\n/v1vHIcMwfmee+q0n6qqhH17nE8PJPHcyPb8a1SHOq1TrS3hYO8Gg+t3Sa8x/Rbp3G2oRDoLIQxR\nz/5d3TjWUKKeAby7Q89xEPcu5Br3WFOgX3M+mNKfrBsljF8VR+aNkjqtY+Xujufs2RQdPkzOZ59V\nWzsyYCRj241lzbE1JGQm1Gk/IYS4lZly0OILJP3pn5N//dqfdQQ6KoqyR1GUOEVR/mbCfoQQokF5\n6+hbnMs5R/igcFxsXaqsU1WV1IgIUFW8w8OrvcOlujWivj/JR3GXeXJYW166vWN9Wq/cua1wYQcM\nmwF2Vf95zKm0+NdI574S6SyE+EPgSD8Kcku5cKSBRD0DjJwLqLB9sdGX7hPgyron+pOaU8zE1XFk\n59dt2OLyf2NxHDSQjFdepSwtrdraWf1n4engSWhMKMXlxrnoVwghbhWKqqqmWVhRHgT+pqrq1F//\n+REgWFXV5/5U8z1QBjwE+AG7gB6qqub8z1rTgGkAXl5efT/99FOT9GwO+fn5ODk5WboNISxGvgcM\nLhRf4LX01xjgNIAJ7hOqrbXbvx+Xteu48Y8HKRw16qb3UlWVL86U8ePFMsa0smJCZ5s6DWuq30RP\n30PTsSovYH//t1E11sZdv46yz6ikHVZpM0bBwd3If+Y6ku8B0dQ1hO8BVVU594OK1g7ajm44Rwrb\nnVuHX/K3HOz3GgVOrYy+/slsHSsOFePtqGFWkB1ONjf/96I2MxP3yChKu3Qm5+mnoZqfJ6eKTvFW\nxluMbDaS+93ur0/rjUZD+P+/EJZ0q38PjBw58pCqqv1qqrMyYQ8pgP+f/tnv16/9WTKwT1XVMuCi\noihngA7AgT8Xqar6PvA+QL9+/dQRI0aYqmeT27FjB7dy/0LUl3wPQGFZIcu/W46Pow8r7lmBk03V\nP2zKr1/nwpy5WAcG0jk8HEWrven9Vvxymh8vnmPSgACixnY3/pAFIP4zyL8I969meOAY469fB6pe\nZeP2fXi2tuKuB2r8eWg28j0gmrqG8j3gpk8i5ouzdG3TB89WDST2vX8gvL6doNwf4O+fG335EUC3\nHplM/fAg7522ZsPUYFzsb34wnn0jn4xly+hTXIzznXdWs98IsuOy+ez0Zzwy6BGCvIPq3nwj0VD+\n/y+EpTSV7wFTjvAPAB0URWmjKIoNMA749n9q/oPh73wURWmB4SjRBRP2JIQQFrfy8Equ3LhC1OCo\naocsABlLlqK7cQOfqKg6DVle33qW17edY1yQP5H3mmjIUlZsSBry6QndHzD++nWUJJHOQohq/Bb1\nnNhQop4BHNxgyHQ4+1+4FGOSLYZ19OC9SX05lZbHY2v3c6P45pOB3B59BLvu3UlbGI0uN7fa2hf7\nvoh/M3/m75lPQVlBXdsWQohbiskGLaqqlgPPAf8FTgKfq6p6XFGUSEVR7v217L9AtqIoJ4DtwAxV\nVbNN1ZMQQlhaXGocG09tZFKXSfT36V9tbUFcHLnffIP7lCnYdbr5O1Xe3XmeFZvPcH8fXxbd1wON\nxkRHZw6ugdwrhtQMTcN5BT/h10jn9n0l0lkIUdFvUc9nGlLUM0Dwk+DsC5sXgImO+I/s7MlbE/pw\nLCWXJ9YdoKCk/KY+r1hZ4RMViS4nh4xXXq221sHagegh0aQWpPLKwVfq07YQQtwyTPobsaqqP6qq\n2lFV1Xaqqkb/+rUFqqp+++v/VlVVna6qaldVVXuoqnrrXr4ihBA1uFF6gwV7FtDauTX/6vOvamv1\nJSWkhYVjHRBAi6efuum91sRcZMlPp7i3Z0uWP9jTdEOWohzYtRzajoR2I02zRx38Huk8tKVEOgsh\nqvRH1PNVS7fyB2t7w8W4KYfgxDcm2+b2bt68Pr43R5JymPLBAYpKdTf1ebsuXXB77DFyvviCwkOH\nqq3t5dmLx7o9xqYzm4hJMc2bOkII0ZDIb59CCGEmyw8sJ70wnYVDFmJvZV9tbfZ771F6+TLeYQvQ\n2Nnd1D4f7r1E1PcnuLO7Nyse6onWVEMWgD2vQdF1GBNhuj3qIHHnr5HOw/437E4IIf7wR9RzcsOJ\negboOR48u8LWSNDd/NGe2rqrhw8rHurJvovXCPnwIMVlNzds8XjuWaxa+pAaFoZaWv1bQc/2epb2\nzdsTtieM3JLqjxsJIcStTgYtQghhBjuTdvL1ua+Z3H0yPT16Vltbcv48WatW43zPPTgNHnxT+3yy\n/woLvjnO6C5erBzXGyutCf+az02BuHegx0OG+1kaiNLick7GptKuj0Q6CyFqFjiiAUY9a7QwOhyu\nnYdD60261dhevix/sCd7zmfx1IZDlJTXftiicXDAe/58Ss+dJ3vtumprbbW2RA+J5lrxNRbvN36E\ntRBCNCQyaBFCCBPLKc4hfG84HV078nTPp6utVfV6UsPC0Dg44DV71k3ts+lQMnO/TmREJw/emtgb\nG1MfmdmxCFQ93DbPtPvcpNNxaZQV6wi8TS7BFULUrFV3d5w97EnY1oAuxQXocDu0GgI7l0LJDZNu\n9WBfPxbd14MdpzN59uMjlJbX/u2eZiNH0uyOO8h6+21KL1+utrare1em9ZzGDxd+YPPlzfVtWwgh\nGiwZtAghhIlF74smpySHRUMWYaO1qbY296uvKDp4CK8ZL2Pl7l7rPb45msKMTfEMbteCdyf1xdbq\n5hOKbkrGSTi6EYKmgmsr0+51E1S9SsL2ZDxbNcO7jYul2xFC3AIUjULgCD/SLuSScTnP0u38QVEM\nxzILMiH2TZNvN75/AJFju7HlZDrPf3qE8ps4SuU1dy6KjQ1pERGoNVzgO7XHVLq6dyVqbxTZRZKB\nIYRonGTQIoQQJvTzxZ/5+dLPPN3zaTq5daq2tjw7m/Tlr2Dfry8u999f6z1+TExl+ufxBLdxY9Wj\n/bCzNvGQBWBLBNg4wdCXTb/XTfg90vk2f0u3IoS4hTTIqGcAv37QdSzEvgH5GSbf7tGBrZl3dxd+\nOpbGi5/Ho9PXLvXI2ssTj+kvUhC7l7zvv6++VmNN9OBoCsoKiNwbWeNgRgghbkUyaBFCCBPJKspi\n4b6FdHfvzuTuk2usT1+6FH1hIT4RESi1jEn+5Xga//rkCL39m7PmsSDsbcwwZLkcC2d+giEvgGPt\n37oxB4l0FkLURYONegYYFQblxbBzmVm2mzq0LbPv7Mx38VeZsSkefS2HLa4PP4xdz0DSFy9Bl5NT\nbW171/b8s/c/2Za0je8vVD+YEUKIW5EMWoQQwgRUVSU8Npzi8mKih0ZjpbGqtj5/zx7yvv2OFiFT\nsW3XrlZ7bD+VwbMbD9Pd14V1TwThaFv9HkahqrB5ATTzgeDq75sxN4l0FkLUR4OMegZwbwd9H4dD\n6yD7vFm2fGp4O6aP6chXh1OY+3VirYYtilaLT2Qkutxc0l95pcb6R7o+Qh/PPizet5i0gjRjtC2E\nEA2G/CYqhBAm8M35b9iZvJPn+zxPW5e21dbqi4tJi4jEulUA7k8+Wav1d53J5MkNh+jk3YwPJven\nmZ21Mdqu2anvIfkAjJgDNg7m2bOWJNJZCFEfDTbqGWD4LNDawrYos235r1Ed+Odt7fn0QBILvj1W\nqyM+dp064f7E4+Ru+pLCAweqrdVqtCwcvJBytZyw2DA5QiSEaFRk0CKEEEaWmp/K0v1L6efVj4ld\nJtZYn/Xuu5RduYJPeDga25rjiGPPZxHy4UHaeTixYUowLvZmGrLoyg13s7ToCL1q/nOZ02+Rzu37\nSqSzEKLuAkc2wKhngGZeMOg5OP41pBwy27bTx3TkyeFt2RB3hcjvT9RqGNLimWew9vUlNSwcfWn1\nx7D8nf15qe9LxF6N5YszXxirbSGEsDgZtAghhBHpVT3zY+ejU3VEDY5Co1T/12zJ2bNkr1mLy9h7\ncRw4sMb191+8xpT1B2nl7sCGKf1p7lB9ipFRHfkIss/C6HDQmuGY0k04tffXSOeRcgmuEKLuWnVr\noFHPAIP+CQ4tYHOY4RinGSiKwuy/deaJwa1Zt+cSS346VeOwRePggHfYAkovXCB79eoa93io00MM\n9BnIKwdfISkvyVitCyGERcmgRQghjOjz05+zL3UfM4Jm4NfMr9paVa8nNSwcrYMDnrNm1bj24SvX\neWLdfnya27FhajDuTmZ8c6O0AHYsAf9g6HSX+fatBVWvkrgjGa82zni1cbZ0O0KIW1iDjXoGsG1m\nOEJ0aTec22K2bRVFYcHfuzJpQADv7brAis1navyM07BhON91J9nvvkfJxYs1rh85OBKtomV+7Hz0\nagM7tiWEEHUggxYhhDCSpLwkVhxaweCWg3mww4M11uds2kTR4cN4zpyJlZtbtbUJyTk8tnY/Hs1s\n+SRkAJ7N7IzVdu3EvQ35aTAmEhTFvHvX4Mpvkc4jqx9sCSFEbXQe5IO1rZaEhhb1DIZLcV3bGN5q\n0evMtq2iKETe251xQf68se0cr289W+NnPGfPRrG1JS2i5ghnb0dvZvWfxaH0Q3x88mNjtS2EEBYj\ngxYhhDACvapn3p55WClWhA8KR6lhGFGelUXGK6/iEBSEy/33VVt7/Gouj6zZj4u9NRtDBuDlbOYh\nS0E2xKyETndDwADz7l0LCdsMkc7t+kiksxCi/mztreg80IezDTHq2coGRs2HjOOQ8LlZt9ZoFBbd\n14P7+/iyYvMZ3tlRfQKStacnni9NpzAujtxvvqlx/bHtxjLcbzgrD6/kYm71b8EIIURDJ4MWIYQw\ngg0nNnA44zCz+s/C29G7xvr0JUtRi4rwjqh+KHM67QaTVu/D0UbLJyEDaNnc3pht186u5VBWAKPD\nzL93DXLSC7lyPJtuw3wl0lkIYTQ9Rvj+GvWcYulWKup6H7TsDdujoazYrFtrNArLH+zJvT1bsvTn\nU6zefaHa+uYPPYR9r15kLFlK+fXr1dYqikLYwDBstbbM2zMPnRnf2BFCCGOT30qFEKKeLuZe5PUj\nrzPcbzj3tru3xvr83THkff897tOmYdu26ujncxn5TFwdh42Vho0hA/B3s0Cc8vVLcGA19J4EHp3M\nv38NEnf8Guk8tKWlWxFCNCKu3o4EdHUjcWdKw4t61mhgdATkJsGBVWbfXqtRWPFQT+7s7s3CH07y\n4d5LVdYqGg3eERHo8vPJWP5KjWt7OHgwN3guCZkJfHDiA+M1LYQQZiaDFiGEqAedXse8mHnYam0J\nGxhW45EhfVERaRER2LRujfu0kCrrLmYVMGFVHKCwMWQArVs4GrnzWtq2EDRWMGKOZfavRmlROSf3\nptK+n0Q6CyGMr8dIPwpzS7lwuIFFPQO0HQ7tRsGuV6Aox+zbW2k1vD6+N6O7eLHgm+N8sv9KlbV2\nnTri/sQT5H71FQX79te49l1t7mJ0wGjePPIm566fM2bbQghhNjJoEUKIelh/fD0JWQmEBofi4eBR\nY33WO+9SlpyMd3g4GtvKhwNJ1wqZsCqOcr3KxpBg2nk4Gbvt2kmNh8QvYMDT4Nzw3hg5FZcqkc5C\nCJNp1c0dFw97ErY30MjhMRFQnAsx/7bI9tZaDW9N7M2ITh7M/TqRTYeqvjy4xTNPY+3nR1pYGPrS\n6u+9URSFeQPm4WTtROieUMr0ZcZuXQghTE4GLUIIUUdnr5/lraNvMabVGO5sc2eN9cVnzpC9di0u\n992H44DgSmtScooY934cRWU6NkwJpqNXM2O3XXubw8DeFQY/b7keqqDqVRK2/xrp3FoinYUQxqdo\nFHqM9CPtQh7plxpY1DOAdw8IfAj2vQu5lrlLxtZKy7uT+jK4XQtmbIrnm6OV96Gxt8c7LIzSS5fI\nfr/m407u9u7MHzifE9knWJO4xthtCyGEycmgRQgh6qBMX0ZoTCjNbJoxb8C8Go8MqXo9aWHhaJ2c\n8Jw5o9KatNxixr8fR15xGRumBNO1pQUHCOe3wYXtMGwG2De3XB9VuHLiGrkZRQTeJpHOQgjT6TLQ\nEPWc2BCjngFGhoKqhx2LLNaCnbWWVY/2I7iNG9M/j+fHxNRK65yGDsH57rvJfu89Si7UnCr023/E\neC/+PU5dO2XstoUQwqRk0CKEEHWwOnE1J6+dZP6A+bjZudVYn/P5FxQdOYLnrFlYubpWeJ6RV8yE\nVXFcKyjlw8n96e7rYoq2a0evN7zN4hIAQVMt10c1ErYnGSKde0uksxDCdGz+FPVckFti6XYqcm0F\nQSFwdCNknLRYG/Y2WtY8FkRv/+b865Mj/HI8rdI6rzmzUeztSQsPR1XVGtcNDQ6luV1zQmNCKdPJ\nESIhxK1DBi1CCHGTTmaf5P349w0X9rUaXWN9eWYmGa++ikNwMC7/N7bC86z8Eiau3kdaXjHrnwii\nd0DFQYxZHf8K0hLgtnlg1fAumb2eVsCV49foPlwinYUQptdjhC96ncqJmKuWbqVyw14GGyfYEmHR\nNhxtrVj3RBDdfV14duNhtp/KqFBj1aIFni+/ROH+/eR+/Z8a13SxdSF8YDhnrp/h3YR3TdG2EEKY\nhPyGKoQQN6FUV0roHsN/YZsbPLdWn0lfvBi1uBjv8IqpRNcLSpm0eh9J1wtZ81gQ/VrX/HaMSZWX\nwNZI8OoBPf5h2V6qkLgz5ddIZ19LtyKEaAJcvR0J6ObGsV0p6MobWNQzgIMbDHkBzvwEl2Mt2koz\nO2s+mNyfTt7NeHLDIXafrZjY1PzBB7Hv04eMZcsov369xjWH+w9nbLuxrElcw7GsY6ZoWwghjK5W\ngxZFUToqirJVUZRjv/5zoKIo80zbmhBCNDzvxr/L2etnCR8Yjottzcd78nftIu/Hn3B/6kls27T5\ny7PcwjImrdnHhawCVj8axMB27qZqu/YOroOcyzAmHDQNbxZfWlTOqdhUOvTzwsHZxtLtCCGaiMCR\n/hTmlnL+SMW3NBqE4KehmQ9sXgC1OJJjSi721myYEkzbFo5M/eAgseez/vJc0WjwiQhHV1BAxpKl\ntVpzZv+ZuNu7ExoTSomuAR7hEkKI/1Hb36JXAXOAMgBVVROAcaZqSgghGqJjWcdYc2wNY9uNZbj/\n8Brr9UVFpEVEYtO2Le4hIX95lldcxqNr93E2PZ/3HunLkA4tTNV27RXnwa5l0GYYtBtl6W4qdXJv\nKmUlOnqMlEtwhRDmE9DVDRdPexK2NdBLcW0cYMQcSD4Ap763dDc0d7Dh46nBBLg5MGX9QQ5cuvaX\n57YdOuA+ZTK533xDQVxcjes52zgTOSiSC7kXeOvIW6ZqWwghjKa2gxYHVVX3/8/Xyo3djBBCNFQl\nuhJCY0LxsPdgVv9ZtfpM1ttvU5aSgk9EOBqbP96+yC8p54l1Bzh+NY+3JvZhZKcGcqFr7OtQmA2j\nI6CGFCVLUPUqiduT8W4rkc5CCPNSNAqBI/1Iv5hH+sUGGPUM0GsitOhkuKtFZ/lf092dbPk4JBgf\nFzueWHeAw1f+ekyoxVNPYR0QQFpYOPqSmt9SGew7mAc7Psj64+s5mnHUVG0LIYRR1HbQkqUoSjtA\nBVAU5UGg8uw2IYRohN488iYXci8QOSiSZjbNaqwvPn2a7LXrcHngfhyCgn7/emFpOZPXH+BoUg5v\njO/NmK5epmy79m6kwd63oNv94NvH0t1U6vLxbHIziwgc6W/pVoQQTVDnAT5Y22lJ2JFk6VYqp7WC\n0WGQfRaOfGTpbgDwbGbHxpABuDvZ8Nja/SQm5/7+TGNnh3fYAkovX/5/9u47Oqpq7eP496T3hPSQ\nQu+BhEBI6CCIwLVwbVcRlX7FriDS0ghN7F0vRVTE3htK74QaQu+B9N7rJHPeP8L16iuQyZDkzMDz\nWeusyMzZOz90mZk8s/d+yHv/fYPmm9F7Bi2dWjJvxzwqaiqaKrYQQlwzQwstjwHvA50VRUkDngam\nNVkqIYQwIQezD/Lh0Q+5p+M99PPvV+/9ql5PRnQ0li4ueM+Y8cfjlbpapny0j33J+bz6r1BGdfdr\nytgNs3kJ1FbDsCitk1zR4U2pOLja0DbMS+soQogb0H9bPZ/Zl22arZ4BOo2GwEjYvBiqy7ROA4Cv\na12xxdXemnErEjiW/r8VQU79++Ny223kLltO1dmz9c7laO3I/H7zuVB8gTcOvNGUsYUQ4poYVGhR\nVfWcqqrDAS+gs6qqA1RVTW7SZEIIYQLKdeXM2z6Plk4tmd57ukFjCj//nMpDSfjMnoVVi7pWzVU1\ntfz74/3sPJvHi3eHcHtIy6aM3TC5p+HAR9B7Iri31TrNZRVklnHxWD7Bg/yxtDS9Q3qFEDeGHkMC\n0NeqHN1moq2eFQVung+lWbD7Ha3T/MHfzZ5Pp0TiaGPJuBUJnMws+eM5n1nPY+HgQEZMDKq+/q5O\nffz6MLbzWFYfX83ezL1NGVsIIYx21XeriqI8++cL+Dcw5U9/FkKI69rrB17nYslF4vvH42jtWO/9\nuuxssl9+BYe+kbjcdhsA1TV6HvvkAFtO5bDkzu7c1cvEDnLdEAfW9jBoptZJrujw5jQsrKSlsxBC\nW24+DgR18+CoqbZ6BgiKgM63wvbXoSy3/vubSaC7A2umRGJlofDA8gTOZJcCYOXhgc9zM6jYt5+i\nb781aK6nwp4iyDmIqB1RlOvKmzK2EEIYpb6PBZ0vXb2p2yrkf+l6BDDNTfxCCNFI9mTsYc2JNTzQ\n5QHCfcPrHwBkL1mCWl2NX0wMiqKgq9Xz5KcHWX88m/gxwfwrPKiJUzdQyl44/iP0exKcTHNLTlVF\nDSd2SUtnIYRp6HFTAOXF1Zw9YKKtngGGRYOuDLa+pHWSv2jt6ciaKZEAGLtXuQAAIABJREFUjF22\nm/O5ddubXO+8E/tevche+iI1+flXmwIAB2sHFgxYQHppOi/ve7lJMwshhDGuWmhRVTVOVdU4IAAI\nU1V1uqqq04FegIn9tiCEEI2nTFdG9M5ogpyDeLLnkwaNKd22neJffsXj31Oxad2amlo9z35xiLVH\nM4m+tSsPRrZq4tQNpKqwLhocvaHvY1qnuaITO+taOveQls5CCBMQ1MUdNx8HkjaZaKtnAK9O0PNB\n2Lsc8s9rneYv2ns78cnkCGr0KmOX7SYlvxzFwgK/2Bhqy8rIXvqiQfP09O7JQ10f4otTX7AzfWcT\npxZCiIYxdKO7D1D9pz9XX3pMCCGuSy/ve5n00nQWDFiAg7VDvffrKyvJnD8fmzZt8JgyhVq9ysyv\nkvjxUDqzR3Vm4oA2zZC6gU79Bhd3wpDnwdZJ6zSXpepVkjan4tvWFe9W0tJZCKE9xUKh+5C6Vs+Z\n54vqH6CVIbPBwgo2LdQ6yd908nVm9aQIyqtruX/ZbtIKK7Dt0AGPiRMp+u47yhL2GDTP4z0fp41r\nG6J3RFNSXVL/ACGEaCaGFlo+AvYoihKrKEoskAB82GSphBBCQzvTdvLlqS95uNvD9PTuadCY3Hff\nQ5eSgm9MDFhZM/ubJL45mMaMER359+B2TZzYCPpaWB8L7u0g7GGt01zRhaN5FOdUyGoWIYRJ6dzX\nF2s7Sw6b8qoWFz/o+ygc/hLSE7VO8zddW7qwelIERRU6xi7bTWZRJZ7THsE6IIDM2Fj01dX1zmFn\nZcfC/gvJqcjhxb2GrYQRQojmYGjXoYXABKDg0jVBVdVFTRlMCCG0UFxdTPTOaNq6tuXxno8bNKbq\n9GnyVq7E9Y47cIjoQ9T3R/hiXypPDuvA4zd1aOLERjr0KeQcr9vHb2mtdZorStqUiqO0dBZCmBgb\nOyu69PXjzH4TbvUM0P8psHevK6yboO4Brnw0sQ95pdWMXbab3BoF35hoqs+fJ2/5csPm8OrOpOBJ\nfHvmW7ambm3ixEIIYRiDCi2KogQBucC3l668S48JIcR1ZemepeRW5LJwwEJsLW3rvV/V68mIjcPS\nwQGvmc8R9+MxPkm4yCOD2/HMcBMtsugqYNMi8O8FXe/QOs0VFWSWkXIsn+DB0tJZCGF6uv+31fPW\nNK2jXJmdKwx6Ds5tgrMbtU5zWT2DWvDBhHAyiyt5YFkCVT374DxqJHnvvU91crJBczwS8ggdWnQg\ndmcsRVUmvJ1LCHHDMPSd68/AT5euDcA54NemCiWEEFrYkrKF789+z8TgiQR7Bhs0puibb6jYvx+v\n52bwYkI2q3YmM2lAG54f2QlFUZo4sZES3ofiNLh5PphqRuDwplQsrBS6DpCWzkII0+Pm40CrYA+O\nbEs33VbPAOGTwC0I1sWA3jRzhrd2Z8XD4aQUlPPA8gTsnpqBYmND5vz5qKpa73gbSxsWDVhEQWUB\ni/csbobEQghxdYZuHequqmqPS1cHoA+wq2mjCSFE8ymsLCR2VywdW3RkWsg0g8bU5OeT/eJL2Pfq\nxXKnbvxn6zke6tuKef/oYrpFlvJ82P4KdLgFWg/QOs0VVVXUcHx3Jh2lpbMQwoT1GBpARXE1Z/ab\ncKtnK1u4KQoyk+DI11qnuaK+7TxY9lBvzuWWMf7Hczg/8SRlO3dR/NPPBo3v7N6ZqSFT+fncz2y4\nsKGJ0wohxNUZtRZbVdUDQEQjZxFCCM0s2rOIwspCFg5YiLWBZ5Zkv7CU2vJy1o+cwNubz3F/n0Bi\nb+tmukUWqCuyVBbD8Bitk1zViZ0Z1FTV0l0OwRVCmLBAc2j1DBB8N/h2h43zocZ0z5QZ2MGL98f1\n4mRmCY8Wt8Y6OJisJUuoLTJsO9Dk7pPp4t6F+bvnk1+Z38RphRDiygw9o+XZP10zFEVZA6Q3cTYh\nhGgW6y6s49fzvzI1ZCqd3TsbNKZsdwJF339P8rAxLDhayd29Alg4pjsWFiZcZClMgYT/QOhY8Omm\ndZor0utVkjal4NdOWjoLIUybYqHQY2gA2ckm3urZwgKGx0HhRdi3Uus0VzW0szdvjw3jSEYJr/a4\ni9rCQrJfedWgsdYW1iwcsJCS6hIW7F5g0LYjIYRoCoauaHH+02VL3ZktpnuCohBCGCi3Ipf4XfF0\n9ejK5O6TDRqjr64mMzaWCi9fnrIO447QlrxwVw/TLrIAbFxQ93XIbG1z1OPikTyKcytlNYsQwix0\niqxr9Zy00cRXtbS7CdoMhi1LoaJQ6zRXNaKbL2/e35O1lS7sDBlG4eefU37woEFjO7TowGOhj/3x\nIYoQQmjB0ELLMVVV4y5dC1VV/QS4rSmDCSFEU1NVlfhd8ZTpylg0YBHWFoZtGcpbtozq5GQWtL+N\n4aGBvHxPCJamXmRJT4Skz6Dvo+AWqHWaq0ralFLX0rmntHQWQpg+GzsruvTz4+z+bMoKTXdbDooC\nIxZARUHdNlITN6q7H6/cG8LL/oMpcnYnPToGVaczaOz4buMJ8QphYcJCsstN+PwcIcR1y9BCy+U+\n/jTtj0SFEKIeP577kY0pG3ky7EnaubUzaEx1cjLZ773PFv9QPIYO4vX7emJl6q2HVRV+nwcOHjDg\nGa3TXFV+ehkpxwsIHhwgLZ2FEGaj+5AA9KrKkW0m3OoZwK8HhNwHu9+r20Zk4u4I9Wf+fX14vevt\n6E6fJvuDVQaNs7SwZOGAhVTXVhOzM0a2EAkhmt1V38UqijJKUZQ3AX9FUd7407UKqGmWhEII0QQy\nyzJZkrCEMO8wxnUZZ9AYVVU5NH0OFaolR8ZM4K2xPbE2h2LA6d8heRsMngV2rlqnuarDm1OxtLKg\n28CWWkcRQgiDuXnXtXo+ujWNWp1ptlD+w03z6la3bIjXOolB7u4VwB2P3c9O325kvfEWZRdSDBrX\nyqUVz/R6hu1p2/nm9DdNnFIIIf6qvt8Q0oF9QCWw/0/XD8AtTRtNCCGahqqqRO+IpkatYUH/BVha\nWBo0buNbH+N09CDbhtzDS48Mw9bKsHGaqq2B36PAvR30nqB1mquqKtdxIiGTDuHe2DtLS2chhHnp\nMTSAihIdZw6Y+FYV1wDo+xgc/gLSDmidxiD39QnCccbz1Kiw5bGZVNfUGjau831E+EawdO9S0kpN\nfLWREOK6ctVCi6qqh1RV/RBop6rqh3+6vlFVtaCZMgohRKP68tSX7MrYxYzeMwh0Mey8kl93nsJ+\n+Zuk+bbl3y/OwM7aDIosAAc/gtyTcHMcGNi2WivHL7V07jHUtM+QEUKIywns4k4LXweSNqaY/laV\n/k+Dg2ddId7Us15y363hZN71EG3OJPJ23HJq9fXntlAsmN9/PoqiELUjCr1q4quNhBDXjfq2Dn1x\n6R8PKoqS9P+vZsgnhBCNKqU4hZf2vURfv77c0/Eeg8b8djST4/MX41JdTq/XX8DB3kxWW1SVwKbF\nENQXOt+qdZqr0utVDm9Oxa+9K15BzlrHEUKIBlMUhe5DAsi+UELW+WKt41ydnQsMmQUXtsOptVqn\nMdio6KcoDWxL7x9XMufjXQYVW1o6teT58OfZm7mXT0982gwphRCi/q1DT136eit1XYb+/yWEEGaj\nVl/LvB3zsFKs/viEqz4bT2Tx1ptfMyp5N67jxtEiJLgZkjaSHW9AWXZdlwkD/q5auvDfls5DpKWz\nEMJ8dYr0xcbOkqRNJt7qGaDXePDoULeqpdawbj5aU6ysCH55MR5VJbh9/gFzvjmM3oBiy5j2Yxgc\nMJhX97/K+aLzzZBUCHGjq2/rUMalrxcudzVPRCGEaByrj6/mQPYBZkXMwtfRt977t5zK4bEP9/JM\n0rdY+vri//STzZCykRSnw843odudENBb6zT1StqYgqObrbR0FkKYtbpWzy05uz+b0gITbvUMddtJ\nb46DvNNw4EOt0xjMvkcP3O+/jzvO72T/+l1E/3Ck3q1aiqIQ0zcGOys75m2fR41eenoIIZpWfVuH\nShRFKf7TVfLnr80VUgghrtXZwrO8ceANbgq8idva1r8gb+eZXKZ+tI8JGbvwy0/DL2oeFo6OzZC0\nkWxcCGotDI/ROkm9clNLSD1RQPch/tLSWQhh9roPrWv1fHizGaxq6TQaWvWHzUug0nze2ns98wxW\nHu7En/mRNbuSmf/TsXqLLV4OXsyLmEdSbhKrjq5qjphCiBtYfStanFVVdfnT5fznr80VUgghroVO\nr2Pu9rk4WjsS1Teq3i1De87nM+nDfYTZVHDbwV9wGjYM52HDmiltI8g8AomfQJ+p0KK11mnqdWh9\nClY2FnQb6K91FCGEuGauXva0DfXi6LY0qitNfOWEosCIeCjLgR2va53GYJbOzvjOmY1b6lkWcIIP\ndiSz+NcT9RZbRrYZycjWI3k78W1O5p9sprRCiBuRwR8dKooSpijKk4qiPKEoSs+mDCWEEI1p+eHl\nHM07yrzIeXjae1713v0XCpjwwR5autoSf3EtiqUFvvPmNlPSRrIuCuxcYdAMrZPUq6ywilN7s+jS\nryV2jqbdFUkIIQwVOjyIqvIaTuzK1DpK/fx7QfDdsOstKDKfFsjOo0bhOGAAvdZ/ztQuTvxn6zle\n/v1UvePmRszF1caVudvnojOTs2mEEObHoEKLoijRwIeAB+AJrFIUZV5TBhNCiMZwLO8Y/zn0H0a3\nGc2I1iOueu+hlELGr9yDl7Mtq9qXodu+Da8nnsDaz6+Z0jaCM+vh7EYYPBPsW2idpl5Jm1PR61VC\nhskhuEKI64dfO1d82rhwaMNFgw5r1dywaFD1sGmh1kkMpigKvjHRqDU1PLj/G+7vE8hbm87wxobT\nVx3nZudGbL9YThac5N1D7zZTWiHEjcbQFS0PAOGqqsaoqhoDRAIPNl0sIYS4dtW11czdPhd3O3fm\nRMy56r1H0op4cEUCbo7WfDI2mMpXXsS2SxfcHxzXTGkbgb4Wfo+u2y4UPlnrNPXSVdVydGsabUO8\ncPVy0DqOEEI0qtDhQRTnVpJ8KFfrKPVr0QoiHoHENZCRpHUag9kEBuI5bRqlv//O7Bb53BUWwCvr\nTvHO5jNXHTckcAhj2o9hxZEVJOWYz99XCGE+DC20pAN2f/qzLWA+awuFEDektxPf5kzhGWL7xeJq\n63rF+05mlvDgigScbK1YMzkSyw/+Q01ODn5xsShWVs2Y+BolroHsozAsBqxstU5TrxO7MqgqryF0\neKDWUYQQotG1DfXE2cOOxPUXtY5imIHTwd6tbvtpPWedmBKPiROwad+O7Ph4loxuzx2hLVm69iTL\nt5276riZ4TPxcfBh7va5VNZUNlNaIcSNwtBCSxFwVFGUVYqifAAcAQoVRXlDUZQ3mi6eEEIYJzE7\nkVVHV3FXh7sYGDDwivedyS7hgeW7sbGy4NOpkXimnaPgk09ocf/92Pfo0YyJr1F1GWxcAP69ods/\ntU5TL71eJXFDCj5tXPBtd+UimBBCmCsLSwtCbgok42wRmeeLtI5TP3s3GPw8nNsMZzZoncZgio0N\nfrGx6NLTKXjvXV6+J4TR3X1Z8PNxPtqVfMVxzjbOzO8/n+TiZF4/YD4HAQshzIOhhZZvgTnAJmAz\nMBf4Hth/6RJCCJNRritn7va5+Dn68Vz4c1e871xOKfcvSwAU1kyJJMjVlsyYGKw8PfF65unmC9wY\ndr4FpZlwy8K6LhImLjkpl+KcCkKGBdbbBUoIIcxVl/5+2NhbcWh9itZRDNN7ErRoA7/Pg1oT75j0\nJw69e+N6913krfqQmjNneP2+ntzc1Yfo74+yJuHKK4oi/SK5v/P9rD6+mr2Ze5sxsRDiemdQoUVV\n1Q+vdjV1SCGEaIjXDrzGxZKLxPePx9Ha8bL3XMwrZ+yyBPR6lU+nRNDOy4mCNWuoPHYMnzmzsXR2\nbubU16Akq64tZ5fbIShS6zQGSVx/EWd3O9r19NI6ihBCNBkbOyu6DWjJ2QPZFOdWaB2nflY2cHMc\n5ByHxE+0TtMg3tOnY+nsXPeBiQJvje3J0E5ezPn2MF/uu3Kh6+mwpwlyDiJqRxRlurJmTCyEuJ4Z\n2nXoVkVRDiqKkq8oSrGiKCWKohQ3dTghhGio3Rm7+fTEp4zrMo5w3/DL3pNaUM79y3ZTWVPL6skR\ndPBxRpeZSc5rr+M4cCDOI0c2c+prtHkR1FbB8Fitkxgk63wxGWeKCBkWiIWloQsrhRDCPPW4KQBF\nUUjamKp1FMN0uR0CI+o6EFWVap3GYFYtWuD9/EwqEhMp/PIrbK0seXdcLwZ28GTm10l8d/Dyx0s6\nWDuwcMBCMsoyeGnfS82cWghxvTL0He5rwMOAh6qqLqqqOquq6tKEuYQQosFKqkuI2hFFa5fWPBX2\n1GXvySiqYOyyBEoqdayeFEEXv7ofZVkLF6HW1uIbHWVeW1myj8OBj+q6DHm00zqNQRI3XMTGzpIu\n/c2obbYQQhjJqYUd7Xt7c2xHOlUVZrAdR1FgxAIozYJdb2mdpkFc77gDh4gIsl9+mZrcXOysLfnP\ng72JbOPBs18k8nNSxmXHhXqH8nC3h/nq1FdsS93WzKmFENcjQwstKcARVTWjI8iFEDecpXuXkl2e\nzcIBC7Gzsvvb89nFlYxdlkB+WTUfTYog2L/uENaSTZsoWbcOz0cfxSbQzDrgrIsBG2cYNFPrJAYp\nzqvg7IEcug70x8bOjDo6CSHENQgdHoSuqpZj29K1jmKYwD7QdUzdttSSTK3TGExRFHxjYlArKsha\n8gIA9jaWLH+4N71ateDJzw7y29HL/30eD32c9m7tidkZQ1GVGRxeLIQwaYYWWmYCvyiKMltRlGf/\nezVlMCGEaIjNKZv57sx3TAqeRA+vv3cLyi2tYuzyBLKKK/lwYjihgW4A6MvKyIyPx7ZDezwmjG/m\n1Nfo3GY4/RsMfBYcPbROY5CkjakoQI+hAVpHEUKIZuMV5Ix/RzeSNqVQW6vXOo5hhsdAra5uC5EZ\nsW3bBo+pUyn+6SdKd+wAwNHWipXjw+nu78rjaw6w8UTW38bZWNqwcMBCCioLWLxncXPHFkJcZwwt\ntCwEygE7wPlPlxBCaK6wspDYnbF0bNGRaSHT/vZ8QVk145YnkFpQzsrx4fRq5f7HczlvvkVNega+\ncXEoNjbNGfva6PV1XSFcAyHiEa3TGKSqooZjO9Jp18sbZ/e/rzgSQojrWejwIEoLqjh7IFvrKIZx\nbwt9psDB1ZB1TOs0DeIxdQo2rVuTGTcffWUlAM521nw4sQ+dfV145OMDbD2V87dxXT26MjVkKj+f\n+5l1F9Y1d2whxHXE0EJLS1VV71RVNUZV1bj/Xk2aTAghDLQgYQFF1UUsGrAIa0vrvzxXVK5j3IoE\nzueWseLhcCLb/m/lR+WxY+R/9BFu996LQ1hYc8e+NkmfQ+ZhGBYD1uZRtDi2PR1dZS2hw81se5YQ\nQjSCVsEeuPk4kLguBbPZjT/oObB1hnXRWidpEAtbW3xjY9FdvEjuu+/98birvTUfT+pDO28npny0\nj51ncv82dnL3yXT16Er8rnhyK/7+vBBCGMLQQssviqKMaNIkQghhhLXn1/Jb8m88GvIondw7/eW5\n4kodD61M4HRWKe8/2Iv+7T3/eE6trSUjOgZLd3e8p5vZTkhdBWyMB79QCL5L6zQGqa3Vk7QxhZYd\n3PBuJWepCyFuPIqFQsiwQHIulpB+ulDrOIZxcIeBM+DMOji7Ses0DeIYGYHrP/9J3ooVVJ0+/cfj\nbg42fDI5glYeDkz6cB97zuf/ZZy1hTWLBiyiTFdG/K548ymKCSFMiqGFlmnAWkVRKqS9sxDCVOSU\n57AgYQE9PHswIXjCX54rraph/Mo9HE0v5p0HwhjSyfsvzxes+ZTKI0fwmT0LS1fX5ox97Xa/A8Vp\ndV0hLMyjPfK5AzmUFlQRenOQ1lGEEEIznSN9sXO0JnF9itZRDNdnKrgFwe9RoK/VOk2DeM98Dksn\nJzJiYlH1/zsbx93Rhk8mR9LSzY4JH+xh/4WCv4xr59aOJ8OeZGPKRn4691NzxxZCXAcMeoeuqqoz\n4AkMAW4Dbr30VQghNKGqKnG74qisqWTBgAVYWfyvg015dQ0TV+3lUGoRb43tyfCuPn8Zq8vMJOfV\nV3EcMACX0aObO/q1Kc2Bba9Cp9HQZqDWaQyiqiqJ6y/i5uNA62DzOLRXCCGagpWNJcGD/Uk+nEth\nVrnWcQxjbVe3TTXrcN22VTNi1aIF3s8/T8WBAxR++dVfnvNytmXNlEi8nG0Zv3IPSal/XWU0rss4\nwrzDWJywmMwy8+m8JIQwDQYVWhRFmQxsAdYCsZe+mtdmTSHEdeW7M9+xJXULT4c9TRvXNn88Xqmr\nZfKH+9iXnM9r/wplZLDf38ZmLVyIqtfjGxuDoijNGfvabXkBdOUw3HyOyco4U0j2hRJChgWiWJjZ\nv28hhGhk3YcEYGlpQeIGM1rVEnwXtAyDDfFQbSYFoktcx9yBQ0QE2S+/TE3OXw/A9XGxY82USNwc\nrRm3PIEjaf9r62xpYcmC/guoUWuI3hGNXjWTblFCCJNg6Jrzp4Bw4IKqqkOBnoA0mBdCaCKlJIUl\ne5bQx7cPY7uM/ePxSl0tUz/ez65zebx0Twi3hbT829iSDRsoWbcez8cexSbAzFoM556GfSuh13jw\n6qh1GoMlrk/BztGaTpG+WkcRQgjNObjY0DHCh5O7MqgordY6jmEUpW67akl63fZVM6IoCr6xMagV\nFWQteeFvz7d0s2fN5EicbK14cEUCJzL/dzpCoEsgM3rPYFfGLj498WlzxhZCmDlDCy2VqqpWAiiK\nYquq6gmgUz1jhBCi0dXqa5mzbQ6WSt0nTRZK3Y+x6ho9j31S167xhTt7cGfY34sotaVlZMYvwLZj\nRzzGj2/m5I1gXQxYO8CQ2VonMVhhVjnnk3IJHuyPtY2l1nGEEMIkhAwLpEan5+jWNK2jGK51f+h8\nK2x/FUrNpEX1JbZt2uDxyL8p/vlnSrdt+9vzge4OfDo1EhsrC8YtT+BMdskfz93T8R4G+g/k1f2v\ncq7wXHPGFkKYMUMLLamKorgB3wHrFEX5HrjQdLGEEOLyVh5ZSWJOInMi5+DnVLctSFer54lPD7Dh\nRDYLxgRzb/jl2wfnvvkGNVlZ+MbFolhbX/Yek5W8A07+DAOeAicvrdMY7NCGFCwsFYIH+2sdRQgh\nTIZHSyeCurmTtDmNGp0ZHTA7PLau893mJVonaTCPKVOwaduWzLj56Csq/vZ8Kw9H1kyJBBTGLkvg\nfG4ZULciZn7/+ThYOTBr2yx0tbpmTi6EMEeGHob7T1VVC1VVjQWigBXAmKYMJoQQ/9+xvGO8k/gO\nI1uP5B9t/gFATa2eZz5P5LejWcTc1pVxka0uO7biyFHyP16N233/wqFnz+aMfe30evh9Hji3hMjH\ntE5jsMpSHSd2ZdCpjy+OrrZaxxFCCJMSOjyIiuJqTu/N0jqK4Tw7QO+JsH8V5JzSOk2DWNjY4BcX\niy41ldx33r3sPe28nPh0SgS1epWxy3ZzMa/uPBpPe09i+sZwPP847x66/FghhPizBvcFVVV1i6qq\nP6iqaiabSoUQ14PKmkpmb5uNu5078yLnoSgKtXqV575K4qekDOaM7syE/m0uO1atqSEzOhpLD3e8\nn3mmmZM3gqPfQPoBGBYFNg5apzHYka1p1Oj0hAy7/AojIYS4kQV0boGHvxOJ61NQVVXrOIYbMqtu\nG+v6GK2TNJhDeDiud91J3gcfUHny8oWiDj7OrJ4cQYWulvuX7Sa1oK7YMqzVMMa0H8OKIytIzE5s\nzthCCDPU4EKLEEJo4bUDr3Gu6BzxA+JxtXVFr1eZ9XUS3x5M47lbOjF1ULsrji345BMqjx3Dd84c\nLF1cmjF1I9BVwvo48OkOPf6ldRqD1er0HN6cSlBXdzz8nbSOI4QQJkdRFEKHB5KfXkbKsXyt4xjO\n0RMGPgMnf4Hk7VqnaTDvGTOwdHYmMzoaVX/5TkJd/FxYPSmCkkodY5clkFFUt9VoVp9Z+Dn6MXvb\nbMp0Zc0ZWwhhZqTQIoQweTvTd/LJ8U94oMsD9GvZD1VVmff9Eb7cn8pTwzrw2ND2Vxyry8gg+/U3\ncBw8COeRI5sxdSPZ8z4UXYQR8WBhPofJntqbRXlxNaHDg7SOIoQQJqtDuA8Orjbm1eoZIPJRcPGH\n3+bWbW81I1YtWuAz63kqDh2i8IsvrnhfsL8rH02KIL+smrHLEsgursTR2pFFAxaRXpbOi3tfbMbU\nQghzI4UWIYRJK6oqImp7FG1d2/J02NOoqkrcj8dYk3CRaUPa8fTwDlcdn7lgIej1+EZFoyhKM6Vu\nJKXZsOVFaH8ztBuqdRqDqarKoQ0X8fB3JKBLC63jCCGEybK0sqD7kABSjuWTl1aqdRzDWdvDsBjI\nSIRD5tf22OX223HoG0n2y6+gy75yB6XQQDc+nBhOVnElY5cnkFtaRZhPGBODJ/L16a/ZdHFTM6YW\nQpgTKbQIIUyWqqrE744nvzKfxQMXY2tpy6JfjrNqZzKTB7Rh5i2drlo8KV63jtING/B64nFsAsyw\n682GOKipgJGLtU7SICnH88lLKyNkWJD5FbeEEKKZBQ/yx8rGgsT1F7WO0jDd74GAcFgfC5XFWqdp\nEEVR8IuJQa2qImvx1V9je7VyZ+X4cFILyhm3PIGCsmoeDXmULu5diN0VS25FbjOlFkKYEym0CCFM\n1s/nf+a35N94NLTuDc2Lv51k2bbzPNy3FXP/0eWqv8TXlpaStWAhtp074/7QQ82YupGkHYCDn0DE\nI3VdHszIofUpOLjY0DHcR+soQghh8uwcrenS149Te7IoK6rSOo7hLCxg5AtQlg3bXtI6TYPZtG6N\n57RHKPl1LaVbtlz13si2Hqx4OJzzuWWMW5FAeRUsHriY0upSYnfGmtdhxkKIZiGFFiGEScoozWDR\n7kWEeoUyMXgir284zTubz3J/nyBib+9W70qJnNffoCY7G7+4WBRNlWDdAAAgAElEQVRr62ZK3UhU\nFdbOAgcPGDxT6zQNkpdWysVj+XQfEoCltbzECCGEIXoMC0SvVzm8OVXrKA0T0AtCH4Bd70DeWa3T\nNJjHpEnYtGtHZtx89OXlV723f3tP3n+wF6ezSnloZQJedkE80+sZtqRu4evTXzdTYiGEuZB3wUII\nk6NX9czbMY9atZZFAxfx3pbzvLb+NHf3CmDhmOB6iywVhw9TsHo1Le6/H/uQkGZK3YgOfwUpCTAs\nGuxctU7TIIkbUrCytiB4kBlu1RJCCI24eTvQpocnR7amoauq1TpOwwyLBivbuoNxzYxiY4NfXCy6\n9HRy3n673vuHdPLmnQfCOJpezIQP9nJ723uJ9Itk6d6lXCw2s61fQogmJYUWIYTJ+fjYx+zJ3MOs\nPrNYe1DHi7+dZExoS164qwcWFlcvsqg1NWREx2Dl5YXXM083U+JGVF0G66LBLwR6jtM6TYOUFVVx\nak8mnfv5YedkZquIhBBCY6E3B1FVVsPJ3RlaR2kYZ18Y9Byc+hXOrNc6TYM59O6N2z13k7/qQypP\nnKj3/uFdfXhrbE8SUwqZ/OF+5vSJxcrCitnbZ1Ojr2mGxEIIcyCFFiGESTlVcIrXD7zOTYE3UZgV\nwsJfjvOP7n68dE8IlvUUWQDyP15N1fHj+Mydi6WzczMkbmTbX4WS9Lp972bUzhngyJY09LUqITcF\nah1FCCHMjl87V7xbOZO4IQVVb2ZnfkROgxZtYO0cqNVpnabBvKdPx9LVlYyYGNTa+lcUjQz247V/\nhbIvOZ+5X6YwK3weSTlJLD+8vBnSCiHMgRRahBAmo7q2mtnbZuNs40yw7STifjrOiK4+vHZfKFaW\n9f+40qWlkfPGGzgNGYLziJubIXEjK7gAO96A4LuhVV+t0zSIrrqWI1vSaNPDEzcfB63jCCGE2VEU\nhdCbgyjKruB8kpl1srGyhVsWQe5J2Gt+xQZLNzd8Zs+i8lASBZ9/btCY20Ja8tI9Iew6l8dXWz25\npdUo3jv0HkdyjzRxWiGEOZBCixDCZLx18C1OFZziZq8nWPhjCjd19uatsWFYG1BkUVWVzPgFAPhG\nzTPPtsLrokCxgJvjtE7SYCd3Z1JZpiN0eJDWUYQQwmy16+mFk7sthzakaB2l4TqNgnY3wabFUGZm\nhSLA5dZbcezXj5xXXkWXlW3QmDvDAnjhzh5sPZVDTvJoPO09mb1tNhU1FU2cVghh6qTQIoQwCXsz\n97Lq6Cp6u49ixTp7Bnbw5J0HwrCxMuzHVMnv6yjdvBmvJ5/E2t8MD2I9vxWOfQ8DnwXXAK3TNIiq\nVzm0IQXvVs74tTevw3uFEMKUWFhaEHJTIOmnC8m+UKx1nIZRFLhlMVSXwsYFWqdpMEVR8I2NQdXp\nyFq0yOBx94YHsmBMMFtOlOFZ8RDJxcm8su+VJkwqhDAHUmgRQmiupLqEudvn4m7jx5ZdkfRt68Gy\nh3pjZ23YGSW1JSVkLViAbZcuuD9oXgfIAlBbA2tng2sg9HtC6zQNlnw4l8KsckKHB5nnSiIhhDAh\nXfu3xMbOksR1ZtjFxrsz9JkK+1dBRpLWaRrMJigIz2nTKPntN0o2bTJ43LjIVsTc1pXdxzzwt7iF\nz05+xva07U2YVAhh6qTQIoTQ3JI9S8gqyyLt9Bh6B/mx/GHDiywAOa++Rk1eHn7z41CsrJowaRM5\nsAqyjsCIeLC21zpNgyWuT8HJ3ZZ2YV5aRxFCCLNnY29F1wEtOXMgh5L8Sq3jNNyQ58G+BaydBaqZ\nHeoLeEycgG2H9mTGx6MvKzN43IT+bZg7ugsnjg3AUfEnakcUhZWFTZhUCGHKpNAihNDU78m/88PZ\nH6jOG0p3zx6snBCOg43hxZKKQ4co+PRTWjzwAPbduzdh0iZSng8bF0KrAdB1jNZpGiz7QjHppwsJ\nuSkQCwPO0hFCCFG/Hpe6tyVtNMOzWuxbwLAouLADjn2ndZoGU2xs8I2LoyY9g5y33m7Q2CmD2vLc\niGCyz95FXkUBcbviUM2w2CSEuHbyrlgIoZns8myidsSirwykvc0/WTWxD062hhdZVJ2OjOgYrLy9\n8XrqySZM2oS2vACVhTBqSd3+djOTuD4FaztLuvRvqXUUIYS4bji729E+zItj29OprqjROk7DhT0M\nPsHwexTozO9gWIewMNzuvZf8jz6i8tixBo19bGh7nhgwmMqsEay/uJ4fzv7QRCmFEKZMCi1CCE2o\nqsoT62ZRVl1Jy+qJrJ7YDxc76wbNkf/Rx1SdPInPvLlYOjk1UdImlH0c9iyDXuPB1/xW45TkV3Jm\nfzZdB7TE1t4Mt2wJIYQJC705iOrKWo7tSNc6SsNZWMKoF6AoBXa8oXUao3hPfxbLFi3IiIlFra1t\n0Ninh3dgYveHqSlvTeyOhaSWpDZRSiGEqZJCixBCE0t2rOBY4V7cKu/k84m34+rQsCJLdWoaOW+9\nhdNNN+E8fHgTpWxCqlp3AK6tEwydp3UaoyRtqnvj2GOoeXVJEkIIc+DdyoWWHdxI2piKvlavdZyG\na31pS+z2V6HI/AoNlq6u+MyeReXhwxSs+bRBYxVF4fmRXRnTcjq6Wj0P/fAsNbVmuDJJCGG0Ji20\nKIoyUlGUk4qinFEUZdZV7rtLURRVUZTeTZlHCGEafjx2kE9Ov4NNdVe+HTcDd0ebBo1XVZXM2FhQ\nFHyj5plnp5uTv8C5TTBkDjh6aJ2mwaoraji2LY12YV64eJjfAb5CCGEOQoYFUpJfydkDOVpHMc6I\neECFddFaJzGKy+jROA4YQM6rr6LLyGjQWEVRWHT7YHo7TyCn5jiTvntZzmsR4gbSZIUWRVEsgbeB\nUUBX4H5FUbpe5j5n4CkgoamyCCFMx+mCauZsm4MF1qy+42W8nO0aPEfxjz9Stn073s88g7WfXxOk\nbGI1VfDbHPDqDOGTtE5jlMNbUqmurCVsRCutowghxHWrTQ9PWvg6sH9tMqreDH9JdwuC/k/Bka/h\nwk6t0zSYoij4xsZc+oCn4QfbKorCyrum4WfVh/0lnxK9dl0TJRVCmJqmXNHSBzijquo5VVWrgc+A\nOy5zXzzwAmCG/euEEA1xJK2I187/DHapzIuIpot3w7ec1OTnk7VoMfYhIbQYe38TpGwGu9+BgmQY\nuRgsG7ZlyhToqmpJXJ9Cq2APvIKctY4jhBDXLcVCodeo1uSllXE+KVfrOMbp/xS4+MOvz4O+YWed\nmAKbgAC8nnqS0i1bKP7llwaPt7Cw4NN/void4sTXF5fy/VnDW0YLIcxXU55e6A/8uSddKhDx5xsU\nRQkDAlVV/VlRlOeuNJGiKFOBqQA+Pj5s3ry58dM2k9LSUrPOL4SxUkr0LEk6gYX/JkLs+uCd7cjm\n7M0Nnsdl5QfYlZSQdcftJG/b1vhBm5hNVT599iyh0KMPR1IsIGWz1pEaLPeESmWpioVvvvw8M4K8\nDogbnfw/0DCqXsXaETZ9cZgLBYpZbpf19r+Prsdf5uRnUWS0HKF1nIYLCsK9VStSY2NJVFVUIw7g\nn+B1P+/lvMcveT9h84ENo9qY3wctQjSGG+U1QLM2EYqiWACvAOPru1dV1f8A/wHo3bu3OmTIkCbN\n1pQ2b96MOecXwhins0p4ZtlmLP2+wMWyBe/+8zWcbRq+EqJ061ZS9uzB87HH6Dp2bBMkbQbfTgP0\neI59jyEe7bRO02A1ulo+/mUX/p0cGX13T63jmCV5HRA3Ovl/oOF8bNLZtPoE7bx7ENTN/M71Qh0M\nK3fQKfVzOt35PNi5ap2owSr9/Tl/19102L6DlksWN3j8EIaQv6uAL059zlcXO9Gl4x2M79+mCZIK\nYdpulNeAptw6lAYE/unPAZce+y9nIBjYrChKMhAJ/CAH4gpxfTmbU8p9y3aj9/gKxaqAiV4PG1Vk\n0ZeVkREbi027dnj8e2oTJG0Gqfvg0BqIfBTMsMgCcHxHBuXF1YSPbq11FCGEuGF0ivTFqYUt+35J\nNs8DVRWlrt1zeR5sWap1GqPYdeqEx+RJFH33HaU7dhg1x4zw6fhY+eIa9BVxv+zhk4QLjZxSCGEq\nmrLQshfooChKG0VRbID7gB/++6SqqkWqqnqqqtpaVdXWwG7gdlVV9zVhJiFEM0rOLWPsst3UOuxF\n73CAaaHTaGvX1qi5sl9/nZqMTPzi47GwaViXIpOg19ftT3fygUEztE5jlNoaPQd+u4BfO1dadnTT\nOo4QQtwwLK0sCLulFRlni0g/Vah1HOO0DIWwByHhPcg9rXUao3hOm4ZN69ZkRsegLy9v8Hh7K3sm\nek1AsajAv8P3zP02iS/2ptQ/UAhhdpqs0KKqag3wOPAbcBz4QlXVo4qizFcU5fam+r5CCNOQkl/O\n2GW7qSILK+/v6OXTiyndpxg1V0ViIgUfr6bF/ffjEGam21UOfwFp+2B4LNia5wGyJxMyKS2ootfo\n1mZ5RoAQQpizLv38cHCxYd+vyVpHMd5NUWDtUNd5zwxZ2NriFz8fXVoaOW+8adQcLW1a8lz4cxQp\nh+nU8RDPf5PEtwdTGzmpEEJrTbmiBVVVf1FVtaOqqu1UVV146bFoVVV/uMy9Q2Q1ixDXh/TCCsYu\n301JVSVBnb/BzsqGJQOXYGlh2eC51OpqMqKisPLxwevZZ5sgbTOoKoF1MeDfC3rcp3Uao+hr9exf\newHvVs4EdXXXOo4QQtxwrGwsCb05iNQTBWSeK9I6jnGcvGHwTDj9O5z6Xes0RnEID8ftvn+R/9FH\nVBw+bNQc/+r0L4YGDiXb+mtC25Uy/YtD/JSU3shJhRBaatJCixDixpNVXMnYZbspLNMxelAi50tO\nEdcvDl9HX6Pmy12+nKrTZ/CNicbSybGR0zaTba9AaSaMfAEszPPH7ul92RTnVNBrlKxmEUIIrQQP\n8sfO0dq8V7X0+Td4tIffZkNNtdZpjOI9fTpWnp5kzItC1ekaPF5RFOb3m4+7nTvV7h8T1sqBpz5L\nZO2RzCZIK4TQgnm+4xdCmKSckirGLttNTkkVz96h8kvKZ/yr078YFjTMqPmqzp4l7933cBk9Gueh\nQxs5bTPJPwe73qpbyRIYrnUao6h6lf2/JuPh70ibHp5axxFCiBuWta0lIcMDuXA4j5yLJVrHMY6V\nDdyyGPLOwJ73tU5jFEtnZ3xjoqk6eZK8lR8YNYebnRtLBi4hpeQi7btuICTAlSc+PcCG41mNnFYI\noQUptAghGkVeaRUPLN9NemElrz3QjlWnF9PerT0zeht38Kuq15MRFY2FgwM+c81zLzcAv0eBhXXd\n2Sxm6uzBHAoyy+tWs1jIahYhhNBS9yEB2Nhbmfeqlo4joMOIug5EpdlapzGK87BhON9yC7lvv03V\nufNGzRHuG87UHlP5+fz3PDAsny5+LkxbfYAtp3IaOa0QorlJoUUIcc0Ky6sZt2IPF/LKWfZQGF9d\nfIkyXRkvDnoROys74+b8/HMqDhzAe9YsrDw8GjlxMzm7CU78BIOmg4uf1mmMoqoq+35Nxs3HgXZh\n3lrHEUKIG56tvRU9hgZw7mAOeemlWscx3i2LQFcOG+O1TmI033lzUezsyIyORtXrjZrjkZBHCPUK\n5aX9i1hyrz/tvZ2Y+tE+dpzJbeS0QojmJIUWIcQ1KarQ8eCKPZzNLuU/D/XmTNUv7EzfyczwmbRv\n0d6oOXWZmWS/9DKO/frhOuaORk7cTGprYO1saNEaIh/TOo3RLhzOIy+1lF6jWmEhq1mEEMIkhNwU\niLWtJft/vaB1FON5doCIR+DAx5B+UOs0RrHy8sLn+ZmU79tH4ZdfGTeHhRUvDHoBBYWFe+examIY\nrT0cmfThXhLO5TVyYiFEc5FCixDCaCWVOsZ/sIcTmcW8Oy4MT/dsXj/4OsOChnFPx3uMmlNVVTJj\n41D1enznx5nvwav7VkLOcRixEKyNW9WjNVVV2ftLMi6ednQI99E6jhBCiEvsnKwJHuzPmX1ZFGaV\nax3HeINngoMH/DoLVFXrNEZxvfNOHCIjyX7xRXRZxm2DaunUkph+MSTlJvHp6eV8MiUCfzd7Jqza\ny/4L+Y2cWAjRHKTQIoQwSllVDRNX7eVwahFvjQ0jsr0TM7fOxMPOg7h+xhdIStaupXTzZryefBKb\ngIBGTt1MyvNh00JoMxg6/0PrNEZLPV5AdnIxYbe0wtJSXi6EEMKUhA4PwsLKgv2/mfGqFjtXGBYN\nKbvhyNdapzGKoij4xcWi6nRkxs9HNbJgdEvrW7irw12sOLyCMyUH+XRKJD4udoxfuZfElMJGTi2E\naGryzlkI0WAV1bVM+nAv+y8U8Pp9Pbmlmy+LEhaRWprKkoFLcLV1NWre2sJCMhcsxC44GPcHxzVy\n6ma0aSFUlcDIJWCuK3KAfb8m49TCls6R5nm+jBBCXM8cXGzoNqAlp3ZnUpxboXUc4/UcB34hsC4a\nqsu0TmMUm1at8HricUrXb6Dk93VGzzMzfCatXVszZ9scrGzKWTMlghaONjy0IoEjaUWNmFgI0dSk\n0CKEaJBKXS1TP95Hwvl8Xrk3lH/08OPHsz/yw9kf+HePf9Pbt7fRc2ctfZHawkL8FsSjWFk1Yupm\nlHagbttQ+CTw6ap1GqOlny4g/XQhPUcEYWktLxVCCGGKeo4IAgs4+PtFraMYz8ISRi2F4rS6LkRm\nyn38eGy7diFzQTy1RcYVRRysHXhx0IsUVhUStSMKXxc71kyJwNnOmnErEjieUdzIqYUQTUXePQsh\nDFZVU8u01fvZdjqXpXf1YExPf1KKU1iwewFh3mFM7THV6LnLdu6k6Jtv8Jg0CbvOnRsxdTOqrYGf\nngZHb7hpntZprsm+X5Kxd7ama/+WWkcRQghxBU4t7OjS149jO9MpLajSOo7xgiLrVrbseguyjmqd\nxiiKlRV+8fHU5heQ/dJLRs/Tyb0T03tPZ2vqVtacWENACwfWTInAzsqSccsTOJ1V0oiphRBNRQot\nQgiD6Gr1PL7mIJtO5rDon925p3cgulodM7fOxNLCkiUDl2BlYdwqFH1FBRnRMdi0bo3nY482cvJm\ntHcZZByCkYvr9p2bqczzRaQcLyD05iCsbCy1jiOEEOIqwm5phaqHxHVmvKoF4Ob4utfOH58GI1sl\na82+Wzc8Joyn8MuvKNudYPQ8YzuPZXDAYF7e9zIn80/SysORNVMisLBQGLs8gXM5ZtzWW4gbhBRa\nhBD1qqnV89RnB1l3LIu427sxNiIIgDcT3+RI3hHi+sXh52T8OR45b76FLjUV3/lxWNjaNlbs5lWU\nBhsXQPvh0O2fWqe5Jvt/vYCtoxXBg/y1jiKEEKIeLp72dOrjw9FtaZQXV2sdx3gO7jBiAaTugQMf\nap3GaJ6PPYZ1UBAZMdHoKyuNmkNRFOL7x+Nm68ZzW5+jXFdOWy8n1kyOQK9XGbssgQt55nmejRA3\nCim0CCGuqlav8uwXh/jlcCbz/tGFh/u1BmBn2k4+OPIB93S8h5tb3Wz0/BVHjpK/ahVu996LY58+\njZRaA2ufB30NjH7JrA/AzUkpITkpl9BhgdjYmek5OUIIcYPpNao1NTV6Dm1I0TrKtQm5H1oPhPUx\nUGpcq2StWdjb4zc/Dt2Fi+S+/bbR87Swa8HigYtJLkpm6d66s2s6+DizenIElTW1jF2WQEq+Gbf2\nFuI6J4UWIcQV6fUqM79K4odD6cwc2YnJA9sCkFeRx5ztc2jn2o7nwp8zen5VpyMjKgorDw+8Z0xv\nrNjN7+RaOP4jDJ4J7m20TnNN9v+ajI2dJd2HmGlrbSGEuAG5+TjQoZc3hzenUlmm0zqO8RQF/vEK\nVJfDb3O1TmM0x8hIXO+6k7yVH1B57JjR80T4RTC5+2S+Pv01a5PXAtDFz4XVkyIoqdQxdvlu0gvN\nuOOUENcxKbQIIS5Lr1eZ8+1hvj6QytPDO/DokPZ1j6t65u2YR0l1CUsHL8Xeyt7o75G3ahVVx4/j\nEx2FpYtLY0VvXtVl8MsM8OoMfZ/QOs01yU8v4+zBHLoPDcDWwVrrOEIIIRqg16jW6KpqSdpo5qta\nvDrCgGfg8BdwdpPWaYzmM3Mmli1akDEvCrWmxuh5poVOo4dnD+bvnE9aaRoAwf6ufDwpgsIyHQ8s\nTyCr2LgtSkKIpiOFFiHE36iqSswPR/lsbwqPDW3HU8M6/PHcJ8c/YXvadmaEz6Bji45Gf4/q5GRy\n33ob5xEjcLnZ+K1Hmtu8BIpS4NbXwMpG6zTXZP9vyVjZWBIyLFDrKEIIIRrIw9+JNiGeJG1KpbrC\n+F/sTcLA6eDeFn6eDjrzLCJYurriO28elceOkf/hR0bPY21hzQuDXkBF5fmtz1Ojr/tvGxLoxqqJ\n4WQVVzJ22W5ySsy465QQ1yEptAgh/kJVVeJ/Os7Huy8wdVBbZozohHLpzJFjecd4Zf8rDAkcwn2d\n7jP+e+j1ZERFo9jY4DPPfJcGk3kEdr0NPR+EVn21TnNNinLKOb0ni+BB/tg7mXfBSAghblS9R7em\nqryGw1tStY5ybazt6rYQ5Z+F7a9oncZozreMwGnYMHLefJPqi8Z3hQpwDiAqMopDOYd499C7fzze\nq5U7H4wPJ62wgnHLE8gvM+PDkIW4zkihRQjxB1VVWbL2BCt3nGd8v9bMHtX5jyJLua6c57c+j7ud\nO/H94v943BiFX39N+d69eM98Dmtv78aK37z0evjpabB3g5vna53mmu1fewELSwtCh8tqFiGEMFfe\nrVwI6uZB4voUdFW1Wse5Nu2GQvd7YPurkHta6zRGURQF3+goFCsrMqJjUFXV6LlGtx3NmPZjWJa0\njL2Ze/94PKKtByseDic5r4xxyxMoLJdiixCmQAotQog/vLruFO9vOccDEUHE3Nb1L8WUxXsWc6H4\nAksGLsHNzs3o72FRVET20hdx6NMHt7vvbozY2jiwClL3woiFdS0pzVhJfiUnd2XSdUBLHF3NtL22\nEEIIoG5VS2WpjqPb0rSOcu1uWQTW9vDTM3ANRQotWfv44D1jOuW7d1P0zbfXNNfsPrNp5dKKWVtn\nUVBZ8Mfj/dt78p+HenMmu5SHVu6huNKMD0QW4johhRYhBABvbjjNGxvPcG/vAOLvCP5LkeWXc7/w\n3ZnvmNJjCuG+4df0fZw/+xy1uhq/+XHXtCpGU6XZsD62rgVliPFbqEzFwd8ugAI9RwRpHUUIIcQ1\n8mvnin8nNw6uu0iNzsxXtTh5w/BYSN4Ghz7TOo3R3O69F/vevchauhSLoiKj53GwdmDpoKUUVBUQ\nvTP6LytkBnf04t1xYRzPKObhlXsorTLzc3qEMHNSaBFC8P6Ws7y87hR39vRn8Z09sLD4XwEkpSSF\n+N3xhHiFMC1k2jV9n+J167A7eBDPxx/DpnXra0ytod/mgK4Cbn21rhWlGSsrquLYjgw69/XD2d1O\n6zhCCCEaQe/RbSgvqubEzgyto1y7sPEQ0Ad+nwvl+VqnMYpiYYHf/HjU8nKcP//imubq4tGFZ3o9\nw+aUzXx28q/Fp2FdfHjz/jCSUouY8MEeyqul2CKEVqTQIsQNbuX28yz+9QS39vBj6d09sPxTkUVX\nq2PW1lkoKLww6AWsLKyM/j61hYVkzp+PLjAAj/HjGyG5Rs5uhMNf1rWe9OxQ//0m7uC6i+j1KmG3\ntNI6ihBCiEbi39EN37b/x959x9d89n8cf33Pyd6LLEHE3luoWRRdqkNvq3ZpUbVaFK29Kdpba1aL\nqu6i1NaiIYhNECEhQyJ7J+d8f3/k/o3+OjjJOfk68Xk+HvfjcWu+13W9kUTO51zX9XHn9C+3MRQZ\ntY5TOjpd8RsbuWmwb4bWaUrMvlowPqPexOHMGTL27i3VXP3r9KddYDuWhC8hMiXyDx/rXt+PFf9q\nzOnbqQz97BS5BVa+q0kIKyWFFiEeY1/8fotZOy/TvZ4fy19tjI3+j98Slp1exvnk87zf5n0CXQJL\ntVbC3HkYUtPIeO01FFvbUs2lmcK84laTXiHQdrzWaUotN7OAS7/epWYLX9wrOGodRwghhJkoikLz\np6uSlZJP5IkEreOUnl99aD0KIr6A28e1TlNi3kOHUlg5iISZsyhKTX3wgL+hKAqzn5iNu7074w+P\nJ7Mg8w8ff7ZhAEt7NyIs+j6vf3GKPGs/QiaEFZJCixCPqW0nY5j+4yW61KnIyj5NsP1/RZY90XvY\nfGUz/ev0p1vVbqVaK/PAATJ27MBn5EiKgqy4q81vSyHlJjyztLj1pJU7dyCWokIjzXrIbhYhhChv\nKtfzokJlV87suY3RYOW7WgA6Tgb3ysUX4xZZZ2cdxdaWjIEDMWRkkDh7dqnm8nb0ZkmHJdzNusu0\no9P+1NGoV5NKLHypIb9dT+aNzafJL5JiixBlSQotQjyGvj19hynfX6BDzQp83K8pdjZ//FZwM/0m\n7x9/n0YVGjG+Wel2bhSlphL//gfY16mDz4jXSzWXppKuFbeYbNC7uOWklcvLLuT84TtUb1oRTz9n\nreMIIYQws//e1ZKelMuN0/e0jlN6ds7w9GJIugq/r9I6TYkVBQZS4c03yPh5Nxm/lO4IUVPfpoxr\nNo6DsQfZdGnTnz7eu3kQc3vV51BkEqO3RlBYHgpuQlgJKbQI8Zj56Vwck745R5sQbz4d0Ax7G/0f\nPp5TmMP4Q+Ox19uzpMMSbPWlO+aTOHcehrQ0AubPs94jQ6pa/A6anRN0m6t1GrO4cPgOhXkGmvWo\nqnUUIYQQFhLc0AevAGdO7b6NarTO9sh/UKs71HkejiyClGit05SY97BhONStS8LMmRSllO6C39fq\nvkbXKl358MyHnEo49aeP92tVhQ+eq8u+y4m8ve0sRVJsEaJMSKFFiMfI7gvxjPvqLM2rerHutRY4\n2P6xyKKqKh/8/gHRGdEs6rAIP2e/Uq2XuX8/GTt34vPGSBxq1y7VXJo69yXcPgpdZha3mrRyBXlF\nnDsQS9WGPvhUctE6jhBCCAtRdArNe1QlNT6bm2eTtI5jHlrKkAgAACAASURBVD0Wgs62+M401TqL\nR4qtLf7z52PIzCShlEeIFEVhVptZVHKtxKRfJ5Gcm/ynZwY9Ecy0Z+qw60I8E74+h6E8FN2EeMRJ\noUWIx8S+y4mM+TKCxkEebBjUAkc7/Z+e2Ra5jd3RuxnVeBSh/qGlWq8oNZX4D2ZiX7cOPq9b8ZGh\nnBTYOw2CWkHTgVqnMYuLR+6Sn1NE86erah1FCCGEhYU0q4iHrxOndt/60z0eVsktAJ6cBlEH4NJ3\nWqcpMYdaNakw6k0yd+8hY88vpZrLxc6FZR2XkVWQxcQjEyky/rmt87B21ZjUrRY/no3j3W/PY5Ri\nixAWJYUWIR4DhyLvMWrLGeoFuLFxcAtc7P/cpvl80nkWhS+ifaX2DGswrNRrJs6ZiyE9nYD58633\nyBDAvumQl17cWlJn/d8yCwsMnN0fQ+W6XvhWddM6jhBCCAvT6RSada9CcmwWty/e1zqOebQcDv6N\nYc+U4rbPVsp72DAc6tUjYdasUh8hqulZkxmtZ3A68TQrI1b+5TOjOlXn7S41+Ob0Hd774YIUW4Sw\nIOt/1SCE+EdHrycz4ovT1PB14fMhrXBz+HPRIzUvlQlHJuDr5Mu8tvPQKaX71pCxbx8Zu3YVHxmq\nVatUc2nq9nGI2FzcUtK3ntZpzOLyb3HkZhbSTHazCCHEY6NGS19cvR049XM52dWi08NzH0J2Ehws\n3dEbLSk2NvjPn4cxM5OEWaX/fTwX8hy9a/Zm48WNHIw5+JfPjO1cg1GdQvjyZCwf7LhUPj4fhHgE\nSaFFiHIs7OZ9hn0eTjUfZzYPbYW705+LLAajgcm/TeZ+7n2WdlyKu717qdYsSk0l4YOZONSti8/w\n4aWaS1NFBbDj7eJWkh3e1TqNWRgKjUTsvU1ADQ8CqntoHUcIIUQZ0et1NO1WhcToDO5cTdU6jnkE\nNIGWr0P4erhzWus0JeZQsyY+o0aRuWcPGXv2lHq+d1u+Sz3vekw7Oo2YjJg/fVxRFCY+VYvh7YL5\n/PfbzNl1RYotQliAFFqEKKdO3UphyGfhBHk6sXlYKzyd7f7yuU/Pf8rxuONMaTWFet6l37WROHsO\nhowM/K39yNDxlZAcCc8sKW4pWQ5cOhpHdnqB3M0ihBCPoTqt/XH2sOfkjujy88K603vg6gc7x4Lh\nz/eSWAvvYUNxqF+fhJmzKLpfuuNddno7lnZciqIojD88nryivD89oygKU5+uw6A2VVl/NJqFeyLL\nz+eEEI8IKbQIUQ5FxKQyaGM4fm4ObBnWCh8X+7987ujdo3xy7hOeD3mel2u8XOp1M/buJePnn6nw\n5hs41KpZ6vk0k3ITfl1c3EKyZjet05hFQW4Rp36OJrCWB5Vqe2odRwghRBnT2+po8UxVEm6mE33u\nz51prJKDW3EXooQLcOITrdOUmGJjQ8D8eRizssxyhCjQJZD57eYTmRrJ3BNz/3pNReH95+rSr1Vl\nPjkSxfL910u9rhDif0mhRYhy5uLddF7bcBJvFzu2Dg+lopvDXz4XlxXH5N8mU92zOtNCp6EoSqnW\nLUpNJWHmLBzq1sV7WOkv09WMqsKuicWtI3ss1DqN2UTsiyE3s5A2L1Yv9d+1EEII61SnjT+efk78\n/n0URoNR6zjmUed5qNENDs2DtFit05SYfY0a+IweTeYvv5Cxe3ep52tfqT0jGo7ghxs/8N31v+7O\npCgKs3vWp3fzSqw8cJ2PDkqxRQhzkUKLEOXI5bgM+q8/gZuDLVuGtcLP/a+LLAWGAiYcnoDBaGB5\nx+U42jiWeu3E2bPLx5GhS98Vt4x8clpxC8lyIDstn7P7Y6jRvCIVq0inISGEeFzp9Dpa9wohLTGH\ny8fitY5jHooCTy8G1Qi7rftONe+hQ3Bo0ICEWbNLfYQI4I1Gb9DavzVzw+Zy5f6Vv3xGp1OY/2JD\nejUJZMnea3x6JKrU6wohpNAiRLlxLTGT/utP4Gir58vhoVTydPrbZxeFL+Li/YvMfmI2VdyqlHrt\njF/2kvHzbiqMetO6jwzlphW3ivRvXNw6spw4uTMao0GlVc8QraMIIYTQWNWGPvhXd+fkzmgK8qz3\nXpM/8KwCHSdD5C64ukvrNCX2hyNEM2eV+t4UvU7PgvYL8HTwZPzh8aTnp//NcwqLX27Isw39mb/7\nKhuORpdqXSGEFFqEKBeikrLou/YENjqFrcNDqez990WWnTd38lXkVwysO5AuVbqUeu2ilBQSZs7E\noV496z4yBMUtIrOTiltG6vRapzGLlPhsrhyLo36HQNwrlH7nkhBCCOumKAptXqxObkYB5w5Y71Gb\nP2k9CirWg5/fgfwsrdOUmH316viMGUPm3r1kmuEIkZeDF0s6LCEhO4FpR6dhVP/6yJiNXsfyVxvT\nvZ4fs3Ze5ouw26VeW4jHmRRahLByt5Kz6bs2DFDZOjyUYJ+/75BzI/UGs36fRdOKTRnbbKxZ1k+Y\nPRtjZib+8+eh2NiYZU5N3Dld3CKy5evFLSPLid+/j8LWXi+dhoQQQvwPv2ruhDSpwJm9MeRkFGgd\nxzz0tvDscsi4A4fna52mVLyHDMahYcPiI0TJpb+4uHHFxkxsMZHDdw6z4eKGv33OVq9jZZ8mdKlT\nkek/XOSr8D+3hxZCPBwptAhhxWJTcui7NoyCIiNbhoVSvaLL3z6bXZjNuMPjcLJxYkmHJdjqSn+P\nSsaePWTu3oPPqFE41LTiI0OGouLWkK5+xa0iy4m462ncOp9M0+5VcHT56/beQgghHk+hL4RgLDQS\nvrMcHROp3AqaDYKw1RB/Tus0JfY/R4hyckiYOdMsrZf71u5Lj6o9WBWxipPxJ//2OTsbHR/3a0qH\nmhWY/N0Fvj19p9RrC/E4kkKLEFYqLi2XPmvDyC4wsHlYK2r5uf7ts6qqMuPYDGIyY1jcYTEVnCqU\nev2i+/eLuwzVr4/3sKGlnk9TR5cXt4bssai4VWQ5oKoqx7+7gbOHPQ2fDNI6jhBCiEeMh68TddsF\ncOloHKkJ2VrHMZ8uH4CTN/wwCoqsd7eOfUgIFd4aQ+a+/WTs+rnU8ymKwgdtPqCKWxUm/TqJezn3\n/n5tGz2fDmhGmxBvJn1zjp/OxZV6fSEeN1JoEcIKJaTn0WdtGOk5hXwxtCX1Atz/8fktV7aw9/Ze\nxjYdSwu/FubJMGs2xqwsAqz9yFD8eTiyAOq/BHWf1zqN2USdSSIxOoOWzwVja1c+7psRQghhXi2e\nCcbGVkfYjze1jmI+jp7w3ApIvAC/LtI6Tal4DR6MQ6OGJM6eTVFSUqnnc7J1YnnH5eQW5TLxyEQK\njYV/+6yDrZ51r7WgeVUvxn11lt0XykmXKiHKiBRahLAy9zLz6LsujOTMfDYNbUnDSh7/+HzEvQiW\nnlpKp6BODK432CwZMnbvJvOXX/AZPRr7GjXMMqcmivLh+5HF73w9vUTrNGZjMBgJ+yEKrwBnarf2\n1zqOEEKIR5STmx1NnqrMzYgkEm7+dUcaq1T7aWjcD35bVnwHm5VS9HoC5s/HmJtLvJmOEIV4hDCz\nzUwi7kXw4ekP//FZRzs9Gwa1oHGQB2O+jGDf5cRSry/E40IKLUJYkftZ+fRfd4L4tDw+G9KSppU9\n//n53PtMPDwRfxd/5rSdg6Iopc5QdP8+CbNm49CgAd5Dh5R6Pk0dXgD3LsHzq8DJS+s0ZnP5tzjS\nk3Jp3SsEna70f+dCCCHKr0adg3Bys+P4tzfM8kL+kdF9Prj6ww8joTBX6zQlZl+tGhXGvkXW/gNk\n7DRP6+oewT3oU7sPn1/+nH239/3jsy72Nmwc3IJ6ge6M2nKGQ5F/f+RICPG/pNAihJVIzS6g37oT\n3L6fw/pBzWlR9Z8LAwajgXd/e5f0gnSWdVyGm13p7x5RVZWEmbPKx5Gh2JNw7ENoMgBqdtM6jdkU\n5BURviuawJoeVKnvrXUcIYQQjzg7BxtaPBtMfFQ60edK3+HmkeHgDj0/guRrcHCO1mlKxWvQIBwb\nNSJxzhyzHCECmNR8Eg19GjL92HRupd/6x2fdHGz5fHBLavi6MOKL0xy9Xo4+T4SwECm0CGEF0nML\nGbDhBDeTs1n7WnPahPg8cMzHZz/mRPwJ3mv1HrW9apslR+bu3WTu3YvPmDHYV69uljk1UZBTfGTI\nrRJ0m6d1GrOK2BtDbmYhrV+sbpYdTEIIIcq/uk/44+HrRNgPURgNRq3jmE9IJ2gxDH7/GG4d1TpN\niSl6Pf7z5xUfIfrAPEeIbPW2LO24FFudLeMOjyOnMOcfn3d3smXz0FZU83Fm2OfhhN28X+oMQpRn\nUmgR4hGXmVfIwA0niUzI5NP+zWhf88Edg47EHmHthbW8WONFetXoZZYcRcnJxUeGGjbEe4h57nrR\nzIGZkBIFL3xcbroMAWSn53N2fwzVm1fEt2r5+X0JIYSwLJ1eR+teIaQm5HDleDm79LTrLPCsCj+8\nCfmZWqcpseIjRGPJOnCAjJ07zTKnn7MfC9svJCotijlhcx5YwPF0tmPzsFYEeTox5LNwTt1KMUsO\nIcojKbQI8QjLzi9i8MZwLt5N5+O+TelUu+IDx8RmxjLl6BRqe9VmSsspZsnxP0eGsrMJmDfXuo8M\nRf8KJz6BViMhuL3Waczq5M5ojAaV0J7VtI4ihBDCygQ38sE/xJ2TO6IpzDdoHcd87Jyh1yeQFgN7\np2udplS8Bg3EsXFjEubMpfCeee5KaRPQhjcav8GOmzvYHrn9gc/7uNizZXgr/NwcGLQxnIiYVLPk\nEKK8kUKLEI+o3AIDQzeFExGbxso+TXiqnt8Dx2QWZDLmwBgUFJZ1WIaDjYNZsmT8/DOZ+/bh85aV\nHxnKy4AfRoFXCHR+X+s0ZpUSn82VY/HUbx+IewUnreMIIYSwMoqi0PrF6uRkFHB2f4zWccyrcii0\nGQOnN8KN/VqnKTFFr8d/3jzUvDwSzHSECGBEwxG0r9SeBScXcDL+5AOfr+jqwNbhoXi72PHahpNc\nuFOOOlYJYSZSaBHiEZRXaGD456c4GZ3Cst6NeLrBg1v0FhmLmPTrJG5n3GZ5x+UEuQWZJUtRcjKJ\ns+cUHxkabOVHhn6ZChl3it/ZsitfxYiwH6KwsdPR/OmqWkcRQghhpfxD3KnWpAIRe2PIySjQOo55\ndXoPKtSGH8dArvXuwrCvFlx8hOjgQTJ27DDLnDpFx8J2C6niVoVxh8dxO+P2A8f4uRcXW9wdbRmw\n4QSX4zLMkkWI8kIKLUI8YvKLDIzcfJpjUckserkRPRsHPtS4paeWcuzuMaa0mkJL/5ZmyVJ8ZGgm\nxpwc6+8ydO0XiPgCnhgLQeb583lUxN1II/pcMk27VcHR1U7rOEIIIaxYaM9qFBUaCd8VrXUU87J1\nKH6jJSsRdr+rdZpS8Rr4Go5NmpAwdx6FieY5QuRi58KqzqvQKTpGHxhNRsGDCyeBHo58OTwUR1s9\n/def4Fqi9d6BI4S5SaFFiEdIQZGRUVsiOByZxLxeDXi5WaWHGvfNtW/YfGUz/ev0p3et3mbLk/79\nD2Tu20+FsW9hHxJitnnLXE4K/DQGKtaDjua5t+ZRoaoqx7+9gbO7HY06m2cXkxBCiMeXp58z9doG\ncPm3ONIS/7kTjdUJaALtJ8H5r+DyT1qnKbHiI0RzUfPziZ86FdVonk5RQa5BLO+4nDtZd5h0ZBJF\nxqIHj/FyYuvwUGx0Cn3XniAqKcssWYSwdlJoEeIRUWQwMnZbBPuvJDK7Zz36tKz8UOPCE8KZGzaX\nJwKeYELzCWbLUxATQ+KcOTi1bInXoEFmm1cTP0+EnPvF72TZ2GudxqxuRiSRGJ1By+erYWun1zqO\nEEKIcqDFs8HobHWE/RCldRTzaz8R/BvBznGQlaR1mhKzDw7Gd/K7ZB87RurmzWabt7lfc2aEzuB4\n3HEWhy9+qDHBPs5sHR4KqPRdG8at5Gyz5RHCWkmhRYhHgMGoMm77OXZfTGD6s3UZ0LrqQ42LyYhh\n3OFxVHarzOIOi7HRmedoj1pYyN1Jk8DGhoCFC1D0VvwC/uJ3cPFb6DAZ/BtqncasDAYjv/8QhVeA\nM7VDH3xZshBCCPEwnNzsaNK1MlERSSTcLGcXneptodenkJ8Bu8aBmS6U1YLHq6/i0qkT95YsJS/y\nmtnm7VWjFwPrDmTr1a0P1YkIoHpFF7YMC6WgyEjftWHEppSz3VBCmEgKLUJozGhUmfTNOXaci2Ny\nj9oMbRv8UOMyCzIZfXA0AB89+RGudq5my5S8+hPyzp3Hf+YH2Po/+CLeR1ZmIuyaAAFNoe04rdOY\n3eXf4ki/l0vrF0LQ6eXbuRBCCPNp3CUIRzc7jn93w2zdbR4ZFevAk9Pgyg44/3CFhEeRoij4z5mN\nzs2NuIkTMebnm23ucc3G0b5Se+admMeJ+BMPNaaWnyubh7Uiu8BAn7Vh3E3LNVseIayN/GQuhIaM\nRpWp31/guzN3mdC1JiM7PNw9KEXGIiYdmURsRqxZOwwB5JyJIPmTT3Dv2RO3Hj3MNm+ZU1XY+TYU\n5hS/c6W34ot8/0JBXhHhu6IJqOFBlQbeWscRQghRztg52NDy2WDib6Rz63yy1nHMr/VoCGoFP0+C\n9LtapykxG29vAubNJf/6dZKWLTPbvHqdnoXtFhLsHsz4w+O5lX7rocbVC3Bn89BWpOcW0ndtGAnp\neWbLJIQ1kUKLEBpRVZUZP11kW3gsY56szpjONR567JJTSzgWd4xpodNo4dfCbJkMWVnETZqEbUAA\nvtOnmW1eTZzdCpE/Q+cZUKGm1mnMLmJfDLmZhbR5sTqKomgdRwghRDlU5wl/PHyd+P37KIwG81y4\n+sjQ6eGF1WAsLL4w34p37bi0b49nv36kbPqcrKPHzDevnQurnlyFXtEz5uAY0vMf7hhZg0rubBrS\nkuTMfPquC+NephRbxONHCi1CaEBVVWbtvMzmsBhGdKjG+K4PXwjYHrmdLVe2MKDuAF6q+ZJZcyXO\nnkNhfDwBixahd3Ex69xlKi0W9kyGKk9Aqze0TmN22en5nN0fS/VmFfENdtM6jhBCiHJKr9fR+oUQ\nUhNyuHI8Xus45ucdAl1nQdQBOP2Z1mlKpeKkidhVDyFuymSKUlPNNm8l10p82OlD7mTdYeKRiRQa\nCx9qXNPKnnw2pCXxaXn0X3eC+1nmO9YkhDWQQosQZUxVVRbsvsrGY7cY8kQwk7vXfugdCSfjTzL/\nxHzaBrZlQjPzdRgCyPj5Z9J//BGfkSNxatrErHOXKaMRfhoNRgP0/Bh05e/bXPjOaIyFRlr1rKZ1\nFCGEEOVccGMf/Kq5c3JHNIX5Bq3jmF/zoVCtI/zyHqREa52mxHQODgQuWYIxLZ34adPNeq9OU9+m\nvN/6fcLiw1h0ctFDj2tR1YsNg1oQk5JDv3UnSM0uMFsmIR515e8ViBCPuGX7rvHprzcZEFqF6c/W\neegiy+2M24w7PI4qblVY1H4Rep35OgEVxscT/8FMHBs1wudNK98Bcmo93DwM3eaC18NdLGxNUhOy\nuXwsnnodAvGo6KR1HCGEEOWcoii0eak6ORkFnN0fo3Uc89Pp4PmPio8S/Tiq+A0bK+VQuzYVxo8n\n68AB0r7+2qxzv1D9BQbXG8y2yG18efXLhx7XOsSbta8152ZyNgM2nCA99+F2xAhh7aTQIkQZWnng\nOqsO3uBfLYKY+Xy9hy6yZBRkMPrAaHSKjlWdV5m1w5BqMBD3zrtQVETA4kUoNlZ8aez9KNg3A0I6\nQ7NBWqexiN+/j8LGTkeLp6tqHUUIIcRjwj/EnWqNKxCxN4acjHK4K8EjCLovgNvH4MRqrdOUitfA\n13Bu05rE+QvIjzbvDp2xTcfSsVJHFp5cyPG44w89rl2NCnzavxmRCZkM3HCSzDwptojyTwotQpSR\n1YejWLbvGi82DWRerwbodA9XZPnvDkN3su4UdxhyNV+HIYD7GzaQEx6O77Rp2FWubNa5y5TRAD+8\nAXpb6PkRlMMLYuNvpBF9LpmmT1XB0dVO6zhCCCEeI6EvVKOo0MipXdZ7vOYfNe4LNXvA/pmQFKl1\nmhJTdDr8589HZ2dH3KR3UAvNV9TQ6/QsaL+Aah7VmHhkItHpD/+50Kl2RT7u25SLd9MZvDGc7Pwi\ns+US4lEkhRYhysC6326ycM9Vnm8UwOKXGz10kQVgcfhijscdZ3rodJr7NTdrrtyLl0hauQrXbt1w\n7/WCWecuc79/BLEnoMdicAvQOo3ZqarK8e9u4ORuR6PO5i22CSGEEA/i6edM3bYBXPotjrTEHK3j\nmJ+iwHMrwM4Zvh8JBustBNj6+uI3exZ5Fy+S9NHHZp3b2daZVU+uwlZna1InIoCn6vmxsk8TImLT\nGLopnNyCcnjnjxD/IYUWISzs899vMWfXFXrU92NZ70boTSiyfHX1K7Ze3crAugN5scaLZs1lzM0l\nbtIkbLy88J/5gXW3CL53BQ7OgTrPQcPeWqexiJtnk0i4mUGr56pha2+++3mEEEKIh9XimarobHWE\n/RildRTLcPWFZ5dB3Bk4tlzrNKXi9tRTuL/8EvfXrCEnPNyscwe6BPJhpw+Jy4pjwuEJD92JCODp\nBv4s692Ik9EpDP/8FHmFUmwR5ZMUWoSwoC9PxjDjx0t0qePLyj5NsNE//JdcWHwY80/Op32l9oxr\nNs7s2RIXLqTg1i0CFi5A7+Fh9vnLjKEQvh8B9m7wzPJyeWTIYDAS9sNNPP2dqd3aT+s4QgghHlPO\n7vY06RJE1JkkEqIffieDVanXC+q/BIcXQvx5rdOUit+UKdhWDuLuu+9iyMgw69xNKjbhgzYfcCLh\nBAtOLDCpy1HPxoEserkRx6KSGbn5NPlFUmwR5Y8UWoSwkG9O32Hq9xfoWKsCH/drgq0JRZZb6beY\ncHgCwe7BLGy30KwdhgAyDx4kbdtXeA0ZjHNoqFnnLnO/LoH4c/DscnCpoHUai7hytHibduteIehM\n+DwSQgghzK1x18o4utpy/NsbZm0h/Eh5egk4eRUfISrK1zpNiemcnQlcvJiixHskzJxl9vmfD3me\nIfWHsP3adpM6EQG83KwS83o14HBkEqO2RFBQZL3dnoT4K/ITuxAW8OPZu0z65hxtq/vwSf9m2Ns8\nfKEkPT+dMQfHoFf0rHpyFS52LmbNVpSURPx707CvU4cKY8eade4yFxcBvy6Ghq9C3ee1TmMRBXlF\nnNwZTUAND6o28NY6jhBCiMecnYMNLZ8NJv5GOrcu3Nc6jmU4ecHzq+DeJTi8QOs0peLYsCEVRo8i\nY9cu0nfsMPv8Y5uOpWNQRxaGL+T43YfvRATQp2VlZvesx/4riYzdFkGRQYotovyQQosQZrbrfDzj\nt5+jVbAXawY0x8H24YsshcZCJh6ZWNxhqNNyKrlWMms2VVWJm/oexpwcApcsRmdnxZ1rCvOK32ly\n8YUeC7VOYzERe2PIzSyk9Ysh1n2PjhBCiHKjTtsAPHyd+P27GxjK606Emt2gyQA49iHEmveOk7Lm\n/frrODZrRsLMWRTcuWvWuXWKjgXtFlDdozoTj0zkZvpNk8YPaF2V6c/WZffFBMZvP4fBWE53SYnH\njhRahDCjvZcSGLstgiZBHqwf2AJHO9OO/Cw6uYiw+DDeb/0+zXybmT1f6uYtZP/2GxXffQf7kBCz\nz1+m9s2ApKvQcxU4emqdxiJS4rM5s/c2NVr44hfsrnUcIYQQAgC9XscTL1UnNSGHiH0xWsexnG7z\nwC0QvhsOedZ7J42i1xOwsPhNqbh33kEtMm9Hpf/pRKS3ZfSB0aTlpZk0fmjbYCb3qM1P5+J455vz\nGKXYIsoBKbQIYSaHrt5j1NYz1A90Z+PgFjjb25g0/surX7ItchuD6g3ihermb7Wcd+0a9xYvxqVD\nBzz79DH7/GXq0vdw8lMIfROqd9E6jUWoRpXDW65ia6en7Ss1tI4jhBBC/EHVhj6ENK3AqV23yme7\nZwAHN3hpHaTFwI+jwIrvpLGrFIjf+zPIPXOG+2vXmn3+AJcAVnRaQUJ2AuOPjKfQ8PCdiABGdghh\nfNeafHum+I5DKbYIayeFFiHM4NdrSYzYfJpafq5sGtISVwdbk8Yfv3uchScX0qFSB95u+rbZ8xnz\n84mb9A46V1f858217iMoydfhx9FQqSV0Nf/Fbo+Ky8fiiL+RzhMvV8fJzYqPeAkhhCi32r1aE72t\njsNbrpbfi3Erh0LXmXBlB4St1jpNqbg/9xxuzzxD0kcfk3ve/B2VGldszMw2MwlPCGfuibkmf068\n1bkGY56szrbwWN7/6VL5/ZwSjwUptAhRSsejkhn++SlCKriweWgr3B1NK7KcTzrP24ffJsQjhIXt\nzd9hCCBp2XLyIyMJmDcXG28rvlC1IAe2vwZ6O3hlI+hN+7O2Ftnp+Rz/LorAWh7Ubu2vdRwhhBDi\nLzm729O6Vwh3r6Vx9fd4reNYTuvRUPtZ2DcdYk5onaZU/N6fgY1vRe5OmoQxO9vs8z8X8hzDGwzn\n2+vf8tHZj0weP75rTUZ0qMYXYbeZvfOKFFuE1ZJCixClcDI6haGfnaKKtxObh7bEw8m0nQc3Um/w\n5oE38Xbw5pMun+Bs62z2jFnHjpGyaROeffvi0qGD2ecvUz9PhHtX4KW14G7ei4IfJb99dQ1DoZGO\nfWtb9+4jIYQQ5V69tgH4V3fn2Dc3yMko0DqOZSgK9Py4+GePbwZDtvV2W9K7uRG4cCGFMbEkzJ9v\nkTXGNBnDSzVeYs35NXxx+QuTxiqKwuTutRn8RFU2HItmwZ5yvFtKlGtSaBGihM7EpDJ440n8PRzY\nPKwV3i72Jo2/m3WXEftGYKezY81Ta6jgVMHsGYtSU4mfPAW7kBAqvjPJ7POXqTNfwNkt0H5Sub2X\nBSD6XBJRZ5Jo/kxVPHydtI4jhBBC/CNFp9CxX20K8w0c/fq61nEsx9EDXtkE2cnFl+MarbfbklOL\nFngPH076N9+SsXev2edXFIXpodPpWqUri8IX8VPUHFoT1gAAIABJREFUTyaPn/FsXfqHVubTIzdZ\nvu+a2TMKYWlSaBGiBM7fSWPghpNUcLXny+GhVHR1MGl8cm4yr+99nVxDLp90/YQg1yCzZ1RVlYQZ\nMyhKSytu5exgWsZHSsKF4t0swR2g42St01hMQV4Rv267hleAM026VtY6jhBCCPFQvPydada9CtfD\nE7l90Xp3ezxQQGPosRCiDsBvS7ROUyoVRo/CoX59EqbPoDAx0ezz63V6FrRbQKh/KDOOzeBQzCGT\nxiuKwqzn6/OvFkGsPHiDVQfKcRFPlEtSaBHCRJfi0hmw/iTujrZsGR6Kr5tpBYzMgkze2P8GSblJ\n/Lvzv6npWdMiOdO++YbMffup+PbbONSpY5E1ykReevG9LI6e8NJ6sMAdNo+KsB9vkpWWT6f+tdHb\nyLdnIYQQ1qNZ96p4+jlxZGskhfkGreNYTrNB0PBVODQPokwrHjxKFDs7AhYvwlhQQNzkyagW2KFj\np7djRacV1PWuy8QjEwlPCDdpvE6nMK9XA15sGsjSfdf45EiU2TMKYSnyk7wQJohMyKT/uhM42+n5\ncngogR6OJo3PLcpl9IHR3Ei7wfKOy2lcsbFFcuZHR5M4bz5OoaF4DR5kkTXKhKoWdxhKvQ0vbwQX\n8x+velQkRKdz4fAdGnSohF81d63jCCGEECbR2+ro2K82mSl5nNxxU+s4lqMo8OxyqFALvh0GGXFa\nJyox++BgfKdMJuf3MFI2fW6RNZxsnfh3538T5BrEmINjuHT/kknjdTqFxS834vlGASzYfZX1R6Mt\nklMIc5NCixAP6ca9LPqtC8PORsfW4aEEeZl2f0ahsZCJRyYScS+C+W3n80TgExbJqRYWEvfOu8Xv\nVCyYj6Kz4i/zE5/AlZ+gy/tQpbXWaSzGYDByePNVnN3tCe1ZTes4QgghRIkE1PCgbrsAzh2I5d7t\nDK3jWI6dM/T+HApz4ZshYCjUOlGJebzyCi6dO5O0bBl5V65YZg0HDz7t+inudu68se8NbqabVojT\n6xSW9W5Ej/p+zN55mS9+v2WRnEKYkxW/AhOi7EQnZ9N3bRigsHV4KFV9TOsOZFSNTDs6jV/v/Mq0\n0Gl0D+5umaDAvWXLybtwAf+ZM7H187PYOhYXGw57p0Gtp6HNW1qnsaiz+2K4fzebDn1qYudoo3Uc\nIYQQosTa9ArB0dWOQ5uvYjRY74WxD1ShFjy3AmJ+hwOztE5TYoqi4D9nNnoPD+6OG48hy/wtnwF8\nnX1Z89QaFEVhxL4RxGeZ1g7cRq9jxb+a0KWOL9N/vMS2kzEWySmEuUihRYgHiE3Joe/aMIqMKluH\ntyKkgotJ41VVZcHJBfwc/TNjm46ld63eFkoKGXv3krJxI559++LWvZvF1rG4nBT4ehC4BcIL/y7e\npltOpd3LIXzXLUKaVCC4Ufk9GiWEEOLxYO9kS7tXa5Icm8W5g3e0jmNZDV+B5kPh+Eq4ukvrNCVm\n4+lJwNIlFMTGEj9tmsXaKVdxq8KnXT8lqyCL1/e9Tkpeiknj7Wx0fNyvCR1rVWDK9xf45nQ5//wS\nVk0KLUL8g7tpufxrTRi5hQY2D21FTV9Xk+dYfW41X179koF1BzK0/lALpCxWcOsW8VPfw6FhQypO\nftdi61ic0QjfvQ7Z96D3puJLcMspVVU5vCUSvV6h3auWuRRZCCGEKGshTStQtaEPJ3fcJCM5V+s4\nltV9Pvg3hu/fgBTrvT/EuWVLKo57m8w9e0j9YrPF1qntVZuPOn9EfHY8b+x/g6yCLJPG29vo+aR/\nM54I8eGdb87x49m7FkoqROlIoUWIv5GQnkefNWFk5BWyeWgr6ga4mTzHlitbWH1uNS9Uf4EJzSeg\nWGhnhjE3lztj30bR66m0fBk6OzuLrFMmji6FG/ug+wIIaKJ1GouKDEvgbmQqrV+sjrOHvdZxhBBC\nCLNQFIX2/6qJoigc2RppsR0SjwQb++I3hhTg64FQmKd1ohLzGjoUlyefJHHRInIiIiy2TjPfZizr\nuIxrKdcYe2gs+YZ8k8Y72OpZ+1pzWgZ7MX77OX6+YNoxJCHKghRahPgL9zLy6Ls2jJTsAj4f0pL6\ngaZ3gdkRtYMFJxfwZNCTvN/6fYsVWVRVJWHWbPKvXSNgyWJsAwMtsk6ZuHmkuF1ig1eg+RCt01hU\nTkYBR7+5jn+IO/XaBmgdRwghhDArVy8HQl+oRszlFK6HJ2odx7I8q8ILn0D8OfhlitZpSkxRFAIW\nzMfW35+748ZTlGLa0R5TtK/UntltZ3My4SSTjkyiyFhk0nhHOz3rB7agSZAHb30Zwd5LCRZKKkTJ\nSKFFiP8nOSuffutOkJCRx2eDW9CksulHV47EHmH6sem08mvFog6LsNFZ7oLT9G+/Jf377/F54w1c\n2rWz2DoWlxEP3w4F7xrw7Ifl+l4WgGPfXKcwz0DHfrVRdOX79yqEEOLxVL9DJSpWdePo19fJy7Le\nzjwPpfbT8MRYOLUBzm/XOk2J6d3cqLTiQwwpKcRNnIRqMFhsrWerPcuUllM4FHuID45/gFE17fJk\nZ3sbNg5uQf1Ad0ZtPcOhq/cslFQI00mhRYj/IzW7gP7rThCbmsOGQS1oXtXL5DlOJZxiwpEJ1Paq\nzYonV2Cvt9yRkLzLl0mYNRvnNm3wGfWmxdaxOENRcZGlILu4XaK9aRcOW5uYS/e5djKRpt2r4BVg\nWgcrIYQQwlrodAqd+tcmP7uIY99e1zqO5T05Ayq3gR1j4d5VrdOUmEPduvhOn0b28eMkf/xvi67V\nt05f3mz0Jj9G/ciSU0tMPmbm6mDLpiEtqeXnyojNp/ntepKFkgphGim0CPEf6TmF9F9/gpvJ2ax7\nrQWh1bxNnuPK/SuMOTiGAJcAVndZjbOt5V5EGzIyuDP2bfSengQsWYyi11tsLYs7OBtuHytuk1ix\nttZpLKow38DhrZF4+DrRvHtVreMIIYQQFuVTyYXGT1Xm6u8J3LlquaMojwS9Dby8AeycYftrkG/a\nRa+PEo+XX8a9Vy+SV68m67ffLLrWyEYj6VenH19c/oK1F9aaPN7d0ZbNQ1tRzceZYZtO8XvUfQuk\nFMI0UmgRAsjIK+S1DSe4npjFmgHNaFvDx+Q5bqXfYuT+kbjaubKm6xo8HSzXLUdVVeKmTKUwPp7A\nD5dj42X6zptHRuRuOPYhNBsMDS3X+vpRcXJnNJn38+jUvxZ6W/kWLIQQovxr8XRV3Co4cnhLJEUF\nljuK8khw84eX1kHyNdg5Dqz0ImBFUfCbMR37mjWJmziJwrg4i671Tot3eLbas6yKWMVXV78yeQ4P\nJzu2DGtFZS8nhm4KJ/xWOS/qiUee/JQvHntZ+UUM3hjOpbgM/t2vKR1rVTR5joTsBF7f9zoAa7qu\nwc/Zz9wx/yBl/XqyDhzA951JODWx4s48qbfg+xHg36i4y1A5lxSTybn9MdRtG0BAjfLbtloIIYT4\nv2zs9HTsV4v0pFxO/XxL6ziWV60jdJoKF7bD6Y1apykxnaMjlVZ8iFpUxJ23x2EsKLDcWoqOWU/M\nomOljsw9MZfd0btNnsPbxZ4tw1vh5+7A4I3hnIlJtUBSIR6OFFrEYy2noIghn4VzNjaNVX2a0KWu\nr8lzpOalMmLfCDIKMljdZTVV3auaP+j/kX3yJPeWf4hr9+54Dhhg0bUsqigfvh4EKvDKJrB10DqR\nRRkNRg5tvoqDqx2te4VoHUcIIYQoU0G1vagd6kfE3hiS71jvkZqH1m4ihHSG3e9CnOVaJVuaXdWq\n+M+fR97589xbuMiia9nqbFncYTFNfZsy9bepHL171OQ5Kro6sHVYKN4udgzccJILd9ItkFSIB5NC\ni3hs5RUaGP75KU7dSmH5q43p0cDf5DmyC7N5c/+b3M26y6onV1HXu64Fkv6vwnv3uDthAnZBQfjP\nmW2xltFl4pepxT949FoNXsFap7G484fukBSTSftXa+LgbKt1HCGEEKLMPfFyDeycbDi85SpGo3Ue\nqXloOh28uBacK8D2gZBrvbsr3J56Cq9Bg0jdsoX0XbssupaDjQOrnlxFDc8ajDs0jrP3zpo8h5+7\nA1uHh+LuaEv/9Se4HJdhgaRC/DMptIjHUl6hgde/OM3xqPsseaURzzcKMHmOAkMBYw+N5UrKFZZ0\nWEILvxYWSPq/1KIi4iZMxJiZReDKFehdrLgzz4VvIHwdtBkDtZ/ROo3FZSTncuKnm1Rt4E1I0wpa\nxxFCCCE04eBiS9tXapAYncHFI3e1jmN5zt7wymeQcRd+GGW197UAVJwwHsemTYmfPoP8qCiLruVq\n58rqLqvxdfblzQNvEpkSafIcgR6OfDk8FGc7Pf3XnyAyIdMCSYX4exYttCiK0l1RlEhFUW4oijL5\nLz4+XlGUy4qinFcU5YCiKFUsmUcIgIIiI6O2nOHXa0kseLEBLzatZPochgImHpnIifgTzH5iNh2D\nOpo/6P+TtGIFOeHh+M/8AIeaNS2+nqU4ZcfCT29B5dbQ+X2t41icqqoc+TISRVFo36eWde9CEkII\nIUqpZktfKtf1IuyHKDJT8rSOY3lBLaHrbIjcBcdXaZ2mxBRbWwKXL0Pn6Midt8ZizM626Hrejt6s\n6boGRxtHRu4fyc20mybPEeTlxNbhodjqFfqtC+PGvcfgyJp4ZFis0KIoih74GOgB1AX6KIry/89V\nRADNVVVtCHwDWPbgn3jsFRqMjPnyDAeu3mPOC/V5tUVlk+fIKcxhzMExHIo9xNRWU3ku5DkLJP2j\nzIMHub92HR6vvop7z54WX89iCrKpd2kh2DoWtz/Ul/8jNDdO3SPmUgqtelbD1at830MjhBBCPIii\nKHToWwvVqPLrtmuoVrzL46GFvgF1nof9H+CedlnrNCVm6+tL4JLFFERHEz/jfYv/3QW4BLC261pU\nVWXQnkFcvm/6n11VH2e2DAsFFPquDSM62bIFIiH+myV3tLQEbqiqelNV1QJgG/CHV4iqqh5SVTXn\nP78MA0zfWiDEQyoyGBn31Vl+uZTI+8/VpX+o6RuoMgsyGbl/JGHxYcxqM4s+tftYIOkfFcTGEvfu\nZBzq1sV36hSLr2cxqgo/vYVTzp3itoduph/XsjZ52YX8tv0aFau40qCjfHsTQgghANx8HGn5XDVu\nnU/mZkSS1nEsT1Gg50fgWYW6lxdBhuVaJVuac+vWVHhrDBm7dpH65ZcWX6+aRzU29diEg40DQ38Z\nSsQ90y8Wrl7Rha3DW1FkVOm7NozYlJwHDxKilBRLVSIVRXkZ6K6q6rD//HoA0EpV1dF/8/xHQIKq\nqnP+4mOvA68D+Pr6Ntu2bZtFMpeFrKwsXKz5bg0rZVRV1l7I5/c4A71r2fJ0sJ3Jc2QaMll9bzVx\nBXEM9BlIE+cyaKtcWIjXosXo79/n/tQpGH18LL+mhQTf3EyVmK+5EtibxBr9tI5TJu6eMJJ2C0Ke\nUnDwlCNDopj8OyAed/I1IABUo8rNfSpFuVD9aQW9Xfn/d9I56xZNzrxLnqM/EU3mYbBx0jpSyRiN\neKxejd3lK6RMnEhRcFWLL5lalMpHiR+RZkhjeIXh1HasbfIcMRkGFobn4aBXmNrKAW9Hua5UC9b+\nb0CnTp1Oq6ra/EHP2ZRFmAdRFKU/0Bzo8FcfV1V1DbAGoHnz5mrHjh3LLpyZHT58GGvOb42MRpXJ\n353n97g7TOpWi1Gdqps8R2J2Iq/ve517hnus6ryKdpXaWSDpn8VPn0FabCyVVv+bep06lcmaFnH6\nM4j5GpoOJNG112PxNXAnMpVL0RE07VZF2jmLP5B/B8TjTr4GxH+rF5LBNwtOoU8OoGPfWlrHKRPn\nClJodGEO7eLXQt/tVnuM2tC0KdEvvoTvF58T/O232Hh6WnzNdrntGLlvJGuS17C4/WI6V+ls8hxN\nmqbTd10YKy8qfPV6KH7ucqy7rD0u/wZYsox3Fwj6P7+u9J//9geKonQB3gOeV1U134J5xGNIVVWm\n/3iR7afu8FbnGiUqssRmxjJwz0AScxJZ3WV1mRVZ0r7/gbSvv8b79ddxteYiy/X9sHM8VO8Czywr\n3j5bzhUVGDi85SpuFRxp8UxVreMIIYQQj6SKVdxo2DmIS7/eJe5GmtZxykSqV1N47kOIOgg7x1lt\nJyK9hweBK1ZgSEom7t13UY1Gi6/p4+jD+m7rqeNdhwlHJrAjaofJczSo5M7nQ1pyP6uAvmvDuJf5\nGFzILDRhyUJLOFBDUZRgRVHsgH8BP/3fBxRFaQJ8SnGR5Z4Fs4jHkKqqzNxxmS0nYnijYwjjutQw\neY6otCgG7R5EVmEW655aZ/EWzv8tLzKShJkzcWrVigpvjSmTNS0i/hx8PRB86xW3N9Q/EpvoLO7U\n7luk38ulY99a2NjptY4jhBBCPLJaPhuMq5cDhzdfxVBo+Rfrj4Smr0H7SRDxBfy6ROs0JebYoD6+\n700l+9ffuP/pp2Wypru9O2u7rqW5b3OmHp3KtqumXynRpLInGwe3ICEjj35rT3A/S97rF+ZnsUKL\nqqpFwGjgF+AKsF1V1UuKosxSFOX5/zy2GHABvlYU5ayiKD/9zXRCmERVVeb9fIXPjt9iaNtg3ulm\nelvdS/cvMWjPIIwY2dhtI/V96lso7R8ZMjO5+9ZY9K6uBC5dgmJjpcWJtFjY0hscPIq3xtq7ap2o\nTNy9lsqZPbepHepHUB0vreMIIYQQjzQ7Bxs69K1FakIOx769oXWcstPpPWj4Lzg0B859pXWaEvN4\n9VXcnnuOpJWryD5+vEzWdLJ14uMuH9OxUkfmnpjLugvrTJ6jRVUv1g9sQWxqDv3WnSA1u8ACScXj\nzKI3AKmq+rOqqjVVVQ1RVXXuf/7bDFVVf/rP/++iqqqvqqqN//O/5/95RiEeTFVVluyNZO1v0bzW\nugrTnqljcpHldOJphv0yDCcbJzZ130QNT9N3w5SEqqrET32Pgjt3CFy+DBtrvfw2Nw22vAKFOdDv\na3Dz1zpRmchOz2fvuku4V3Si3b9qah1HCCGEsApV6nvTqEsQFw7f4fqpRK3jlA1FgedXQdV28OMo\nuHlE60QloigK/jM/wL56CHcnTKQwIaFM1rXX27Os0zKeDn6aFWdWsOLMCpPbTbcO8Wbday24mZxN\n//UnSM8ptFBa8TiSq5ZFubPywA0+PhRFn5aV+eC5eiYXWY7dPcbIfSPxcfRhU49NVHarbKGkf5ay\naROZ+/ZRccIEnJo/8DLrR1NRAWwfAPdvwKubwbeu1onKhNFgZN+GSxTkFtH99frYOVjpTiQhhBBC\nA617heBXzZ1DX1wlNSFb6zhlw8au+Gcl7xD4agDcu6J1ohLROTkRuGIlan4+d98eh1pYNgULW50t\n89rO4+WaL7PuwjrmnZiHUTXt+FnbGj58OqAZ1xOzeG3jSTLzpNgizEMKLaJc+ffhGyzff42Xm1Vi\n7gv10elMK7Lsv72f0QdHU9W9Kp91/ww/Zz8LJf2znDNnuLdkKa5du+A1eFCZrWtWqgo73oLoX6Hn\nR1DtLxuJlUsnd0RzNzKNDn1r4R1ovS3rhBBCCC3o9Tq6Da+H3lbHnjUXKSwwaB2pbDh6QL9vwNYR\nNr8MGfFaJyoR+2rB+M+dQ+7Zs9xbUnb3zuh1emaEzmBQvUFsi9zG9GPTKTIWmTRHp1oV+bhfUy7d\nTWfQxnCy800bL8RfkUKLKDfW/XaTRXsi6dk4gIUvNTS5yPLjjR+ZcGQC9bzrsb7berwdvS2U9M+K\n7t/n7tvjsA0IwH/ePJN34TwyDs+Hc18Wnztu9C+t05SZWxeSOb3nNnWf8Kd268fjmJQQQghhbi6e\nDjw1pB4p8dkc2Rpp8lEQq+URBP22Q24qbO0N+VlaJyoRtx498BwwgJRNn5Ox55cyW1dRFMY3G8/o\nxqP5KeonJh2ZRIHBtDtXutb1ZVWfJpyNTWPIZ+HkPi6FPmExUmgR5cKm47eYs+sKzzTwZ+krjdCb\nWGTZemUr045No6VfS9Z0XYObnZuFkv6ZsaCAO2+NxZCeTqUVH6J3tdJLY898AUcWQpP+xTfpPyYy\n7ueyf+NlfIJcaPeq3MsihBBClEZQXS9aPF2VyLAErhyzzt0dJeLfCHpvgsRL8PUgMFjnrgrfSRNx\nbNSIuKlTybtSdkehFEVhRKMRvNviXfbH7GfMwTHkFOaYNEePBv4s692I8FspDP/8FHmFUmwRJSeF\nFmH1tp6I4f2fLtG1ri8f/qsxNnrTPq3XXVjH/JPz6RTUiY86f4STrZOFkv6ZqqrET5tG7unTBMyf\nh0OdOmW2tlndOAA734aQJ+HZD4sveHsMGAqN/LL2EqpRpdvw+tLKWQghhDCD5s8EE1THk1+3XSMp\nNlPrOGWnRld4Zinc2Ac/Tyg+km1lFDs7AleuRO/mRuwbb1KYeK9M1+9ftz+z2swiLD6MkftHkllg\n2udPz8aBLH65EceikhnxxWnyi6TYIkpGCi3Cqm0/FcvU7y/QqVYFPurbBFsTiiyqqrL89HJWnFnB\nM9WeYWnHpdjr7S2Y9s+SV68m46cdVHh7LG5PP12ma5tNwgXYPhAq1IZXNoHeVutEZebYtze4dyuD\nJwfWwaNi2RXohBBCiPJMp1PoOqQeDi627Flzkfxc69zdUSLNB0Pb8XD6Mzi6XOs0JWLrW5GgT1Zj\nzMjgzptvYswxbWdJafWq0YtF7RdxIfkCQ38ZSkpeiknjX2pWifm9GnDkWhKjtpyhoMi0C3aFACm0\nCCv2Q8Rd3v32PO1q+LC6fzPsbR5+N4FRNTL3xFw2XNxA75q9mdd2Hra6si0QpO/cRfLKVbj37In3\niBFlurbZpN+FLb3Bwa24jbND2R250tr1U4lcOHyHRp2DCGlSUes4QgghRLni6GpHt2H1yLqfx8FN\nVx6f+1oAnpwODV6BAzPh/NdapykRh9q1CVi2lLwrV7j7zjuoxrItVnSr2o2VnVZyM/0mg/cMJjHb\ntLbh/2pZmdkv1Gf/lXu89WUEhQYptgjTSKFFWKVd5+MZv/0socHerBnQHAfbhy+yFBmLeO/oe3wV\n+RWD6w9mWug0dErZfinknIkgfupUnJo3x2/2LOu8/DYvHba8AvmZ0Hc7uAVonajMpCZkc+iLq/hV\nc6f1iyFaxxFCCCHKJf/qHrR+MYSbZ5M4dyBW6zhlR6eDnh9Dlbbw45tw66jWiUrEtWNHfCdPJmv/\nAe4tXVrm67er1I7VXVaTmJPIwD0Dic007XNoQGgVZjxblz2XEhi//RxFUmwRJpBCi7A6v1xK4K1t\nETSr4sn6Qc1xNOFejAJDARMOT2DnzZ281eQtxjUdV+ZFjoLYWO6MGoWNvx+Bq1ais7Mr0/XNwlBY\nfFwoORJe/Rz86mudqMwUFhjYs+Yietv/tKE08U4gIYQQQjy8Rp2DqNa4Ar9/F0X8jTSt45QdG3v4\n12bwDIZtfSEpUutEJeI5oD+effuSsn4Dqdu3l/n6LfxasO6pdWQVZjFw90Ci0qJMGj+kbTBTetRm\nx7k43vnmPAbjY7SzSpSKvEIQVuXg1URGbz1Dw0rubBzcEic7m4cem1mQyagDozgYe5ApLacwvOHw\nMi+yGDIyiB0xEtVoJOiTT7Dx9CzT9c1CVWHH23DzEDy3svgC3MeEqqoc2RpJSnw2XYfUxcXTQetI\nQgghRLmmKApPDqyDi7cDv6y7RG6maW17rZqjZ/HRbL09bH4ZMk07/vIoUBQF36lTcG7XjoSZs8g+\nfrzMM9T3qc/GbhtRURm0ZxDnks6ZNH5EhxAmdK3JdxF3mfrdBYxSbBEPQQotwmocuZbEyC/OUNvP\njc8Gt8TF/uGLLFFpUfTZ1YdTCaeY88Qc+tbpa8Gkf00tLOTO2LEUxMZSadVK7IODyzyDWRxZBGc3\nQ4fJ0KSf1mnK1JVj8USGJdDi6apUruutdRwhhBDisWDvaEP31+uTl1XIvg2XHq8Xup5VoO9XkJMM\nW3tDQbbWiUym2NgQuHwZ9tWqcWfs2+TfuFHmGWp41mBT90042zozeM9gvr32rUnjx3SuwVtPVuer\nU7HM+Onif7F332FN3+v/x59JSNh7b3CLiAMV1Na99x4oTrSuqm2t2va02qW1rdaJVtwDte69dx04\nUVHciz2VIZvk90d6PL9+q1Vb4ZPI+3FdXJ6DSXkBIfK5877vu2zNDBL+EVFoEfTC6bupDF91gfIO\nZqweWg9L49cfXHvg4QH67u5LdkE2S1ovoXOFziWY9MU0Gg2J33xDzpmzOH/zDab16pV6hrciMhyO\nTYMaQdBkstRpSlVKTBYn1t/Gvao1ddrraZFMEARBEPSUvbs5jfpUIib6CRd2P5A6TulyrQ09lkPi\nVdg0BIr1bwuTwswM90ULkRkaEjNiJEVpaaWewcPCgw0dNlDXqS5Tz0zl6zNfU1D8+iekPmpZiRGN\ny7Pm7GO+2XVDFFuEvyUKLYLOO/cgnaErL+Bpa8LakACsTF5vpkmxuphfLv7CJ8c/oaJ1RTZ02IC/\no38Jp32x9GXLebpxE7YjPsCqaxdJMvxr94/Bjg/BuzF0nAP6OMD3H8rPLWLf4iiMzJS0HFINubzs\nfO6CIAiCoCuqNnSmSqAT5/c85PGN0r9Ql1TlNtDuJ7i9D/ZO1LZy6xmlqyvuC0MpSk0ldvQY1Pn5\npZ7B0tCS0OahDPUdyqbbmxi8//U3EslkMia1qcyQht4sP/WQ6XtvimKL8FKi0CLotEuPnzB4+Tlc\nrIxYGxKIjenrFVme5j1l1OFRLItaRs9KPVneejmOpo4lnPbFMg8eJPnnnzFv2wb7sWMlyfCvJV2H\nDcFgVwl6rwYDPRzg+w9pNBqOrIwmKy2P1iHVMDYvO5+7IAiCIOgSmUxGo6DK2DibcnDZDbKf5Ekd\nqXTVDYGG4+DCUjg9V+o0/4hx9eq4zJhBbmQkCZ99LkmhQiFXMN5/PLOazOLuk7v03tWbi0kXX+u+\nMpmMLztUJTjQk8Un7jPzwO0STivoK1FoEXQTu1zXAAAgAElEQVTW1dinDFx6DntzQ8KHBWJvbvha\n97uZfpM+u/twPvE8U+tP5av6X6FSSHNxnBt1nfhPJ2LkVx2X6dORyfXwRy4zXrvGWWWqHchmZCl1\nolJ15XAM9yNTaNCtPM4VrKSOIwiCIAhlmlKloM1wX4oL1ewPi6K4rK3cbT4VqnWDg19B1JvNGdEV\nFq1bYf/Jx2Tu2UPqvPmS5Wjp2ZLw9uGYqcwI2R/C2ui1r1X4kclkfN2pGn3ruTP/6F3mHr5TCmkF\nfaOHV31CWRAVl0H/JRFYmSoJHxaIo8XrbXfZdX8XwXuCKVQXsqLNCrpX6l7CSV+uMCGB2JEjMbCx\nwX3BAuRGerihJicd1vaCvAwI+g0s3aROVKoS7mVwZss9ytW0p0Zzd6njCIIgCIIAWDuZ0jS4Con3\nMzmz5c3W9eo9uRy6LASP+rB1hLa1Ww/ZhoRg2b0bqaGhZGzfLlmO8lblWdd+He+5vscP537gi9+/\nIK/o1Sel5HIZ33epTvfabsw6eJvQY6U/4FfQbaLQIuicm4mZBC+NwMzQgPCQQFysjF95n0J1ITPO\nzeCzk59Rza4aGzpswM/erxTSvlhx9jNiRoxEnZuL+6+LMLCzkyzLP/YsFVZ2hNTb2nYhZ+m+nlLI\nzSpgf1gUZrZGNBtQpdRXgQuCIAiC8HIV6zhSvYkbVw7HcO9ystRxSpfSCPqEg20FCO8Ndw9JneiN\nyWQynKdMwSQggPj/fEnO+fOSZTFXmTOn2RxG1RzFzvs7GbB3AHHZca+8n1wu48cefnSu6cKP+26x\n5OT9Ukgr6AtRaBF0yt3kLPoviUBlIGfd8EDcbUxeeZ/U3FSGHxjOmug19K/an7BWYdgZS1fY0BQV\nEffJx+TfvYvrL79gWLGiZFn+sawkWNEe0u5pVwqWbyZ1olKlVms4uOw6edmFtBnui6HJ62+5EgRB\nEAShdDTsXgEHLwuOrIzmaXKO1HFKl4kNDNwFdhVhXV+4tU/qRG9MplLhNncOKjc3Ysd8SMGjR5Jl\nkcvkjKwxkvnN5hObFUufXX04E3/mlfdTyGXM7FmDdtWd+G53NKvOPCzxrIJ+EIUWQWfcT8mmb1gE\nICN8WCCetqavvM+1lGv03tWbqNQopr03jUn1JqGUS3tRnDTjR54dP4HTf77A7P33JM3yj2QmaIss\nT2O0M1nKN5U6Uam7sOchMdFPaNSnEvbu5lLHEQRBEAThBRRKOa2HVUMml7FvcRRFBcVSRypdprYw\nYAc4VoMN/SF6l9SJ3pjC0hL3RQtBJiPmgxEUP30qaZ7G7o1Z12Edtka2jDg0guVRy185t8VAIWdO\nn1q09HHkq+3XCY94XEppBV0mCi2CTniclkNQWARqtYZ1wwIob2/2yvtsubOFgfsGopQrWd1uNR3L\ndyyFpH8vfc1anqxejc3AgVj37St1nDeXEQsr2kFWAvTfDN7vS52o1D2+kcb53Q+oHOhE1YbOUscR\nBEEQBOFvWNga02KwD2mx2ZzcUAY3wJjYwIDt4FITNg6E61ulTvTGVJ6euC2YT2FcHLFjx6EpKJA0\nj6eFJ+Htw2nu0ZxZF2fx6YlPySn8+xNTSoWc+UG1aFrZns+3XmPjhZhSSivoKlFoESQX+ySHvmFn\nySsqZk1IABUd//4EQUFxAd+c+YYpp6dQx7EO69uvp4pNlVJK+3LZx4+TNG0aZs2a4TDxU6njvLkn\nj2B5W+1sluBt4Flf6kSlLvtJHgeX3cDG2ZTGfSuLuSyCIAiCoAe8qtvh38aTG6cSuHkmQeo4pc/I\nEvpvAbe6sGkIXP1N6kRvzMTfH+dp35Nz7hwJU7+WZO3zn/IoTZjZeCYf+X/EwUcH6benH48z//6k\niqGBgoX9/Xm/oh0TN19l2+VXz3kR3l2i0CJIKiEjl6CwCLLyClkzNICqzhZ/e/vknGQG7x/Mxtsb\nGeI7hIUtFmJlJP3K3bxbt4j76GMMq1TG9acfkSkUUkd6M+n3YXk7yMvUviriXlfqRKWuuFjN/rDr\nFBeqaTPcF6Whnn0PBUEQBKEMq9fRG9fKVhwPv0VaXLbUcUqfkQX02wSeDWHLcIgMlzrRG7Ps2BG7\n0aPJ2LKFtLAlUsdBJpM9v95IyU2hz64+nIg98bf3MVIqWBxch0BvWz7+LZLdV8tg4U8ARKFFkFBy\nZh5BYRGkPytg1dAAfF0t//b2l5Iu0WtnL+48ufO8wqyQS38xXJicTMyIkcjNzHBfuBC56atny+iU\n1DvaIkthDgzcCa61pU4kiTNb75F4P4OmwVWwdtKz76EgCIIglHFyhZyWQ6qhMjZg3+IoCnKLpI5U\n+gzNIOg3KNcEto2CiyskDvTm7MaMxqJ9e1JmzSJzn24M+G3g0oD17dfjau7KmMNjWHRlEWqN+qW3\nN1YpWDKwDv6e1oxdf5n91xNLMa2gK0ShRZBEanY+QUsiSMrMY+WQutR0f/mpFI1GQ3h0OEP3D8VM\nZUZ4u3BaebUqxbQvp87NJXbUaIqfPsV90UKUjo5SR3ozyTe1g2/VRTBod5lb4fxf10/GceVQDNWb\nuFGxjp59DwVBEARBAMDU0pDWw6qRkZLL/rAoigtffjH8zlKZQN/1ULEl7BwH58KkTvRGZDIZztO+\nx7hWLeInTSb3yhWpIwHgZu7GqraraF+uPQsiFzDu6DiyCrJeentTQwOWD66Hn5slY8IvceRmUimm\nFXSBKLQIpS79WQH9l0QQ+ySH5YPq4u9p89Lb5hbl8p9T/2H6uek0dG1IePtwKlhXKMW0L6dRq4mf\nOIm869dxnfkzRj4+Ukd6M0nXtUUW0BZZHPUs/1tyKyKRY+G38PS1pWEP3XhsCYIgCILwz7hUtKZJ\nv8o8vpHOgaXXUReXwWKL0gh6r4HK7WDPBDgTKnWiNyI3NMRtwXwM7O2JGTWagljdmHVibGDMtPem\nMbneZE7GniRodxB3n9x96e3NDA1YMbgeVZwsGLH6Esdvp5RiWkFqotAilKqMnEL6L4ngQeozlg6s\nS0A525fe9lTcKbpu78qOezsYWWMkc5vNxUL19zNcSotGoyH555lkHTyIw6SJmDdrJnWkN5NwBVZ0\nAIUKBu0B+8pSJ5LE/cspHF4ZjWslK9oM90VhIJ4SBUEQBEHf+TR04b1eFbkfqf13XqOWdrCqJAwM\noedKqNoJ9n8Gp+ZIneiNGNjY4P7rIjQFBcSOHEFxRobUkQDtiZt+VfsR1iqMzIJMeu3qxcIrCyko\nfvGmJEtjJauH1qO8gxnDV13g9N3UUk4sSEVcVQilJjOvkAHLIribnM2vwf40rGD3wtul5aYx6cQk\nRhwagVKuZFnrZYyqOQq5THcerqmhoaQvW4Z1UF9sBg6UOs6bibsIKzuCyhQG7wa7snmK49H1NPYv\nicLRy5x2I/0wUEk/70cQBEEQhLejRjN3AruU4/a5JI6tuyX5FhtJGKigx3Lw7Q4Hv4ITP0md6I0Y\nli+P29w5FDx8xONhwynO1p0hx3Wd6rK502aaezQnNDKUHjt7cDHp4gtva2WiYm1IAF62pgxdeYFz\nD9JLOa0gBd25chXeadn5RQxado7r8ZmE9qtNk8oOf7mNRqNh652tdNrWiQOPDjCixgg2ddpEXSfd\n2oCTujiM1HnzsezaFcf//Ee/VgDHnINVXcDICgbvAZtyUieSRNztJ+xddA0bF1M6jKmByshA6kiC\nIAiCILxl/m28tGufT8ZzatPdsllsURhAtzDw6wNHvoOj00CPvg6m9evjOmc2eTduEDNsOOpnz6SO\n9JydsR0/Nf6JBc0XkF+Uz6B9g5h6eioZ+X89fWNjqmJNSAAuVkYMXn6Oi4+eSJBYKE2i0CKUuJyC\nIoYsP8+V2AzmB9Wihc9fh40+zHjI0AND+er0V1SwqsCmjpsYXXM0hgpDCRK/XNryFaTMmoVFhw44\nf/ctMrke/Qg9Og2ru4KpPQzeC1YeUieSRNKDTHYvuIqFrRGdxtbE0EQpdSRBEARBEEpIQOdy+DV1\n48rhGM7teiB1HGnIFdAlFGoFw/EZcPhrvSq2mDdrhuvMmeRevUrMiJGoc3OljvQnjdwasbXzVgb6\nDGTr3a103taZfQ/2/aWwZ29uSPiwQOzNDRm07BxXYp5KlFgoDXp0lSjoo7zCYkJWXuDCo3Rm965J\nG1/nP/19YXEhi64sovuO7txMu8mU+lNY3mY55a3KS5T45dLXrCV5xgzMW7fG5YfpyBR61Gry4ASs\n6Q4WLtrBt5auUieSRGpsFjvnRWJsrqTz+FoYm6ukjiQIgiAIQgmSyWS817MiVRs6c2H3Qy7tfyR1\nJGnIFdBxLtQZAr//Agf+o1fFFovWrXCZMYOcixeJHT0adV6e1JH+xERpwoS6E1jXfh2Opo58euJT\nRh8eTXx2/J9u52hhRPiwQKxMlQQvjSAqTjdmzwhvnyi0CCUmr7CYYasucOZ+GjN71aBjDZc//f2l\npEv02NmDBZELaObRjB1dd9CjUg+dmsXyX082/EbSd99h1rw5rj//hMxAj1pN7h6GtT3BylNbZLFw\nfvV93kFPEp+xY04kSkMFncfXwtRKt05LCYIgCIJQMmRyGU36VaFiHQfObL3HtWOxUkeShlwO7WdB\nwAg4Mx/2TtSrYotlh/Y4T/ueZ2fOEvvhWNQFLx5AKyUfWx/WtlvLxLoTuZB0gS7bu7Dy+kqK1EXP\nb+NiZUx4SCDmRtpiy83ETAkTCyVF965ohXdCQZGaUWsvcfJOKjO6+dG1ltvzv8ssyOTrM18zcN9A\n8oryWNB8AT81/gk74xcPx5Xa0y1bSZwyBdPGjXD9ZRYypR61mtw+AOv6gm1FGLQLzP46G6csyEzN\nZfvsSJDJ6Dy+FhZ2xlJHEgRBEAShFMnlMpoP9sHLz44T629z80yC1JGkIZNBmx+g/hg4txh2fQRq\n/VmBbdWlC07ffM2zkyeJGzcejQ4WWwzkBgT7BLO983bqOdXj5ws/E7Q7iOtp15/fxt3GhPBhAagM\n5PQLi+BOUpaEiYWSIAotwltXWKxmTPgljtxM5vuuvvSq6w5oh93ue7iPzts6s+XOFm0fY+etNHJr\nJHHil8vYuZOEL77AtEED3ObORa7So1aTm7thfRA4VIWBO8BUNwtZJS37ST7bZ1+mqKCYzuNqYuVo\nInUkQRAEQRAkoFDIaT2sGu5VrTmyKpq7F5OljiQNmQxafQfvfQwXl8OOD0FdLHWq12bdsyeOX31J\n9tGjxE34FE1R0avvJAFnM2fmNZvHzMYzSclNIWh3ED+e/5GcwhwAPG1NCR8WiFwuI2hJBPdTdGer\nkvDviUKL8FYVFasZvyGSAzeSmNrRh34BngDEZ8cz5sgYPj3+KQ4mDqxrv44JdSdgotTdi97MffuI\nnzQZk7p1cVswH7mhHrWa3NgOvw0A5xowYDuY2EidSBI5mQXsmHOZ3OxCOo6tia2rmdSRBEEQBEGQ\nkIFSQdsRfjiVt+Tg0us8vJYqdSRpyGTQ/CtoPBki18C2kVCsmwWLF7EJCsLxs8lkHThA/MRJaIp1\ns1Akk8lo5dWK7V2206NiD1bfWE2X7V04EXsCgPL2ZoSHBKBWawgKi+BRmu5sVRL+HVFoEd6aYrWG\nCRuvsPtqAp+3q8Kght4UqYtYeX0lXbZ34XzieT6t8ylr263Fx9ZH6rh/K+vQIeImfIpxzZq4LwxF\nbqxHrSbnl8LGweBaB4K3grGV1IkkkfeskB1zI8lKy6PD6Bo4ellIHUkQBEEQBB2gNFTQfnQN7NzN\n2PdrFLE306WOJA2ZDJp+Bs2+hKsbtC/S5etPC4vNwIE4TPiEzD17SPj8CzQ63AJlobLgy/pfsqrt\nKkwMTBh9eDSfHPuElJwUKjqasyYkgLyiYoLCIoh9kiN1XOEtEIUW4a1QqzVM2nyVbZHxfNq6MsMb\nledG2g2Cdgfx84WfqetUl22dtzGg2gAM5Lo9SDbr2DFiP/oYo2o+uC/+FbmpqdSRXk9RAewcD7s/\nhgrNof9mMCqbxYWCvCJ2zb/Ck8RntB1ZHZeKZbPYJAiCIAjCixkaG9Dxw5pYOhize+E1Eu6V4e0v\njSZA25/g9j5Y0hLS70ud6LXZhoRgP24sGdu3kzhlik4XWwBqOdRiY8eNfFjrQ47FHKPzts78dus3\nKjuZsWZoAFl5hQSFRZCQoVsrrIU3Jwotwr+m0Wj4YlsUmy7GMr5FRQa/58JP53+i7+6+pOSm8HPj\nn5nfbD4uZi6v/o9JLPv3U8SNHYdRpUp4hIWhMNOTVpPsZFjVSdtn+97H0Hc9GOpJ9ressKCY3Quu\nkvwoi9Yhvnj42EodSRAEQRAEHWRkpqTTuJqYWqrYNf8KKY/15zTHWxcwHIK3QHYiLG4K945Knei1\n2Y0cie3IETzduInEb79Fo+OblJQKJcP9hrO502aq2lbl27PfMmjfIIxMUlg9NIAnzwoICosgOVO3\nVlgLb0YUWoR/RaPRMHXHddade8yQRnYY2B6g9ebWrLqxih4Ve7C9y3Zae7VGJpNJHfWVnp2NIHb0\naFTe3ngsXYLCQk9Og8RHav9BjI+EHsugxRSQK6ROJYniQjX7fr1G/N2ntBhclXI17aWOJAiCIAiC\nDjO1NKTz+FoYGhuwY04kafFleCBpuSYw7CiYO8OabnAmVG/WP9uPHYvN0CE8XbeepOnTdb7YAuBl\n6cWSVkv4tuG33M+4T/ed3Vl171u+6mFGUmYeQUsiSM3Olzqm8A+JQovwj2k0Gr7fHc2qCxepVesw\nO9JHs/jqYmo51GJtu7V8Wf9LLFT6UazIuXCBmJEjUbq74bF8GQorPWk1ubYJlrXR/u8h+8C3u7R5\nJKQuVnNg2XUeX0+naf8qVKrrJHUkQRAEQRD0gLmNEZ3G10RuIGPHnEieJpfhGRk23hByECq3g/2f\nwfbRUKj7JytkMhkOEyZgPSCYJ6tWkzJzpl4UW2QyGV0qdGFHlx0MrjaYM/Fn+ObSCKrWXkNc/kX6\nLTlD+jPdW2EtvJootAj/iEajYeKuXax58A1mFWbyuOA4Hcp1YHuX7cxtNhc/ez+pI7623MhIYoZ/\ngNLREc/lyzGw0YMNPepiODQVNg8Fl1ow/Bi41JQ4lHQ0ag2HV0Vz/3IK7/WsiE9D3W9TEwRBEARB\nd1g5mNB5XC3URRq2z75MVrruFxdKjKE59FoNTT6DyLWwoj1kJkid6pVkMhmOn32GVd8+pC1ZSuq8\neVJHem02RjaM9x/PwZ4HmVBnAhmFiRi4LCfW5Du6rppNSrbYRqRvRKFFeCNqjZpjMcdoub43+9I/\nx8TiASHVh7K/x36mNpiKt6W31BHfSO61KB4PG47Czg6PlSswsNeDVpO8DFjXB37/BeoM0a5vNtOD\n3CVEo9FwfN0tbkckEdC5HDWau0sdSRAEQRAEPWTjYkqncTUpyCli++zLPMsow20bcjk0mQy910By\nNCxuArEXpE71SjKZDKcvv8SyR3dSQxeSunCh1JHeiKnSlIHVBrK3+16mvTcNN2tT0k1W03JjaxZe\nDiOroAzPEdIzotAivJaC4gK23NlCl+1d+PDIhyRkJ1BF2Z8TfY4wrvY47IztpI74xvKio3kcEoLC\nwgLPFctROjpKHenVUu9AWHO4dwTaz4IOv4CBSupUktFoNJzefJfrJ+Op3caTOm29pI4kCIIgCIIe\ns/cwp8OHNXn2NJ8dcyLJyy6UOpK0qnbUthIZGMLythAZLnWiV5LJ5Th/8w2WnTuRMmcuaUuXSh3p\njSnlSjqW78i+Htv4oNJ0CnLtCb06lxYbW/Lz+Z9JfJYodUThFUShRfhbGfkZLLm2hNabWzPl9BSy\nc2XkxvWhhfls1veZiJmhnqw+/j/ybt/m8ZChyI2N8Vi5AqWLHrSa3DmoLbLkPoEBO6DuUKkTSe78\n7odEHoqhelM3AjuXkzqOIAiCIAjvAOfylrQb5UdGci4750VSkFskdSRpOVbTtql7BMK2kbDvMyjW\n7a+JTC7Hedo0LNq1I/mnn0lftUrqSP+ITCZjTP0OzGq0kNyHYzHIq8aa6DW03dyWL37/gttPbksd\nUXgJA6kDCLopITuB1dGr2Xx7MzlFOTRwaUBj67GsOKykvZ8LM3vWRCHX/U1CL5J//z6PBw9BZmCA\n58oVqNzcpI709zQaODVHO5PFyRf6hIOVh9SpJKVWa4jYfp9L+x9RtYEz7/esqBebrQRBEARB0A/u\nVWxoM9yXvYuusX1OJO1GVsfU0lDqWNIxsYH+W+HAf+BsKCTfgB7Lte/XUTKFApcZP6ApLCRp2nRk\nSiXWfftKHesfaePrxGx1e8auc6F2ua7U9L3Kjvvb2HFvBw1dGzK42mDqOdUTvw/rEHGiRfiTW+m3\nmHxyMm23tCU8OpxmHs3Y1HET75t/zorDKlpXc2J275oYKPTzoVPw8CGPBw4CwGPlClSentIGepWC\nHNgcAoemQLWuMORAmS+y5OcWsWfhVS7tf4TP+y406V8FmZ4W/QRBEARB0F1efna0Hu5LesIzNk47\nT+KDDKkjSUthAG1/gM4L4NFpCGuqnd+iw2RKJa4zf8asaVMSv/6Gp5s2SR3pH+vg58LMXjW4eF/G\nrRvN2dl5Hx/W+pDotGhCDoTQe1dv9j7YS5Fat08blRX6ebUsvFV5RXkcjznO8APD6bGzB0cfHyWo\nahB7u+1l+vvTuXLPhP9si6J5FQfm9a2NUk+LLPl37/Jo0GA0hYV4LF+GYTkdbzXJiIXlbSBqMzT/\nCnosA5WJ1Kkk9STxGZt+uEDM9XQaB1Wmab8qyEWRRRAEQRCEElKupj09JvqjUMrZOvMS0ad1f/tO\niavVHwbthsJcWNICondJnehvyVQqXOfMxvT990n48iuerF8vdaR/rGstN2Z09+PknVQ+23SPQT4h\nHOhxgCn1p5BblMvEExPpsLUDa26sITknWeq4ZZpoHSqDNBoN957e41T8KU7FneJi0kUK1AXYGdsx\nrvY4elXuhYXKAoAtl2KZtOUqjSrZE9q/NioD/SyyPDtzhtix45AZGeKxYjlGlSpJHenvPToDvwVD\nYR70XQ+V20idSHIPr6VycOl1FEo5nT+qiUtFa6kjCYIgCIJQBti6mtFzcl32hUVxZFU0qbFZNOxe\nAbmevvj4VrjX085tWd8PNvSDJp9Do0+124p0kFylwm3eXGLHjSNx6tcUxMTg8MknyHQ079/pVced\nwmI1X2yN4sN1l5gfVJselXrQrWI3jsYcZUXUCmacn8GM8zOoaF2Rhi4NaeDSgNqOtTFUlOH2t1Im\nCi1lREZ+BmcSznA67jSn4k89r3CWsyxHr8q9aOjakHpO9VAp/rfBZueVeCZsvEL9crYsDvbH0EAh\nVfx/5enmLSRMmYKhtxfuixahdHWVOtLfu7gCdk/QtggN2g32laVOJCmNRsOl/Y84u/0+9u7mtB1R\nHXMbI6ljCYIgCIJQhhiZKek0tganN9/jypEY0uKe0WaYL0ZmSqmjScfCBQbvhZ3j4Ng0SIqCLgvB\n0EzqZC8kNzLCfcECkqZNI33pMgpj43CZ8QNyI/37vbJfgCeFRWqm7rzB+A2RzPljtENzj+Y092jO\nrfRbnIo/xem406yNXsuK6yswUhhRx6mOtvDi2gBvC28x06UEiULLO6pIXURUatTzH7CotCjUGjXm\nKnMCnQNp6NKQhq4NcTJ1euH990UlMH5DJHW8bFgysA5GSv0rsmg0GlLmzCFt0a+YNmiA65zZKMzN\npY71csWF2inu58OgQgvovhSMraROJanC/GKOrI7m7oVkKtZ1pGlwFZQq/XssCoIgCIKg/+QKOe/1\nqoiduxnH1t5i4w/naTvCDzs33SwslAqlEXRdBE7V4eCXsPQe9A0Hay+pk72QzMAAxy+/ROnuQfKP\nP/I4MRG30AUY2NpKHe2NDWroTZFaw3e7o1HKZczs9b9lJZVtKlPZpjJDfIeQU5jDhaQL/B73O6fj\nTzPj/Aw4D86mzjRwaUBD14YEOAc872gQ3g5RaHmHJGQnaAsr8ac5m3CWrIIs5DI5vna+fOD3AQ1c\nGuBr54uB/O+/7YduJDEm/DI13CxZNqguJir9e5io8/NJ+PwLMnfvxqpnD5y++gqZUodfcchOgY2D\n4NHv0GAstJgK8rJdUMhMzWXPomukxWVTv1t5arX0EFV3QRAEQRAkV6W+M9ZOpuxddJXNP16g+UAf\nKvg7SB1LOjIZNBgDDlVh02BY3BR6LodyTaRO9kIymQzbwYNQurkS/+lEHvbug/viX3V/fuMLhLxf\njvwiNT/tv4VSIWdGd7+/zC80UZrQyK0RjdwaARCbFcvp+NOcijvFvof72HxnMwqZgup21Wng2oCG\nLg2pZlsNRRm/Fvm39O8KWngutyiXC4kXtD8o8ad4kPEAAAcTB1p4tKCha0MCnQOxNLR87f/msVvJ\njFp7iWouFqwYUg8zQ/17iBQ9eULsmA/JvXgR+48/xnZYiG5foF/fqm0VKsiGbmHg10vqRJKLu/WE\nfWFRqIs1dBhTA89q+vcqgyAIgiAI7y5Hbwt6fl6XvYuusT8sirQ4L+p18C7bmxArNIdhR2FdX1jV\nBQJGQPMvQWUqdbIXsmjZEuWqlcSMHMXDPn1xmzcP04B6Usd6Y6ObVqCwWM3sQ3dQGsj5vovv3177\nuJm70atyL3pV7kWhupCrKVc5Fad9sX5h5EJCI0OxNLR83gXRwKUBjqaOpfgZvRv07yr6HafRaMgu\nzCY1N5W03DRS8/74Mzf1f+/748+0vDSKNcUYKgzxd/Sne8XuNHRpSHmr8v+osPD7nVSGr75IRUcz\nVg0JwMJIh0+AvETBw4c8/uADihIScf1lFhZt20od6eWyk2H3JxC9A1xqQedQcPSROpWkNBoN147F\n8fvGO1g5GNNupB9WjmV705IgCIIgCLrJ1NKQrh/X5vj6W1zY85DU2GxaDvZBZVyGL7Fsy8OwI3D4\na4hYCLf3Qqf54P2+1MleyNjPD68NG9CToYIAACAASURBVIj54AMeh4Tg/O03WHXpInWsNzaueUUK\ni9UsOHoPlULOlI4+r3U9qJQr8Xf0x9/Rn7G1x5Kel87Z+LPPuyT2P9wPgKWhJbZGttgZ22FrrP3T\nztju+fv++35rQ2txEuYPZfhZoPSl56XzIP8BxY+L/1Q8Sc1NJS0v7fn78ovz/3JfA5kBNsY2zx/M\nVWyqYG9iT22H2vg7+mNk8O+GOJ29n0bIqvOUszNlzdAALE30r8iSc/EisaPHgEyGx4oVmNSuJXWk\nF9No4NpG2DsRCnK0bUL1PwRF2f5xLC5Uc3zdLaJPJ+DlZyd+UREEQRAEQecplHKa9q+CnZs5v2+8\nw6YZF8QLRYZm0O4n8OkM28fAyg5QN0T7O6+h7s1LVLm54rUunNix40iY/BmFMbHYjRmt2yfi/w+Z\nTMaEVpUpKFITdvIBBnIZX7Sv+safg42RDe3KtaNduXZoNBpuP7nN2YSzxGTFkJ6XTmpuKlGpUaTm\nppJblPuX+8tlcmyMbP62KJNcWDbWTourmFK04eYGQhNDIVH7/2XIsDay1j4AjezwcPD4U0Xw/39A\nWhpaIpeVzPqxCw/TGbLiPG7WJqwJCcDaVPXqO+mYjN27SZj8GUpXV9wX/4rKw0PqSC+WlQi7PoJb\ne8CtrvYUi72Or5ouBc8y8tm76BpJDzKp004cvRUEQRAEQX/IZDL8mrph62LKvrAoNv5wgVYh1UTr\ns9d7MPI0HPkWzi6E2weg01wo31TqZH+hsLDAY/GvJEyZSuqCBRTEPMb5u++Qq/Tnukgmk/F5u6oU\nFmtY8vsDlAZyJrau/I8LRjKZ7PlQ3RfJKcx53oHxou6L1NxU7mXcIy03jUJ14fP7ORo40ot3f1SC\nKLSUojbebVAnqGlWrxl2xnZYG1m/cjBtSYuMecqg5edxsjAiPCQAOzP92q2u0WhI+3UxKbNnY1zH\nH7d58zCwtpY61l9pNHBlHeybDEX50Op7CBxZ5gfeAiQ+yGDfomvk5xXTZrgv5WuX4WFygiAIgiDo\nLdfK1vScXIc9i66xa/4V6ncpT61WZXyYv8oE2kz/43TLaFjdBWoPhFbfgtHrz5EsDTKVCudp36Py\n9CBl9hyK4hNwmz8PhZX+bAGVyWRM6ehDYbGahcfuYWggZ3yLknlR10RpgonSBHcL97+9nUajIbMg\n83nx5XLk5RLJo2tEoaUUeVt6U824GlVtq0odBYCouAyCl0ZgY6oifFggDhb6tUNeU1hIwtSpZGze\ngkXHjjh/r6NV54w42DkO7h4EjwbQeb62f1Ug+nQCx8JvYmZlSI+xNbF1LcPrEQVBEARB0HsWdsZ0\n/9SfI6uiObP1Hqmx2TQNroJSVcZfXPMIhBG/w9FpcGY+3D0EHedCxRZSJ/sTmUyG3YgRKN3cSfjs\nMx72DcL910W6e1r+BWQyGd929v3fgFyFnNFNK0iax9LQEktDS8pZlSPnVo5kWUpTyfSiCDrvRnwm\n/ZdGYGGkJHxYAE6W+lVkKc7M5PHw4WRs3oLdqFG4/DhD94osGg1cXAGhgfDoFLT9EQbtFkUWQF2s\n5uRvtzmyKhrn8lb0nFxXFFkEQRAEQXgnKA0VtAqpRmCXcty5kMSWny6SlZ4ndSzpKY21J1mGHtTO\nalnbHbaNgtwnUif7C8sO7fFYsZzi9HQe9u5DzmX9OoUhl8uY3s2PrrVc+Wn/LcJO3Jc6UpkjCi1l\n0O2kLPovjcBYqWDdsEDcrPVrWFdhXBwPg4LIuXAR5+nTsR/7oe4dyXz6GFZ31Z5kca6h7U8N+ADk\n4keuKF/DjrlXuHoklhrN3Ok0tgZGZvo3fFkQBEEQBOFlZDIZ/m28aD/Kj8yUXDZOP0/8Hd0rKEjC\nrQ58cALe/wSurIcFgXBrr9Sp/sLE3x+vDeuRW5jzeOAgMvftkzrSG1HIZfzUw4/2fs58vyeaFace\nSB2pTBFXfWXMvZRsgsIiMJDLCB8WiIetfhVZcq9d40HvPhQlp+ARFoZVVx1bv6ZWw/klEFofYs9D\n+1kwYAfYeEudTCekxGRx/4CGxHsZNB9Ylfd6VUSuEE9DgiAIgiC8m7yq29Fjch0MTZRs/yWStDsa\nNBqN1LGkZ2AIzb+CYYfBxBbW9YHNwyAnXepkf6Ly8sJr/XqMfH2JG/8RqWFhevX9M1DImd27Jq2r\nOTJ15w3WRjySOlKZIa5wypCHqc8ICjsLaAgfFoC3nanUkd5I1qFDPAoegNzICK914ZgGBkgd6c/S\nH8CqTrD7E+1GoVFnoO5QcYoFKMgt4vdNd9g4/QIaNXT5pBZV6jtLHUsQBEEQBKHEWTuZ0mNyHdyr\n2ZB4UcPWmZdIi8uWOpZucKkFw49B40lwfQssCIAbO6RO9ScG1tZ4LF+GRbt2pMycReJXU9AUFr76\njjpCqZAzr29tmldx4IutUfx2PkbqSGWCuAIsI2LScwgKO0tBkZq1IYFUcNC9HfYvo9FoSF+5ktgP\nx2JYuRJeG9ZjWF6H5pyo1XB2ESxsAAlXtIO9greClf4MzSopGo2G2+cTWTv1LFcOxVC1vhPl28hw\n8tatKfOCIAiCIAglydDYgPYj/XCuKyM94Rkbvj/P7xvvUJBbJHU06RmooOnnMOwomDvBb8GwcRA8\nS5U62XNyQ0Ncfv4J2w8+4OnGjcSMGElxtv4Uy1QGchb0q02jSvZM2nKVrZdjpY70zhOFljIg/mku\nfcPO8qygmDUhAVR20qMiS1ERSd99T9L0HzBv2RLPlSsxsLWVOtb/pN2DFe1g3yTwbAijzoL/QNC1\nmTESSI9/xvbZlzm49AamloZ0n+RP0+CqGBiKr40gCIIgCGWPTC7DpryM/l/Xp2pDZ64ciWHt1LPc\nPpeoV+0oJcbZD4Ydgab/gehdsKAeRG3WLpjQATK5HIePxuP8/Xc8i4jgUVA/CuPjpY712oyUChYH\n+1O/nC2f/HaFnVf0J7s+EoWWd1xSZh5BYWfJyClk9dB6VHPRn5MEBQ8f8qh/ME/WrsVm6BBcZ/+C\n3EhHtiMV5sLJWdpTLMk3oMtC6LcRLF2lTia5grwiTm2+y4bvzpEak03joMr0mFxHnGIRBEEQBEEA\njMyUNO1XhR4T62BmZcjBZTfY/stl0uL154REiVEoofGn2mG5Vh6waQhs6A/purM1x6p7dzwW/0ph\nfDwPunYjc88eqSO9NiOlgiUD61DH04bxGyLZF5UodaR3lii0vMNSsvLpG3aWlKx8Vg6th5+bldSR\nXotGoyE9PJz7XbuR/+ABLj//jOOnnyLThVknRQVwLgzm1ITDX0P55jAqAmoGlflTLBqNhjsXkgif\nGkHkwcdUru9Ev68D8W3kilxetr82giAIgiAI/5ejtwXdJ9WhcVBlUmOz+e2785zafJeCPNFOhKMP\nDD0ELabC3UMwvy7sHA+ZunEKw7RBA7w2/obSy5O4jz8h7uNPKH76VOpYr8VEZcCywXWp4WbJh+su\ncehGktSR3kk6cOUqlIS07Hz6LTlLwtM8lg+uR20Pa6kjvZbCxERihoaQ9M23mPj7U27Hdiw7tJc6\nFqiLITIc5vvDngnaLUKD9kDfcLAQQ12fJD5jx5xIDiy5jrG5ku4T/WkWXBVjc5XU0QRBEARBEHSW\nXC7Dt5Er/b4JpEp9JyIPPiZ8ylnuXEgS7UQKA3jvIxgbCf6D4PIa7Yud+7/Qifktht7eeK1di/34\ncWQeOMD9jp3IPnFC6livxczQgBVD6uHjbMGotZc4ditZ6kjvHFFoeQc9zSmg/9JzPErLYemgOtTz\ntpE60itpNBoytm/nfsdO5ERG4jR1Ku5hi1E6OkobTK2G69u065q3jQRja+i3GQbvBa+G0mbTAQV5\nRZzZepf1354j5XEWjfpUoudndXEqJ9qEBEEQBEEQXpexmYqmwVXpPskfE0tDDiy5zvbZkaQnPJM6\nmvQsnKH9TPjwIlTvAWdDYU4NOPI95GVIGk1mYIDdiBF4/7YBhZUVMcM/IOHLryjO1v3vm4WRklVD\nAqjgYMYHqy9y6q70xat3iSi0vGMycgsJXnqOe8nZhA2oQ4PydlJHeqWi9HTixo4jftJkDCtWpNy2\nrVj36Y1MylYcjQbuHITFjWHjQO37eq2C4cehYgvRJqTRcPdiMuu+juDS/sdUCnAiaGog1Zu4iTYh\nQRAEQRCEf8jJ25Iek+vQuG8lUmOy2PDtOU5vEe1EAFh7QpdQ7fKJCi3gxI8w2087N7FA2sKGkY8P\nXps3YRsylKebNvGgSxdyLlyQNNPrsDRRsiYkAG87U4auPE/E/TSpI70zRKHlHZKVV8ig5ee4mZjJ\nomDt+i5dl3XkiPaY3bFjOEz4BM/Vq1B5SLwW+eEpWNYG1vbQVsm7LIJRZ8Cnc5kvsIC2TWjn3Ej2\nh0VhZKak26f+NB9QFRML0SYkCIIgCILwb8nlMnwbu9Hv60Aq13fi8oHHhE+N4O7FZNFOBGBfGXqt\n1A7Mda+nnZs4pyZE/ApF+ZLFkqtUOEyYgOea1SCT8Sh4AEk//oQ6X7pMr8PGVMWakADcrE0YvOI8\nFx+lSx3pnSAKLe+IZ/lFDFlxnmuxGcwPqk2zKhK33LxCcVYW8Z99Tuyo0Rg4OOC1aRO2ISHIFArp\nQsVdhNVdteuanz6C9rNgzAWo2RfkEubSEYX5xZzZdo/1354j6WEW7/euRM/JdXAuL9qEBEEQBEEQ\n3jZjcxXNgqvSfaI/xuZK9odFsWNOJE8Sdb8tpVQ419Bu/RyyH+wqwd6JMM8fLq2GYulOAJn4+1Nu\n21asevcifdkyHvboQe7165LleR12ZoaEhwTgaGHEoGXniYzRj8G+ukwUWt4BuQXFDF15nouPnjCn\nTy1aV3OSOtLfenY2gvudO5OxfTu2Iz7Ae8N6jCpXki5QcjSs7wdhzSA+Elp9B2MvQ92hYCBOaWg0\nGu5dTiZ86lku7XtEpbqO9Ps6EL+mbsgV4ilEEARBEAShJDmVs6TnZ3Vp1KcSKY+zWP/tOc5svUdh\nfrHU0XSDRyAM2gXBW8HUHnaMgdAAiNqsnbcoAbmpKc5/zJwszsjkYe8+pISGoinS3RYwBwsjwocF\nYG2qYsDSCKLipJ1/o+/EVZKeyyssZvjqC0Q8SOeX3jVp76e7G3DUubkkfj+Nx4MGIVeq8Apfi8P4\n8chUEhUz0u/DluHaQbcPTkCTz2HcFWjwISiNpcmkQzQaDY9vpLFjTiT7fo3C0ERJ1wm1aT7IR7QJ\nCYIgCIIglCK5XEb1Jm4ETQ2kUj1HLu1/RPjUs1w9Givmt4C2vb98Mxh2BHqvBYUKNg2BXxvBrX3a\n+YsSMHv/fcrt2I5F69akzp3Hw75B5N+/L0mW1+FsaUz4sADMjZT0XxpBdEKm1JH0lii06LH8omJG\nrrnIyTup/Njdj841XaWO9FK5V6/yoFt3nqxejXX//nhv24pxzZrShMmIg53jYH5duLEDGo7VFlia\nTAIjC2ky6ZCCvCKuHYtl3dcR7Jx7hbT4Z7zXsyK9Pq+DSwUrqeMJgiAIgiCUWSYWKpoP9KHbp/6Y\nWhlycsNtVkw+xckNt3malCN1POnJZFC1A4z4HbotgYJsWNcblraE+8cliaSwssJ15s+4/jKLwseP\nedC1G+mrVqOR6LTNq7hZm7BuWCBGBgr6L4ngTlKW1JH0koHUAYR/prBYzZjwyxy9lcK0rtXpWcdd\n6kgvpCkoIHXRIlJ/XYyBvT0ey5dhWr++NGHS7sH5JXB+KWjU4D8YGk0Ac91utSotT5NziDoWR/Tp\neAryinHwsqDFYB8q+DugMBA1WUEQBEEQBF3hXN6SHpPqkPQgk6vHYog6EcfVo7F4+tri19QN96o2\nyMryJki5Avx6QrUuELkWjv8IqzqBdyNoOB7KNQV56f5+a9G2Lcb+/iR++RVJ06aRdfgwLtO+R+mq\ney+We9iaED4sgN6Lz9I3LIINHwRS3t5M6lh6RRRa9FBRsZpx6y9z8EYSX3eqRlCAxFt6XiL/zh3i\nJk0i/0Y0lp074/jF5ygsSvnESFE+3NwFF1do24NkCqjRFxpP1K6IK+M0ag0xN9O5ejSWR1FpyOUy\nKvg7UL2pG07eYsitIAiCIAiCLnP0tqCldzUadKvAjd/jiToex855V7ByNKF6Ezeq1HdCZVSGL/kU\nSvAfBH594MIy+H0WrOkGVh5QewDU7A8WpTd6QenggNuihTzdtInk6T9wv1NnHL/4AsuuXZDp2HbT\ncvZmrBsWQO9fz9Lvj2KLp62p1LH0Rhn+qdNPxWoNH/92hT3XEvlP+6oMbOAldaS/0BQXk75iJSlz\n5iA3M8N13lwsWrYs3RCpd7TFlSvrICdN+2Ta7Euo2a9Un0x1VUFeEbfOJnL1aCxPk3IwtlBRt703\n1d53wdTSUOp4giAIgiAIwhswtTSkbntvarf25N6lZK4ejeXkhtuc3X6PqvWdqd7EDStHE6ljSkdp\nBPVHaZdd/PdF2CPfwdHpULmtthhTvlmpbBqVyWRY9+yJaf36JEz+jITPPyfr0CGcv/kaAzu7Ev/4\nb6KCgzlrhwXQd/FZgsIiWD88EHebMvw4egOi0KJH1GoNEzddZceVeCa1qULI++WkjvQnGo2G7CNH\nSFmwgPwb0Zg1b659wrC1LZ0AhXkQvQMuroRHv4PcACq30z5xSnA8UBc9Tc7h2rFYbp5OoCCvGEdv\n0R4kCIIgCILwrlAYyKlUz4lK9Zz+0lbkUc0Wv2ZueJTltiIDQ/Dtrn1LuweXVmlbi27uAkt3qBUM\ntfqDZcm386jc3PBYtZL0latI+eUX7rXvgO2ggVgHB6Mw0502nSpOFqweGkBQ2FmClpxlw/D6uFiJ\nxSGvIgotekKt1vD51mtsvhTLRy0qMbJJeakjPafRaMg+fJiUBaHkR0ej9PDA5aefsOjQvnSOwCXf\nhEsrtadXcp+AtTe0mKo9vWLmUPIfX8dp1Bpiov9oD7ou2oMEQRAEQRDKghe1Fe163lbkSpVAZ1TG\nZfhy0LY8tPwamn4Bt/ZoryeOTYPjP0DFVtoXayu0BEXJfY1kcjm2gwdh9v57JM+cRcqcuaStWInN\nwAHYBAejMDcvsY/9JnxdLVk9NID+SyLot0R7ssXRwkjqWDqtDP9k6Q+NRsOUHddZfz6GMU0rMLZ5\nBakjAaBRq8k6dIjU0IXk37yJ0tMD5x+mY9mhAzKDEn5oFebC9W3aY38xZ0GuhKodtU+IXu+L0yto\n24Nunknk2jHRHiQIgiAIglBW/amt6HIyV4/EcnLDHc5uvy/aigAMVNqhudW6QPoDuLwaLq+B2/vA\n3AVqB2tPuliV3PIRwwoVcF8YSm7UdVJDQ0mdO4/0/7/gUtpzLl+ghrsVK4bUZcDScwSFnWX98PrY\nm4tripcRhRYdp9Fo+HZXNKvPPuKDRuX4pFUlyQcladRqsg4eIjU0lPxbt1B5euIy4wcs2rcv+QJL\n0nVtceXqBsjLANsK0PJbqBkEprrV0ygFdbGaxAeZ3LuYTPSZBApFe5AgCIIgCILAH21FdZ2oVNeJ\npIeZXDsa+6e2oir1nfDwscHQRCl1VOnYeEPzr6DJZ3B7v/a64/iP2rcKLbQv6lZqrR2yWwKMfavh\nHrqA3OvXSQ1dSOq8+X8UXAZiM0D6gou/pw3LBtVl0PLz9F8SwbrhgdiYqiTNpKtEoUWHaTQaZuy7\nxbJTDxjc0IvJbatIWmTRqNVkHTioLbDcvo3KywuXH2dg0a5dyRZYCp7B9a3aJ7rY86BQgU9n7ROd\nZ0PQsQndpS03q4DH19N4FJXG4xvp5OcUIVeI9iBBEARBEAThxRy9LHAc7EP9buW1bUUn4jiwJA2Z\nXIZzeUs8fW3x9LXFxsVU8hd5JaFQQtUO2renj+HSH6dcNvQDMyeo1U+7tcjaq0Q+vHG1argvmE/e\njRukhIaSOn8+6StXYhMcjM3AASgspfv9PqCcLUsH1mHwCm2xJXxYAFYmotjyf4lCiw775dAdFh2/\nR/9AD77q4CPZk5y2wHKA1AWh5N+5g8rbWzuDpV1bZIoSmsz9LBXuHoI7B+DOQcjPBLvK0Ho61OgD\nJjYl83H1gEatITU2m4fXUnkUlUbSw0zQgLGFCu8adnj62uHuY4NhWe65FQRBEARBEF7pv21F/m29\nSHqQyaNrqTy6nsaZrfc4s/UeZjaGePna4elri2sVa5Sqkt/Ko3OsPKDZF9B4Etw9qH3x9/df4OQs\n8KgPlVppZ7o4+Lz1F4CNfHxwnz+fvOhobUtRaCjpq1ZhMyAYm4EDJSu4NKhgx+IBdRi28gIDlp1j\nTUgAFkZl+CTUC4grMR017/Ad5h6+Q+867nzTyVeSIoumuJis/ftJXbiQ/Dt3UZUrh8vPP2PRts3b\nL7Co1ZBwWVtUuXMA4i4BGjB1AJ9O2h33HoFl9vRKQW4RMdHpPIrSnlzJySwAGTh4WlCvgzeevrbY\nu5uX3QnygiAIgiAIwj8m/+Mki3N5SwK7lCf7ST6Pr6fx8FoqNyMSiToRh8JAjmtlKzz/KLxY2pex\nzTMKA+0q6MptISNOe8Ll5k44NFX7ZuEGFVtqiy7ejcDw7W0OMqpaFbd588i7eVPbUhS6kPRVq7EO\n7o/twIEorKze2sd6XY0r2bOwf21GrLnIwGXnWD00ADNDUV74L/GV0EG/Hr/HzIO36VbLlendqiMv\n5YtnTXExmfv2kbpwIQV376GqUB6XmT9j0eYtF1hyn8C9o9riyt2D8CwFkIFbHe3074otwcmvTA62\n1Wg0PE3K4eG1NB5FpZJwJwO1WoOhiQHuPjZ4+tri4WOLiYU4picIgiAIgiC8XWbWhvi854LPey4U\nF6qJv/v0+Qt+Jzfc5uQGsHYywcPXFi9fW5wrWJWtWYCWrtBkkvYtM/5/J/GvbYKLy7WjDjwbaosu\nFVtpNxy9hReMjapUwW3uHPJu3SI1dCFpCxfx5I+Ci83AgRhYW7+FT+71Na/qyLy+tRkdfonBy8+x\nckg9TFSixACi0KJzlv3+gOl7b9Kxhgs/9axRqkUWTXExmXv/KLDc0xZYXH+ZhXnr1sjeRrFDo9EO\ns/1vO1BMBGiKwdhaO1yqYiso3xxMbf/9x9JDRQXFxN3+7z9iqWSm5gFg42JKzZbuePra4lTOErmi\nDP0jJgiCIAiCIEhKoZTjXtUG96o2vNezIk+Tc54XXa4di+XKoRiURgrcq9o8n+1SpjZcWrho57XU\nHgBFBdqNqP+93tn/mfbN2vt/RRevhqD8d6eBjCpXxm3ObPJu3SZ14ULSfl2sLbj074/N4EGlWnBp\n4+vEnD41GbvuMkNXXGDZoLoYl8UWs/9DFFp0yOqzj/hm1w3a+joxq1cNFKVUZCl68oTsI0dIW7qM\ngvv3MaxYAdfZv2DeqtW/L7DkZ8H94/97ssmK177fuQa8/7H2ycbVH+Rl64exuFBNesIzUmOzSI3J\nJjU2m+SHmRQVqjFQyXGrYkOtVp54+tpibiN21AuCIAiCIAi6wcrBBKtmJtRo5k5hfjGxN//X3n7/\ncgqgfaHQ3t0cO3cz7NzMsHM3x8i0DMzwMFBp24a8G0Gr7+DJI+3J/TsH4dIqOPcrGBhr//6/bUbW\nnv/4wxlVroTb7F/Iv3NHW3AJC+PJmjVY9wvCslMnVBUqlMoIig5+LhQVa/jot0iGr75A2IA6GCnL\n1vXd/yUKLTpiw/nHfLktihZVHZjTp9b/a+/eg+Q66zuNP7/unum59EgaSTOSNZIt4QuxTCzZlsCA\nVSvJQHmzVKBqWWxCUk4Kll2Mt8LeWDaVStgsVC1xxeBayCYsl4SYAFkHNlqSEBszIsYQY8uXyFd8\niYUlyx5JI0saSXPp7nf/OGeulrmIHo1m+vlUner3vOd099v2vK3T3/Oe99Ayi6MWUkqM/tM/MdTf\nz7H+fk7e/wDU65Qvuoi+T36Srre8+fQDluoIDDwGz343C1f2fA/qY9DaBedvy26HdsGboGtlYz/U\nWWzkxNhEmHLwuWMc2DvE4f3HqdcSAKXWAstXV1h/1SrOe80yVl20hFKTfzFJkiTp7NdSLrJuQw/r\nNvSQUmLw+eM8u/sgzz95hL2PD/LEPS9M7FtZWmb56ix86VnTxfLVFbqWtS3suxp1nweb35stYyfh\n2bvzE9B/ly0APb+QhS7nb4dzNp7WTT/KF15I3803s/yGG7JLij77OQ7978/SsmYNlW1b6dq2jY5N\nm4iW2Qu73n5ZH6O1Oh+67R95/627+KNfu4JyqXl/0xi0nAX+ctdePvy13fyzi3r49Lsvp3UWrm9M\nY2Oc2HV/Fq7s7Gdsz48AKF98Mcv/7b+hsm0bbZdc8rMFLKMnskuB9j8I+x/KloHHsmAFoOdiuPL9\nWVJ77pWzdr/5s0VKiWODw9NClYN7hzh2aHhin45FrSxfU+G8S5ZN/COzqKf9jM/DI0mSJDVSRLCs\nr8KyvgpXXJPVnTg6Om0E98HnjrFn90FSdr6R1vZSPuKlMjECpntl58Kc76WlHS58U7akj8Ohp/PQ\n5Xa454/he/8z22/Judno/3M2ZMHLORug0vtTvUX5ggvou/kP6P0vH2KofydD/f289JWvcviLf0ah\nUqFzy1V0bd9OZcuWWZlA952b1lCtJX7r67u58c8f4A/fffmsDiA4mxm0zLEdDz3Pf77tId54/nL+\nuMGpX+3IEYbu+i5D/f0M3XUX9aNHiZYWOq68kqXXX0/X1q20rFr1073Y8FF4YfdkoLL/ITj4BKR6\ntr19KazaCG+4Mfsy6NsES9Y07LOcTVJKnDw2xtDh4ezyn+eGJv4BGTlRzXaKbFjlinWLuGTLKnrW\ndLFsdaW5rleVJElSU+tY1Mq567ObOIwbG61xaN/QtPDl0e8+T3U0+11RKAZLV3VmAczq7Bh60bI2\nOpeUF04AEwHLL8iW198AI0Ow9wew/x8nf2s99v8m9+86Z0r4ki+L+l5xgt2WFSvovu5auq+7lvqJ\n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\nf9alElAadvRbAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = plt.figure(figsize=(19, 10))\n", "\n", "# Hamming window\n", "window = np.hamming(51)\n", "plt.plot(np.bartlett(51), label=\"Bartlett window\")\n", "plt.plot(np.blackman(51), label=\"Blackman window\")\n", "plt.plot(np.hamming(51), label=\"Hamming window\")\n", "plt.plot(np.hanning(51), label=\"Hanning window\")\n", "plt.plot(np.kaiser(51, 14), label=\"Kaiser window\")\n", "plt.xlabel(\"sample\")\n", "plt.ylabel(\"amplitude\")\n", "plt.legend()\n", "plt.grid()\n", "\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.10" } }, "nbformat": 4, "nbformat_minor": 2 } ================================================ FILE: 2.numpy/numpy_exercises/8_Logic_functions.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Logic functions" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import numpy as np" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'1.11.2'" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.__version__" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Truth value testing\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q1. Let x be an arbitrary array. Return True if none of the elements of x is zero. Remind that 0 evaluates to False in python.\n" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "True\n", "False\n" ] } ], "source": [ "x = np.array([1,2,3])\n", "#\n", "\n", "x = np.array([1,0,3])\n", "#" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q2. Let x be an arbitrary array. Return True if any of the elements of x is non-zero." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "True\n", "False\n" ] } ], "source": [ "x = np.array([1,0,0])\n", "#\n", "\n", "x = np.array([0,0,0])\n", "#" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Array contents\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q3. Predict the result of the following code." ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [], "source": [ "x = np.array([1, 0, np.nan, np.inf])\n", "#print np.isfinite(x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q4. Predict the result of the following code." ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [], "source": [ "x = np.array([1, 0, np.nan, np.inf])\n", "#print np.isinf(x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q5. Predict the result of the following code." ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": true }, "outputs": [], "source": [ "x = np.array([1, 0, np.nan, np.inf])\n", "#print np.isnan(x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Array type testing" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q6. Predict the result of the following code." ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false }, "outputs": [], "source": [ "x = np.array([1+1j, 1+0j, 4.5, 3, 2, 2j])\n", "#print np.iscomplex(x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q7. Predict the result of the following code." ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": false }, "outputs": [], "source": [ "x = np.array([1+1j, 1+0j, 4.5, 3, 2, 2j])\n", "#print np.isreal(x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q8. Predict the result of the following code." ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": false }, "outputs": [], "source": [ "#print np.isscalar(3)\n", "#print np.isscalar([3])\n", "#print np.isscalar(True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Logical operations" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q9. Predict the result of the following code." ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "collapsed": false }, "outputs": [], "source": [ "#print np.logical_and([True, False], [False, False])\n", "#print np.logical_or([True, False, True], [True, False, False])\n", "#print np.logical_xor([True, False, True], [True, False, False])\n", "#print np.logical_not([True, False, 0, 1])\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Comparison" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q10. Predict the result of the following code." ] }, { "cell_type": "code", "execution_count": 42, "metadata": { "collapsed": false }, "outputs": [], "source": [ "#print np.allclose([3], [2.999999])\n", "#print np.array_equal([3], [2.999999])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q11. Write numpy comparison functions such that they return the results as you see." ] }, { "cell_type": "code", "execution_count": 51, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ True False]\n", "[ True True]\n", "[False False]\n", "[False True]\n" ] } ], "source": [ "x = np.array([4, 5])\n", "y = np.array([2, 5])\n", "#\n", "#\n", "#\n", "#" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q12. Predict the result of the following code." ] }, { "cell_type": "code", "execution_count": 50, "metadata": { "collapsed": false }, "outputs": [], "source": [ "#print np.equal([1, 2], [1, 2.000001])\n", "#print np.isclose([1, 2], [1, 2.000001])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.12" } }, "nbformat": 4, "nbformat_minor": 2 } ================================================ FILE: 2.numpy/numpy_exercises/8_Logic_functions_Solutions.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Logic functions" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import numpy as np" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'1.11.2'" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.__version__" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Truth value testing\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q1. Let x be an arbitrary array. Return True if none of the elements of x is zero. Remind that 0 evaluates to False in python.\n" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "True\n", "False\n" ] } ], "source": [ "x = np.array([1,2,3])\n", "print np.all(x)\n", "\n", "x = np.array([1,0,3])\n", "print np.all(x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q2. Let x be an arbitrary array. Return True if any of the elements of x is non-zero." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "True\n", "False\n" ] } ], "source": [ "x = np.array([1,0,0])\n", "print np.any(x)\n", "\n", "x = np.array([0,0,0])\n", "print np.any(x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Array contents\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q3. Predict the result of the following code." ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [], "source": [ "x = np.array([1, 0, np.nan, np.inf])\n", "#print np.isfinite(x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q4. Predict the result of the following code." ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": false }, "outputs": [], "source": [ "x = np.array([1, 0, np.nan, np.inf])\n", "#print np.isinf(x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q5. Predict the result of the following code." ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": true }, "outputs": [], "source": [ "x = np.array([1, 0, np.nan, np.inf])\n", "#print np.isnan(x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Array type testing" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q6. Predict the result of the following code." ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false }, "outputs": [], "source": [ "x = np.array([1+1j, 1+0j, 4.5, 3, 2, 2j])\n", "#print np.iscomplex(x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q7. Predict the result of the following code." ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": false }, "outputs": [], "source": [ "x = np.array([1+1j, 1+0j, 4.5, 3, 2, 2j])\n", "#print np.isreal(x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q8. Predict the result of the following code." ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": false }, "outputs": [], "source": [ "#print np.isscalar(3)\n", "#print np.isscalar([3])\n", "#print np.isscalar(True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Logical operations" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q9. Predict the result of the following code." ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "collapsed": false }, "outputs": [], "source": [ "#print np.logical_and([True, False], [False, False])\n", "#print np.logical_or([True, False, True], [True, False, False])\n", "#print np.logical_xor([True, False, True], [True, False, False])\n", "#print np.logical_not([True, False, 0, 1])\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Comparison" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q10. Predict the result of the following code." ] }, { "cell_type": "code", "execution_count": 42, "metadata": { "collapsed": false }, "outputs": [], "source": [ "#print np.allclose([3], [2.999999])\n", "#print np.array_equal([3], [2.999999])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q11. Write numpy comparison functions such that they return the results as you see." ] }, { "cell_type": "code", "execution_count": 51, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ True False]\n", "[ True True]\n", "[False False]\n", "[False True]\n" ] } ], "source": [ "x = np.array([4, 5])\n", "y = np.array([2, 5])\n", "print np.greater(x, y)\n", "print np.greater_equal(x, y)\n", "print np.less(x, y)\n", "print np.less_equal(x, y)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q12. Predict the result of the following code." ] }, { "cell_type": "code", "execution_count": 50, "metadata": { "collapsed": false }, "outputs": [], "source": [ "#print np.equal([1, 2], [1, 2.000001])\n", "#print np.isclose([1, 2], [1, 2.000001])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.12" } }, "nbformat": 4, "nbformat_minor": 2 } ================================================ FILE: 2.numpy/numpy_exercises/9_Mathematical_functions.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Mathematical functions" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import numpy as np" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'1.11.2'" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.__version__" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [], "source": [ "__author__ = \"kyubyong. kbpark.linguist@gmail.com. https://github.com/kyubyong\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Trigonometric functions" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q1. Calculate sine, cosine, and tangent of x, element-wise." ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "sine: [ 0. 0.84147098 -0.98803162 0.89399666]\n", "cosine: [ 1. 0.54030231 0.15425145 -0.44807362]\n", "tangent: [ 0. 1.55740772 -6.4053312 -1.99520041]\n" ] } ], "source": [ "x = np.array([0., 1., 30, 90])\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q2. Calculate inverse sine, inverse cosine, and inverse tangent of x, element-wise." ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "inverse sine: [ 1.57079633 0. 1.57079633]\n", "inverse cosine: [ 0. 1.57079633 0. ]\n", "inverse tangent: [ 0.78539816 0. 0.78539816]\n" ] } ], "source": [ "x = np.array([-1., 0, 1.])\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q3. Convert angles from radians to degrees." ] }, { "cell_type": "code", "execution_count": 45, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[-180. -90. 90. 180.]\n" ] } ], "source": [ "x = np.array([-np.pi, -np.pi/2, np.pi/2, np.pi])\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q4. Convert angles from degrees to radians." ] }, { "cell_type": "code", "execution_count": 48, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[-3.14159265 -1.57079633 1.57079633 3.14159265]\n" ] } ], "source": [ "x = np.array([-180., -90., 90., 180.])\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Hyperbolic functions" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q5. Calculate hyperbolic sine, hyperbolic cosine, and hyperbolic tangent of x, element-wise." ] }, { "cell_type": "code", "execution_count": 65, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[-1.17520119 0. 1.17520119]\n", "[ 1.54308063 1. 1.54308063]\n", "[-0.76159416 0. 0.76159416]\n" ] } ], "source": [ "x = np.array([-1., 0, 1.])\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Rounding" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q6. Predict the results of these, paying attention to the difference among the family functions." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [], "source": [ "x = np.array([2.1, 1.5, 2.5, 2.9, -2.1, -2.5, -2.9])\n", "\n", "out1 = np.around(x)\n", "out2 = np.floor(x)\n", "out3 = np.ceil(x)\n", "out4 = np.trunc(x)\n", "out5 = [round(elem) for elem in x]\n", "\n", "#print out1\n", "#print out2\n", "#print out3\n", "#print out4\n", "#print out5\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q7. Implement out5 in the above question using numpy." ] }, { "cell_type": "code", "execution_count": 87, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 2. 2. 3. 3. -2. -3. -3.]\n" ] } ], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Sums, products, differences" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q8. Predict the results of these." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/usr/local/lib/python2.7/dist-packages/ipykernel/__main__.py:34: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison\n" ] } ], "source": [ "x = np.array(\n", " [[1, 2, 3, 4],\n", " [5, 6, 7, 8]])\n", "\n", "outs = [np.sum(x),\n", " np.sum(x, axis=0),\n", " np.sum(x, axis=1, keepdims=True),\n", " \"\",\n", " np.prod(x),\n", " np.prod(x, axis=0),\n", " np.prod(x, axis=1, keepdims=True),\n", " \"\",\n", " np.cumsum(x),\n", " np.cumsum(x, axis=0),\n", " np.cumsum(x, axis=1),\n", " \"\",\n", " np.cumprod(x),\n", " np.cumprod(x, axis=0),\n", " np.cumprod(x, axis=1),\n", " \"\",\n", " np.min(x),\n", " np.min(x, axis=0),\n", " np.min(x, axis=1, keepdims=True),\n", " \"\",\n", " np.max(x),\n", " np.max(x, axis=0),\n", " np.max(x, axis=1, keepdims=True),\n", " \"\",\n", " np.mean(x),\n", " np.mean(x, axis=0),\n", " np.mean(x, axis=1, keepdims=True)]\n", " \n", "for out in outs:\n", " if out == \"\":\n", " pass\n", " #print\n", " else:\n", " pass\n", " #print(\"->\", out)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q9. Calculate the difference between neighboring elements, element-wise." ] }, { "cell_type": "code", "execution_count": 100, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 1 2 3 -7]\n" ] } ], "source": [ "x = np.array([1, 2, 4, 7, 0])\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q10. Calculate the difference between neighboring elements, element-wise, and\n", "prepend [0, 0] and append[100] to it." ] }, { "cell_type": "code", "execution_count": 108, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 0 0 1 2 3 -7 100]\n" ] } ], "source": [ "x = np.array([1, 2, 4, 7, 0])\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q11. Return the cross product of x and y." ] }, { "cell_type": "code", "execution_count": 110, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[-3 6 -3]\n" ] } ], "source": [ "x = np.array([1, 2, 3])\n", "y = np.array([4, 5, 6])\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Exponents and logarithms" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q12. Compute $e^x$, element-wise." ] }, { "cell_type": "code", "execution_count": 115, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 2.71828175 7.38905621 20.08553696]\n" ] } ], "source": [ "x = np.array([1., 2., 3.], np.float32)\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q13. Calculate exp(x) - 1 for all elements in x." ] }, { "cell_type": "code", "execution_count": 118, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 1.71828175 6.38905621 19.08553696]\n" ] } ], "source": [ "x = np.array([1., 2., 3.], np.float32)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q14. Calculate $2^p$ for all p in x." ] }, { "cell_type": "code", "execution_count": 124, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 2. 4. 8.]\n" ] } ], "source": [ "x = np.array([1., 2., 3.], np.float32)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q15. Compute natural, base 10, and base 2 logarithms of x element-wise." ] }, { "cell_type": "code", "execution_count": 128, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "natural log = [ 0. 1. 2.]\n", "common log = [ 0. 0.43429448 0.86858896]\n", "base 2 log = [ 0. 1.44269504 2.88539008]\n" ] } ], "source": [ "x = np.array([1, np.e, np.e**2])\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q16. Compute the natural logarithm of one plus each element in x in floating-point accuracy." ] }, { "cell_type": "code", "execution_count": 131, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 1.00000000e-099 1.00000000e-100]\n" ] } ], "source": [ "x = np.array([1e-99, 1e-100])\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Floating point routines" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q17. Return element-wise True where signbit is set." ] }, { "cell_type": "code", "execution_count": 135, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ True True True False False False False]\n" ] } ], "source": [ "x = np.array([-3, -2, -1, 0, 1, 2, 3])\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q18. Change the sign of x to that of y, element-wise." ] }, { "cell_type": "code", "execution_count": 140, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[-1. -0. -1.]\n" ] } ], "source": [ "x = np.array([-1, 0, 1])\n", "y = -1.1\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Arithmetic operations" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q19. Add x and y element-wise." ] }, { "cell_type": "code", "execution_count": 141, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0 0 0]\n" ] } ], "source": [ "x = np.array([1, 2, 3])\n", "y = np.array([-1, -2, -3])\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q20. Subtract y from x element-wise." ] }, { "cell_type": "code", "execution_count": 142, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0 1 2]\n" ] } ], "source": [ "x = np.array([3, 4, 5])\n", "y = np.array(3)\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q21. Multiply x by y element-wise." ] }, { "cell_type": "code", "execution_count": 144, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 3 0 -5]\n" ] } ], "source": [ "x = np.array([3, 4, 5])\n", "y = np.array([1, 0, -1])\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q22. Divide x by y element-wise in two different ways." ] }, { "cell_type": "code", "execution_count": 161, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 3. 2. 1.66666667]\n", "[ 3. 2. 1.]\n" ] } ], "source": [ "x = np.array([3., 4., 5.])\n", "y = np.array([1., 2., 3.])\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q23. Compute numerical negative value of x, element-wise." ] }, { "cell_type": "code", "execution_count": 146, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[-1 1]\n" ] } ], "source": [ "x = np.array([1, -1])\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q24. Compute the reciprocal of x, element-wise." ] }, { "cell_type": "code", "execution_count": 155, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 1. 0.5 5. ]\n" ] } ], "source": [ "x = np.array([1., 2., .2])\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q25. Compute $x^y$, element-wise." ] }, { "cell_type": "code", "execution_count": 163, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[ 1 4]\n", " [ 3 16]]\n" ] } ], "source": [ "x = np.array([[1, 2], [3, 4]])\n", "y = np.array([[1, 2], [1, 2]])\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q26. Compute the remainder of x / y element-wise in two different ways." ] }, { "cell_type": "code", "execution_count": 168, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1 0 1 1 0 1]\n", "[-1 0 -1 1 0 1]\n" ] } ], "source": [ "x = np.array([-3, -2, -1, 1, 2, 3])\n", "y = 2\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Miscellaneous" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q27. If an element of x is smaller than 3, replace it with 3.\n", "And if an element of x is bigger than 7, replace it with 7." ] }, { "cell_type": "code", "execution_count": 174, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[3 3 3 3 4 5 6 7 7 7]\n" ] } ], "source": [ "x = np.arange(10)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q28. Compute the square of x, element-wise." ] }, { "cell_type": "code", "execution_count": 176, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1 4 1]\n" ] } ], "source": [ "x = np.array([1, 2, -1])\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q29. Compute square root of x element-wise.\n" ] }, { "cell_type": "code", "execution_count": 177, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 1. 2. 3.]\n" ] } ], "source": [ "x = np.array([1., 4., 9.])\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q30. Compute the absolute value of x." ] }, { "cell_type": "code", "execution_count": 178, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[1 1]\n", " [3 3]]\n" ] } ], "source": [ "x = np.array([[1, -1], [3, -3]])\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q31. Compute an element-wise indication of the sign of x, element-wise." ] }, { "cell_type": "code", "execution_count": 181, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 1 1 0 -1 -1]\n" ] } ], "source": [ "x = np.array([1, 3, 0, -1, -3])\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.6" } }, "nbformat": 4, "nbformat_minor": 0 } ================================================ FILE: 2.numpy/numpy_exercises/9_Mathematical_functions_solutions.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Mathematical functions" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import numpy as np" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "'1.11.2'" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.__version__" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [], "source": [ "__author__ = \"kyubyong. kbpark.linguist@gmail.com. https://github.com/kyubyong\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Trigonometric functions" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q1. Calculate sine, cosine, and tangent of x, element-wise." ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "sine: [ 0. 0.84147098 -0.98803162 0.89399666]\n", "cosine: [ 1. 0.54030231 0.15425145 -0.44807362]\n", "tangent: [ 0. 1.55740772 -6.4053312 -1.99520041]\n" ] } ], "source": [ "x = np.array([0., 1., 30, 90])\n", "print \"sine:\", np.sin(x)\n", "print \"cosine:\", np.cos(x)\n", "print \"tangent:\", np.tan(x)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q2. Calculate inverse sine, inverse cosine, and inverse tangent of x, element-wise." ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "inverse sine: [ 1.57079633 0. 1.57079633]\n", "inverse cosine: [ 0. 1.57079633 0. ]\n", "inverse tangent: [ 0.78539816 0. 0.78539816]\n" ] } ], "source": [ "x = np.array([-1., 0, 1.])\n", "print \"inverse sine:\", np.arcsin(x2)\n", "print \"inverse cosine:\", np.arccos(x2)\n", "print \"inverse tangent:\", np.arctan(x2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q3. Convert angles from radians to degrees." ] }, { "cell_type": "code", "execution_count": 45, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[-180. -90. 90. 180.]\n" ] } ], "source": [ "x = np.array([-np.pi, -np.pi/2, np.pi/2, np.pi])\n", "\n", "out1 = np.degrees(x)\n", "out2 = np.rad2deg(x)\n", "assert np.array_equiv(out1, out2)\n", "print out1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q4. Convert angles from degrees to radians." ] }, { "cell_type": "code", "execution_count": 48, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[-3.14159265 -1.57079633 1.57079633 3.14159265]\n" ] } ], "source": [ "x = np.array([-180., -90., 90., 180.])\n", "\n", "out1 = np.radians(x)\n", "out2 = np.deg2rad(x)\n", "assert np.array_equiv(out1, out2)\n", "print out1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Hyperbolic functions" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q5. Calculate hyperbolic sine, hyperbolic cosine, and hyperbolic tangent of x, element-wise." ] }, { "cell_type": "code", "execution_count": 65, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[-1.17520119 0. 1.17520119]\n", "[ 1.54308063 1. 1.54308063]\n", "[-0.76159416 0. 0.76159416]\n" ] } ], "source": [ "x = np.array([-1., 0, 1.])\n", "print np.sinh(x)\n", "print np.cosh(x)\n", "print np.tanh(x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Rounding" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q6. Predict the results of these, paying attention to the difference among the family functions." ] }, { "cell_type": "code", "execution_count": 84, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 2. 2. 2. 3. -2. -2. -3.]\n", "[ 2. 1. 2. 2. -3. -3. -3.]\n", "[ 3. 2. 3. 3. -2. -2. -2.]\n", "[ 2. 1. 2. 2. -2. -2. -2.]\n", "[2.0, 2.0, 3.0, 3.0, -2.0, -3.0, -3.0]\n" ] } ], "source": [ "x = np.array([2.1, 1.5, 2.5, 2.9, -2.1, -2.5, -2.9])\n", "\n", "out1 = np.around(x)\n", "out2 = np.floor(x)\n", "out3 = np.ceil(x)\n", "out4 = np.trunc(x)\n", "out5 = [round(elem) for elem in x]\n", "\n", "print out1\n", "print out2\n", "print out3\n", "print out4\n", "print out5\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q7. Implement out5 in the above question using numpy." ] }, { "cell_type": "code", "execution_count": 87, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 2. 2. 3. 3. -2. -3. -3.]\n" ] } ], "source": [ "print np.floor(np.abs(x) + 0.5) * np.sign(x) \n", "# Read http://numpy-discussion.10968.n7.nabble.com/why-numpy-round-get-a-different-result-from-python-round-function-td19098.html" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Sums, products, differences" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q8. Predict the results of these." ] }, { "cell_type": "code", "execution_count": 99, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "('->', 36)\n", "('->', array([ 6, 8, 10, 12]))\n", "('->', array([[10],\n", " [26]]))\n", "\n", "('->', 40320)\n", "('->', array([ 5, 12, 21, 32]))\n", "('->', array([[ 24],\n", " [1680]]))\n", "\n", "('->', array([ 1, 3, 6, 10, 15, 21, 28, 36]))\n", "('->', array([[ 1, 2, 3, 4],\n", " [ 6, 8, 10, 12]]))\n", "('->', array([[ 1, 3, 6, 10],\n", " [ 5, 11, 18, 26]]))\n", "\n", "('->', array([ 1, 2, 6, 24, 120, 720, 5040, 40320]))\n", "('->', array([[ 1, 2, 3, 4],\n", " [ 5, 12, 21, 32]]))\n", "('->', array([[ 1, 2, 6, 24],\n", " [ 5, 30, 210, 1680]]))\n", "\n", "('->', 1)\n", "('->', array([1, 2, 3, 4]))\n", "('->', array([[1],\n", " [5]]))\n", "\n", "('->', 8)\n", "('->', array([5, 6, 7, 8]))\n", "('->', array([[4],\n", " [8]]))\n", "\n", "('->', 4.5)\n", "('->', array([ 3., 4., 5., 6.]))\n", "('->', array([[ 2.5],\n", " [ 6.5]]))\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/usr/local/lib/python2.7/dist-packages/ipykernel/__main__.py:34: FutureWarning: elementwise comparison failed; returning scalar instead, but in the future will perform elementwise comparison\n" ] } ], "source": [ "x = np.array(\n", " [[1, 2, 3, 4],\n", " [5, 6, 7, 8]])\n", "\n", "outs = [np.sum(x),\n", " np.sum(x, axis=0),\n", " np.sum(x, axis=1, keepdims=True),\n", " \"\",\n", " np.prod(x),\n", " np.prod(x, axis=0),\n", " np.prod(x, axis=1, keepdims=True),\n", " \"\",\n", " np.cumsum(x),\n", " np.cumsum(x, axis=0),\n", " np.cumsum(x, axis=1),\n", " \"\",\n", " np.cumprod(x),\n", " np.cumprod(x, axis=0),\n", " np.cumprod(x, axis=1),\n", " \"\",\n", " np.min(x),\n", " np.min(x, axis=0),\n", " np.min(x, axis=1, keepdims=True),\n", " \"\",\n", " np.max(x),\n", " np.max(x, axis=0),\n", " np.max(x, axis=1, keepdims=True),\n", " \"\",\n", " np.mean(x),\n", " np.mean(x, axis=0),\n", " np.mean(x, axis=1, keepdims=True)]\n", " \n", "for out in outs:\n", " if out == \"\":\n", " print\n", " else:\n", " print(\"->\", out)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q9. Calculate the difference between neighboring elements, element-wise." ] }, { "cell_type": "code", "execution_count": 100, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 1 2 3 -7]\n" ] } ], "source": [ "x = np.array([1, 2, 4, 7, 0])\n", "print np.diff(x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q10. Calculate the difference between neighboring elements, element-wise, and\n", "prepend [0, 0] and append[100] to it." ] }, { "cell_type": "code", "execution_count": 108, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 0 0 1 2 3 -7 100]\n" ] } ], "source": [ "x = np.array([1, 2, 4, 7, 0])\n", "\n", "out1 = np.ediff1d(x, to_begin=[0, 0], to_end=[100])\n", "out2 = np.insert(np.append(np.diff(x), 100), 0, [0, 0])\n", "assert np.array_equiv(out1, out2)\n", "print out2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q11. Return the cross product of x and y." ] }, { "cell_type": "code", "execution_count": 110, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[-3 6 -3]\n" ] } ], "source": [ "x = np.array([1, 2, 3])\n", "y = np.array([4, 5, 6])\n", "\n", "print np.cross(x, y)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Exponents and logarithms" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q12. Compute $e^x$, element-wise." ] }, { "cell_type": "code", "execution_count": 115, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 2.71828175 7.38905621 20.08553696]\n" ] } ], "source": [ "x = np.array([1., 2., 3.], np.float32)\n", "\n", "out = np.exp(x)\n", "print out\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q13. Calculate exp(x) - 1 for all elements in x." ] }, { "cell_type": "code", "execution_count": 118, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 1.71828175 6.38905621 19.08553696]\n" ] } ], "source": [ "x = np.array([1., 2., 3.], np.float32)\n", "\n", "out1 = np.expm1(x)\n", "out2 = np.exp(x) - 1.\n", "assert np.allclose(out1, out2)\n", "print out1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q14. Calculate $2^p$ for all p in x." ] }, { "cell_type": "code", "execution_count": 124, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 2. 4. 8.]\n" ] } ], "source": [ "x = np.array([1., 2., 3.], np.float32)\n", "\n", "out1 = np.exp2(x)\n", "out2 = 2 ** x\n", "assert np.allclose(out1, out2)\n", "print out1\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q15. Compute natural, base 10, and base 2 logarithms of x element-wise." ] }, { "cell_type": "code", "execution_count": 128, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "natural log = [ 0. 1. 2.]\n", "common log = [ 0. 0.43429448 0.86858896]\n", "base 2 log = [ 0. 1.44269504 2.88539008]\n" ] } ], "source": [ "x = np.array([1, np.e, np.e**2])\n", "\n", "print \"natural log =\", np.log(x)\n", "print \"common log =\", np.log10(x)\n", "print \"base 2 log =\", np.log2(x)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q16. Compute the natural logarithm of one plus each element in x in floating-point accuracy." ] }, { "cell_type": "code", "execution_count": 131, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 1.00000000e-099 1.00000000e-100]\n" ] } ], "source": [ "x = np.array([1e-99, 1e-100])\n", "\n", "print np.log1p(x)\n", "# Compare it with np.log(1 +x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Floating point routines" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q17. Return element-wise True where signbit is set." ] }, { "cell_type": "code", "execution_count": 135, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ True True True False False False False]\n" ] } ], "source": [ "x = np.array([-3, -2, -1, 0, 1, 2, 3])\n", "\n", "out1 = np.signbit(x)\n", "out2 = x < 0\n", "assert np.array_equiv(out1, out2)\n", "print out1\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q18. Change the sign of x to that of y, element-wise." ] }, { "cell_type": "code", "execution_count": 140, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[-1. -0. -1.]\n" ] } ], "source": [ "x = np.array([-1, 0, 1])\n", "y = -1.1\n", "\n", "print np.copysign(x, y)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Arithmetic operations" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q19. Add x and y element-wise." ] }, { "cell_type": "code", "execution_count": 141, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0 0 0]\n" ] } ], "source": [ "x = np.array([1, 2, 3])\n", "y = np.array([-1, -2, -3])\n", "\n", "out1 = np.add(x, y)\n", "out2 = x + y\n", "assert np.array_equal(out1, out2)\n", "print out1\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q20. Subtract y from x element-wise." ] }, { "cell_type": "code", "execution_count": 142, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0 1 2]\n" ] } ], "source": [ "x = np.array([3, 4, 5])\n", "y = np.array(3)\n", "\n", "out1 = np.subtract(x, y)\n", "out2 = x - y \n", "assert np.array_equal(out1, out2)\n", "print out1\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q21. Multiply x by y element-wise." ] }, { "cell_type": "code", "execution_count": 144, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 3 0 -5]\n" ] } ], "source": [ "x = np.array([3, 4, 5])\n", "y = np.array([1, 0, -1])\n", "\n", "out1 = np.multiply(x, y)\n", "out2 = x * y \n", "assert np.array_equal(out1, out2)\n", "print out1\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q22. Divide x by y element-wise in two different ways." ] }, { "cell_type": "code", "execution_count": 161, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 3. 2. 1.66666667]\n", "[ 3. 2. 1.]\n" ] } ], "source": [ "x = np.array([3., 4., 5.])\n", "y = np.array([1., 2., 3.])\n", "\n", "out1 = np.true_divide(x, y)\n", "out2 = x / y \n", "assert np.array_equal(out1, out2)\n", "print out1\n", "\n", "out3 = np.floor_divide(x, y)\n", "out4 = x // y\n", "assert np.array_equal(out3, out4)\n", "print out3\n", "\n", "# Note that in Python 2 and 3, the handling of `divide` differs.\n", "# See https://docs.scipy.org/doc/numpy/reference/generated/numpy.divide.html#numpy.divide\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q23. Compute numerical negative value of x, element-wise." ] }, { "cell_type": "code", "execution_count": 146, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[-1 1]\n" ] } ], "source": [ "x = np.array([1, -1])\n", "\n", "out1 = np.negative(x)\n", "out2 = -x\n", "assert np.array_equal(out1, out2)\n", "print out1\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q24. Compute the reciprocal of x, element-wise." ] }, { "cell_type": "code", "execution_count": 155, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 1. 0.5 5. ]\n" ] } ], "source": [ "x = np.array([1., 2., .2])\n", "\n", "out1 = np.reciprocal(x)\n", "out2 = 1/x\n", "assert np.array_equal(out1, out2)\n", "print out1\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q25. Compute $x^y$, element-wise." ] }, { "cell_type": "code", "execution_count": 163, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[ 1 4]\n", " [ 3 16]]\n" ] } ], "source": [ "x = np.array([[1, 2], [3, 4]])\n", "y = np.array([[1, 2], [1, 2]])\n", "\n", "out = np.power(x, y)\n", "print out\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q26. Compute the remainder of x / y element-wise in two different ways." ] }, { "cell_type": "code", "execution_count": 168, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1 0 1 1 0 1]\n", "[-1 0 -1 1 0 1]\n" ] } ], "source": [ "x = np.array([-3, -2, -1, 1, 2, 3])\n", "y = 2\n", "\n", "out1 = np.mod(x, y)\n", "out2 = x % y\n", "assert np.array_equal(out1, out2)\n", "print out1\n", "\n", "out3 = np.fmod(x, y)\n", "print out3" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Miscellaneous" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q27. If an element of x is smaller than 3, replace it with 3.\n", "And if an element of x is bigger than 7, replace it with 7." ] }, { "cell_type": "code", "execution_count": 174, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[3 3 3 3 4 5 6 7 7 7]\n" ] } ], "source": [ "x = np.arange(10)\n", "\n", "out1 = np.clip(x, 3, 7)\n", "out2 = np.copy(x)\n", "out2[out2 < 3] = 3\n", "out2[out2 > 7] = 7\n", "\n", "assert np.array_equiv(out1, out2)\n", "print out1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q28. Compute the square of x, element-wise." ] }, { "cell_type": "code", "execution_count": 176, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1 4 1]\n" ] } ], "source": [ "x = np.array([1, 2, -1])\n", "\n", "out1 = np.square(x)\n", "out2 = x * x\n", "assert np.array_equal(out1, out2)\n", "print out1\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q29. Compute square root of x element-wise.\n" ] }, { "cell_type": "code", "execution_count": 177, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 1. 2. 3.]\n" ] } ], "source": [ "x = np.array([1., 4., 9.])\n", "\n", "out = np.sqrt(x)\n", "print out\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q30. Compute the absolute value of x." ] }, { "cell_type": "code", "execution_count": 178, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[1 1]\n", " [3 3]]\n" ] } ], "source": [ "x = np.array([[1, -1], [3, -3]])\n", "\n", "out = np.abs(x)\n", "print out\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Q31. Compute an element-wise indication of the sign of x, element-wise." ] }, { "cell_type": "code", "execution_count": 181, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 1 1 0 -1 -1]\n" ] } ], "source": [ "x = np.array([1, 3, 0, -1, -3])\n", "\n", "out1 = np.sign(x)\n", "out2 = np.copy(x)\n", "out2[out2 > 0] = 1\n", "out2[out2 < 0] = -1\n", "assert np.array_equal(out1, out2)\n", "print out1\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.6" } }, "nbformat": 4, "nbformat_minor": 0 } ================================================ FILE: 2.numpy/numpy_exercises/README.md ================================================ # NumPy 练习题 Numpy是一个用python实现的科学计算的扩展程序库,包括: 1、一个强大的N维数组对象Array; 2、比较成熟的(广播)函数库; 3、用于整合C/C++和Fortran代码的工具包; 4、实用的线性代数、傅里叶变换和随机数生成函数。numpy和稀疏矩阵运算包scipy配合使用更加方便。 NumPy(Numeric Python)提供了许多高级的数值编程工具,如:矩阵数据类型、矢量处理,以及精密的运算库。专为进行严格的数字处理而产生。多为很多大型金融公司使用,以及核心的科学计算组织如:Lawrence Livermore,NASA用其处理一些本来使用C++,Fortran或Matlab等所做的任务。 本文整理了一个Numpy的练习题,总结了Numpy的常用操作,可以测试下自己对Numpy的掌握程度,有答案哦。 ## 试题目录 * Array creation routines(数组创建) * Array manipulation routines(数组操作) * String operations(字符串操作) * Numpy-specific help functions(Numpy特定帮助函数) * Input and output(输入和输出) * Linear algebra(线性代数) * Discrete Fourier Transform(离散傅里叶变换) * Logic functions(逻辑函数) * Mathematical functions(数学函数) * Random sampling (numpy.random)(随机抽样) * Set routines(集合操作) * Sorting, searching, and counting(排序、搜索和计数) * Statistics(统计) ## 试题内容 试题分为13个练习,每个练习分为两个ipynb文件,文件名带`_Solutions` 的是带答案的文件,建议初学者先练习下不带答案的文件,做不出来再看看答案。 ## 作者及来源 - 作者: Kyubyong - 来源:https://github.com/Kyubyong/numpy_exercises ================================================ FILE: 3.pandas/1.10-Minutes-to-pandas/10 Minutes to pandas.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 十分钟入门pandas" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "#coding:utf8\n", "%matplotlib inline" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "这个一篇针对pandas新手的简短入门,想要了解更多复杂的内容,参阅[*Cookbook*](http://pandas.pydata.org/pandas-docs/stable/cookbook.html#cookbook)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "通常,我们首先要导入以下几个库:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 创建对象" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "通过传递一个list来创建**Series**,pandas会默认创建整型索引:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 1.0\n", "1 3.0\n", "2 5.0\n", "3 NaN\n", "4 6.0\n", "5 8.0\n", "dtype: float64" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s = pd.Series([1,3,5,np.nan,6,8])\n", "s" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "通过传递一个numpy array,日期索引以及列标签来创建一个**DataFrame**:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "DatetimeIndex(['2013-01-01', '2013-01-02', '2013-01-03', '2013-01-04',\n", " '2013-01-05', '2013-01-06'],\n", " dtype='datetime64[ns]', freq='D')" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dates = pd.date_range('20130101', periods=6)\n", "dates" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCD
2013-01-01-0.900524-0.302515-0.5417621.562916
2013-01-02-0.884117-0.6507410.2173450.268915
2013-01-030.2208220.7905270.6921720.723441
2013-01-041.2602761.0002970.809801-0.389713
2013-01-051.6793811.4686090.360648-0.240850
2013-01-060.5678670.2353521.117395-0.604326
\n", "
" ], "text/plain": [ " A B C D\n", "2013-01-01 -0.900524 -0.302515 -0.541762 1.562916\n", "2013-01-02 -0.884117 -0.650741 0.217345 0.268915\n", "2013-01-03 0.220822 0.790527 0.692172 0.723441\n", "2013-01-04 1.260276 1.000297 0.809801 -0.389713\n", "2013-01-05 1.679381 1.468609 0.360648 -0.240850\n", "2013-01-06 0.567867 0.235352 1.117395 -0.604326" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD'))\n", "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "通过传递一个能够被转换为类似series的dict对象来创建一个**DataFrame**:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCDEF
01.02013-01-021.03testfoo
11.02013-01-021.03trainfoo
21.02013-01-021.03testfoo
31.02013-01-021.03trainfoo
\n", "
" ], "text/plain": [ " A B C D E F\n", "0 1.0 2013-01-02 1.0 3 test foo\n", "1 1.0 2013-01-02 1.0 3 train foo\n", "2 1.0 2013-01-02 1.0 3 test foo\n", "3 1.0 2013-01-02 1.0 3 train foo" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df2 = pd.DataFrame({ 'A' : 1.,\n", " 'B' : pd.Timestamp('20130102'),\n", " 'C' : pd.Series(1,index=list(range(4)),dtype='float32'),\n", " 'D' : np.array([3]*4,dtype='int32'),\n", " 'E' : pd.Categorical([\"test\",\"train\",\"test\",\"train\"]),\n", " 'F' : 'foo' })\n", "df2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "可以看到各列的数据类型为:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "A float64\n", "B datetime64[ns]\n", "C float32\n", "D int32\n", "E category\n", "F object\n", "dtype: object" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df2.dtypes" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 查看数据" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "查看frame中头部和尾部的几行:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCD
2013-01-01-0.900524-0.302515-0.5417621.562916
2013-01-02-0.884117-0.6507410.2173450.268915
2013-01-030.2208220.7905270.6921720.723441
2013-01-041.2602761.0002970.809801-0.389713
2013-01-051.6793811.4686090.360648-0.240850
\n", "
" ], "text/plain": [ " A B C D\n", "2013-01-01 -0.900524 -0.302515 -0.541762 1.562916\n", "2013-01-02 -0.884117 -0.650741 0.217345 0.268915\n", "2013-01-03 0.220822 0.790527 0.692172 0.723441\n", "2013-01-04 1.260276 1.000297 0.809801 -0.389713\n", "2013-01-05 1.679381 1.468609 0.360648 -0.240850" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head()" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCD
2013-01-041.2602761.0002970.809801-0.389713
2013-01-051.6793811.4686090.360648-0.240850
2013-01-060.5678670.2353521.117395-0.604326
\n", "
" ], "text/plain": [ " A B C D\n", "2013-01-04 1.260276 1.000297 0.809801 -0.389713\n", "2013-01-05 1.679381 1.468609 0.360648 -0.240850\n", "2013-01-06 0.567867 0.235352 1.117395 -0.604326" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.tail(3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "显示索引、列名以及底层的numpy数据" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "DatetimeIndex(['2013-01-01', '2013-01-02', '2013-01-03', '2013-01-04',\n", " '2013-01-05', '2013-01-06'],\n", " dtype='datetime64[ns]', freq='D')" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.index" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Index(['A', 'B', 'C', 'D'], dtype='object')" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.columns" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[-0.90052384, -0.30251543, -0.54176245, 1.56291588],\n", " [-0.8841172 , -0.65074073, 0.21734508, 0.26891483],\n", " [ 0.22082238, 0.79052719, 0.69217223, 0.72344092],\n", " [ 1.2602764 , 1.0002968 , 0.80980141, -0.38971272],\n", " [ 1.67938067, 1.46860938, 0.36064787, -0.24084994],\n", " [ 0.56786654, 0.23535244, 1.117395 , -0.60432593]])" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.values" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "describe()能对数据做一个快速统计汇总" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCD
count6.0000006.0000006.0000006.000000
mean0.3239510.4235880.4426000.220064
std1.0717080.8094630.5794650.815219
min-0.900524-0.650741-0.541762-0.604326
25%-0.607882-0.1680480.253171-0.352497
50%0.3943440.5129400.5264100.014032
75%1.0871740.9478540.7803940.609809
max1.6793811.4686091.1173951.562916
\n", "
" ], "text/plain": [ " A B C D\n", "count 6.000000 6.000000 6.000000 6.000000\n", "mean 0.323951 0.423588 0.442600 0.220064\n", "std 1.071708 0.809463 0.579465 0.815219\n", "min -0.900524 -0.650741 -0.541762 -0.604326\n", "25% -0.607882 -0.168048 0.253171 -0.352497\n", "50% 0.394344 0.512940 0.526410 0.014032\n", "75% 1.087174 0.947854 0.780394 0.609809\n", "max 1.679381 1.468609 1.117395 1.562916" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.describe()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "对数据做转置:" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
2013-01-01 00:00:002013-01-02 00:00:002013-01-03 00:00:002013-01-04 00:00:002013-01-05 00:00:002013-01-06 00:00:00
A-0.900524-0.8841170.2208221.2602761.6793810.567867
B-0.302515-0.6507410.7905271.0002971.4686090.235352
C-0.5417620.2173450.6921720.8098010.3606481.117395
D1.5629160.2689150.723441-0.389713-0.240850-0.604326
\n", "
" ], "text/plain": [ " 2013-01-01 2013-01-02 2013-01-03 2013-01-04 2013-01-05 2013-01-06\n", "A -0.900524 -0.884117 0.220822 1.260276 1.679381 0.567867\n", "B -0.302515 -0.650741 0.790527 1.000297 1.468609 0.235352\n", "C -0.541762 0.217345 0.692172 0.809801 0.360648 1.117395\n", "D 1.562916 0.268915 0.723441 -0.389713 -0.240850 -0.604326" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.T" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "按轴进行排序:" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
DCBA
2013-01-011.562916-0.541762-0.302515-0.900524
2013-01-020.2689150.217345-0.650741-0.884117
2013-01-030.7234410.6921720.7905270.220822
2013-01-04-0.3897130.8098011.0002971.260276
2013-01-05-0.2408500.3606481.4686091.679381
2013-01-06-0.6043261.1173950.2353520.567867
\n", "
" ], "text/plain": [ " D C B A\n", "2013-01-01 1.562916 -0.541762 -0.302515 -0.900524\n", "2013-01-02 0.268915 0.217345 -0.650741 -0.884117\n", "2013-01-03 0.723441 0.692172 0.790527 0.220822\n", "2013-01-04 -0.389713 0.809801 1.000297 1.260276\n", "2013-01-05 -0.240850 0.360648 1.468609 1.679381\n", "2013-01-06 -0.604326 1.117395 0.235352 0.567867" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.sort_index(axis=1, ascending=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "按值进行排序 :" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCD
2013-01-02-0.884117-0.6507410.2173450.268915
2013-01-01-0.900524-0.302515-0.5417621.562916
2013-01-060.5678670.2353521.117395-0.604326
2013-01-030.2208220.7905270.6921720.723441
2013-01-041.2602761.0002970.809801-0.389713
2013-01-051.6793811.4686090.360648-0.240850
\n", "
" ], "text/plain": [ " A B C D\n", "2013-01-02 -0.884117 -0.650741 0.217345 0.268915\n", "2013-01-01 -0.900524 -0.302515 -0.541762 1.562916\n", "2013-01-06 0.567867 0.235352 1.117395 -0.604326\n", "2013-01-03 0.220822 0.790527 0.692172 0.723441\n", "2013-01-04 1.260276 1.000297 0.809801 -0.389713\n", "2013-01-05 1.679381 1.468609 0.360648 -0.240850" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.sort_values(by='B')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 数据选择" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "注意:虽然标准的Python/Numpy的表达式能完成选择与赋值等功能,但我们仍推荐使用优化过的pandas数据访问方法:.at,.iat,.loc,.iloc和.ix" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 选取" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "选择某一列数据,它会返回一个**Series**,等同于**df.A**:" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2013-01-01 -0.900524\n", "2013-01-02 -0.884117\n", "2013-01-03 0.220822\n", "2013-01-04 1.260276\n", "2013-01-05 1.679381\n", "2013-01-06 0.567867\n", "Freq: D, Name: A, dtype: float64" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['A']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "通过使用**[ ]**进行切片选取:" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCD
2013-01-01-0.900524-0.302515-0.5417621.562916
2013-01-02-0.884117-0.6507410.2173450.268915
2013-01-030.2208220.7905270.6921720.723441
\n", "
" ], "text/plain": [ " A B C D\n", "2013-01-01 -0.900524 -0.302515 -0.541762 1.562916\n", "2013-01-02 -0.884117 -0.650741 0.217345 0.268915\n", "2013-01-03 0.220822 0.790527 0.692172 0.723441" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[0:3]" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCD
2013-01-02-0.884117-0.6507410.2173450.268915
2013-01-030.2208220.7905270.6921720.723441
2013-01-041.2602761.0002970.809801-0.389713
\n", "
" ], "text/plain": [ " A B C D\n", "2013-01-02 -0.884117 -0.650741 0.217345 0.268915\n", "2013-01-03 0.220822 0.790527 0.692172 0.723441\n", "2013-01-04 1.260276 1.000297 0.809801 -0.389713" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['20130102':'20130104']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 通过标签选取" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "通过标签进行交叉选取:" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "A -0.900524\n", "B -0.302515\n", "C -0.541762\n", "D 1.562916\n", "Name: 2013-01-01 00:00:00, dtype: float64" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.loc[dates[0]]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "使用标签对多个轴进行选取" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AB
2013-01-01-0.900524-0.302515
2013-01-02-0.884117-0.650741
2013-01-030.2208220.790527
2013-01-041.2602761.000297
2013-01-051.6793811.468609
2013-01-060.5678670.235352
\n", "
" ], "text/plain": [ " A B\n", "2013-01-01 -0.900524 -0.302515\n", "2013-01-02 -0.884117 -0.650741\n", "2013-01-03 0.220822 0.790527\n", "2013-01-04 1.260276 1.000297\n", "2013-01-05 1.679381 1.468609\n", "2013-01-06 0.567867 0.235352" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.loc[:,['A','B']]" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AB
2013-01-01-0.900524-0.302515
2013-01-02-0.884117-0.650741
2013-01-030.2208220.790527
\n", "
" ], "text/plain": [ " A B\n", "2013-01-01 -0.900524 -0.302515\n", "2013-01-02 -0.884117 -0.650741\n", "2013-01-03 0.220822 0.790527" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.loc[:,['A','B']][:3]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "进行标签切片,包含两个端点" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AB
2013-01-02-0.884117-0.650741
2013-01-030.2208220.790527
2013-01-041.2602761.000297
\n", "
" ], "text/plain": [ " A B\n", "2013-01-02 -0.884117 -0.650741\n", "2013-01-03 0.220822 0.790527\n", "2013-01-04 1.260276 1.000297" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.loc['20130102':'20130104',['A','B']]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "对于返回的对象进行降维处理" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "A -0.884117\n", "B -0.650741\n", "Name: 2013-01-02 00:00:00, dtype: float64" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.loc['20130102',['A','B']]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "获取一个标量" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "-0.9005238449408509" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.loc[dates[0],'A']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "快速获取标量(与上面的方法等价)" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "-0.9005238449408509" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.at[dates[0],'A']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 通过位置选取" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "通过传递整型的位置进行选取" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "A 1.260276\n", "B 1.000297\n", "C 0.809801\n", "D -0.389713\n", "Name: 2013-01-04 00:00:00, dtype: float64" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.iloc[3]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "通过整型的位置切片进行选取,与python/numpy形式相同" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AB
2013-01-041.2602761.000297
2013-01-051.6793811.468609
\n", "
" ], "text/plain": [ " A B\n", "2013-01-04 1.260276 1.000297\n", "2013-01-05 1.679381 1.468609" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.iloc[3:5,0:2]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "只对行进行切片" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCD
2013-01-02-0.884117-0.6507410.2173450.268915
2013-01-030.2208220.7905270.6921720.723441
\n", "
" ], "text/plain": [ " A B C D\n", "2013-01-02 -0.884117 -0.650741 0.217345 0.268915\n", "2013-01-03 0.220822 0.790527 0.692172 0.723441" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.iloc[1:3,:]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "只对列进行切片" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
BC
2013-01-01-0.302515-0.541762
2013-01-02-0.6507410.217345
2013-01-030.7905270.692172
2013-01-041.0002970.809801
2013-01-051.4686090.360648
2013-01-060.2353521.117395
\n", "
" ], "text/plain": [ " B C\n", "2013-01-01 -0.302515 -0.541762\n", "2013-01-02 -0.650741 0.217345\n", "2013-01-03 0.790527 0.692172\n", "2013-01-04 1.000297 0.809801\n", "2013-01-05 1.468609 0.360648\n", "2013-01-06 0.235352 1.117395" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.iloc[:,1:3]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "只获取某个值" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "-0.6507407272837356" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.iloc[1,1]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "快速获取某个值(与上面的方法等价)" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "-0.6507407272837356" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.iat[1,1]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 布尔索引" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "用某列的值来选取数据" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCD
2013-01-030.2208220.7905270.6921720.723441
2013-01-041.2602761.0002970.809801-0.389713
2013-01-051.6793811.4686090.360648-0.240850
2013-01-060.5678670.2353521.117395-0.604326
\n", "
" ], "text/plain": [ " A B C D\n", "2013-01-03 0.220822 0.790527 0.692172 0.723441\n", "2013-01-04 1.260276 1.000297 0.809801 -0.389713\n", "2013-01-05 1.679381 1.468609 0.360648 -0.240850\n", "2013-01-06 0.567867 0.235352 1.117395 -0.604326" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[df.A > 0]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "用**where**操作来选取数据" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCD
2013-01-01NaNNaNNaN1.562916
2013-01-02NaNNaN0.2173450.268915
2013-01-030.2208220.7905270.6921720.723441
2013-01-041.2602761.0002970.809801NaN
2013-01-051.6793811.4686090.360648NaN
2013-01-060.5678670.2353521.117395NaN
\n", "
" ], "text/plain": [ " A B C D\n", "2013-01-01 NaN NaN NaN 1.562916\n", "2013-01-02 NaN NaN 0.217345 0.268915\n", "2013-01-03 0.220822 0.790527 0.692172 0.723441\n", "2013-01-04 1.260276 1.000297 0.809801 NaN\n", "2013-01-05 1.679381 1.468609 0.360648 NaN\n", "2013-01-06 0.567867 0.235352 1.117395 NaN" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[df > 0]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "用**isin()**方法来过滤数据" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [], "source": [ "df2 = df.copy()" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCDE
2013-01-01-0.900524-0.302515-0.5417621.562916one
2013-01-02-0.884117-0.6507410.2173450.268915one
2013-01-030.2208220.7905270.6921720.723441two
2013-01-041.2602761.0002970.809801-0.389713three
2013-01-051.6793811.4686090.360648-0.240850four
2013-01-060.5678670.2353521.117395-0.604326three
\n", "
" ], "text/plain": [ " A B C D E\n", "2013-01-01 -0.900524 -0.302515 -0.541762 1.562916 one\n", "2013-01-02 -0.884117 -0.650741 0.217345 0.268915 one\n", "2013-01-03 0.220822 0.790527 0.692172 0.723441 two\n", "2013-01-04 1.260276 1.000297 0.809801 -0.389713 three\n", "2013-01-05 1.679381 1.468609 0.360648 -0.240850 four\n", "2013-01-06 0.567867 0.235352 1.117395 -0.604326 three" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df2['E'] = ['one', 'one', 'two', 'three', 'four', 'three']\n", "df2" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCDE
2013-01-030.2208220.7905270.6921720.723441two
2013-01-051.6793811.4686090.360648-0.240850four
\n", "
" ], "text/plain": [ " A B C D E\n", "2013-01-03 0.220822 0.790527 0.692172 0.723441 two\n", "2013-01-05 1.679381 1.468609 0.360648 -0.240850 four" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df2[df2['E'].isin(['two', 'four'])]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 赋值" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "赋值一个新的列,通过索引来自动对齐数据" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2013-01-02 1\n", "2013-01-03 2\n", "2013-01-04 3\n", "2013-01-05 4\n", "2013-01-06 5\n", "2013-01-07 6\n", "Freq: D, dtype: int64" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s1 = pd.Series([1,2,3,4,5,6], index=pd.date_range('20130102',periods=6))\n", "s1" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCDF
2013-01-01-0.900524-0.302515-0.5417621.562916NaN
2013-01-02-0.884117-0.6507410.2173450.2689151.0
2013-01-030.2208220.7905270.6921720.7234412.0
2013-01-041.2602761.0002970.809801-0.3897133.0
2013-01-051.6793811.4686090.360648-0.2408504.0
2013-01-060.5678670.2353521.117395-0.6043265.0
\n", "
" ], "text/plain": [ " A B C D F\n", "2013-01-01 -0.900524 -0.302515 -0.541762 1.562916 NaN\n", "2013-01-02 -0.884117 -0.650741 0.217345 0.268915 1.0\n", "2013-01-03 0.220822 0.790527 0.692172 0.723441 2.0\n", "2013-01-04 1.260276 1.000297 0.809801 -0.389713 3.0\n", "2013-01-05 1.679381 1.468609 0.360648 -0.240850 4.0\n", "2013-01-06 0.567867 0.235352 1.117395 -0.604326 5.0" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['F'] = s1\n", "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "通过标签赋值" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCDF
2013-01-010.000000-0.302515-0.5417621.562916NaN
2013-01-02-0.884117-0.6507410.2173450.2689151.0
2013-01-030.2208220.7905270.6921720.7234412.0
2013-01-041.2602761.0002970.809801-0.3897133.0
2013-01-051.6793811.4686090.360648-0.2408504.0
2013-01-060.5678670.2353521.117395-0.6043265.0
\n", "
" ], "text/plain": [ " A B C D F\n", "2013-01-01 0.000000 -0.302515 -0.541762 1.562916 NaN\n", "2013-01-02 -0.884117 -0.650741 0.217345 0.268915 1.0\n", "2013-01-03 0.220822 0.790527 0.692172 0.723441 2.0\n", "2013-01-04 1.260276 1.000297 0.809801 -0.389713 3.0\n", "2013-01-05 1.679381 1.468609 0.360648 -0.240850 4.0\n", "2013-01-06 0.567867 0.235352 1.117395 -0.604326 5.0" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.at[dates[0], 'A'] = 0\n", "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "通过位置赋值" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCDF
2013-01-010.0000000.000000-0.5417621.562916NaN
2013-01-02-0.884117-0.6507410.2173450.2689151.0
2013-01-030.2208220.7905270.6921720.7234412.0
2013-01-041.2602761.0002970.809801-0.3897133.0
2013-01-051.6793811.4686090.360648-0.2408504.0
2013-01-060.5678670.2353521.117395-0.6043265.0
\n", "
" ], "text/plain": [ " A B C D F\n", "2013-01-01 0.000000 0.000000 -0.541762 1.562916 NaN\n", "2013-01-02 -0.884117 -0.650741 0.217345 0.268915 1.0\n", "2013-01-03 0.220822 0.790527 0.692172 0.723441 2.0\n", "2013-01-04 1.260276 1.000297 0.809801 -0.389713 3.0\n", "2013-01-05 1.679381 1.468609 0.360648 -0.240850 4.0\n", "2013-01-06 0.567867 0.235352 1.117395 -0.604326 5.0" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.iat[0,1] = 0\n", "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "通过传递numpy array赋值" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCDF
2013-01-010.0000000.000000-0.5417625NaN
2013-01-02-0.884117-0.6507410.21734551.0
2013-01-030.2208220.7905270.69217252.0
2013-01-041.2602761.0002970.80980153.0
2013-01-051.6793811.4686090.36064854.0
2013-01-060.5678670.2353521.11739555.0
\n", "
" ], "text/plain": [ " A B C D F\n", "2013-01-01 0.000000 0.000000 -0.541762 5 NaN\n", "2013-01-02 -0.884117 -0.650741 0.217345 5 1.0\n", "2013-01-03 0.220822 0.790527 0.692172 5 2.0\n", "2013-01-04 1.260276 1.000297 0.809801 5 3.0\n", "2013-01-05 1.679381 1.468609 0.360648 5 4.0\n", "2013-01-06 0.567867 0.235352 1.117395 5 5.0" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.loc[:,'D'] = np.array([5] * len(df))\n", "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "通过**where**操作来赋值" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCDF
2013-01-010.0000000.000000-0.541762-5NaN
2013-01-02-0.884117-0.650741-0.217345-5-1.0
2013-01-03-0.220822-0.790527-0.692172-5-2.0
2013-01-04-1.260276-1.000297-0.809801-5-3.0
2013-01-05-1.679381-1.468609-0.360648-5-4.0
2013-01-06-0.567867-0.235352-1.117395-5-5.0
\n", "
" ], "text/plain": [ " A B C D F\n", "2013-01-01 0.000000 0.000000 -0.541762 -5 NaN\n", "2013-01-02 -0.884117 -0.650741 -0.217345 -5 -1.0\n", "2013-01-03 -0.220822 -0.790527 -0.692172 -5 -2.0\n", "2013-01-04 -1.260276 -1.000297 -0.809801 -5 -3.0\n", "2013-01-05 -1.679381 -1.468609 -0.360648 -5 -4.0\n", "2013-01-06 -0.567867 -0.235352 -1.117395 -5 -5.0" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df2 = df.copy()\n", "df2[df2 > 0] = -df2\n", "df2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 缺失值处理" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "在pandas中,用**np.nan**来代表缺失值,这些值默认不会参与运算。\n", "\n", "reindex()允许你修改、增加、删除指定轴上的索引,并返回一个数据副本。" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCDFE
2013-01-010.0000000.000000-0.5417625NaN1.0
2013-01-02-0.884117-0.6507410.21734551.01.0
2013-01-030.2208220.7905270.69217252.0NaN
2013-01-041.2602761.0002970.80980153.0NaN
\n", "
" ], "text/plain": [ " A B C D F E\n", "2013-01-01 0.000000 0.000000 -0.541762 5 NaN 1.0\n", "2013-01-02 -0.884117 -0.650741 0.217345 5 1.0 1.0\n", "2013-01-03 0.220822 0.790527 0.692172 5 2.0 NaN\n", "2013-01-04 1.260276 1.000297 0.809801 5 3.0 NaN" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df1 = df.reindex(index=dates[0:4], columns=list(df.columns)+['E'])\n", "df1.loc[dates[0]:dates[1],'E'] = 1\n", "df1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "剔除所有包含缺失值的行数据" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCDFE
2013-01-02-0.884117-0.6507410.21734551.01.0
\n", "
" ], "text/plain": [ " A B C D F E\n", "2013-01-02 -0.884117 -0.650741 0.217345 5 1.0 1.0" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df1.dropna(how='any')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "填充缺失值" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCDFE
2013-01-010.0000000.000000-0.54176255.01.0
2013-01-02-0.884117-0.6507410.21734551.01.0
2013-01-030.2208220.7905270.69217252.05.0
2013-01-041.2602761.0002970.80980153.05.0
\n", "
" ], "text/plain": [ " A B C D F E\n", "2013-01-01 0.000000 0.000000 -0.541762 5 5.0 1.0\n", "2013-01-02 -0.884117 -0.650741 0.217345 5 1.0 1.0\n", "2013-01-03 0.220822 0.790527 0.692172 5 2.0 5.0\n", "2013-01-04 1.260276 1.000297 0.809801 5 3.0 5.0" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df1.fillna(value=5)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "获取值是否为**nan**的布尔标记" ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCDFE
2013-01-01FalseFalseFalseFalseTrueFalse
2013-01-02FalseFalseFalseFalseFalseFalse
2013-01-03FalseFalseFalseFalseFalseTrue
2013-01-04FalseFalseFalseFalseFalseTrue
\n", "
" ], "text/plain": [ " A B C D F E\n", "2013-01-01 False False False False True False\n", "2013-01-02 False False False False False False\n", "2013-01-03 False False False False False True\n", "2013-01-04 False False False False False True" ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.isnull(df1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 运算" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 统计" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "运算过程中,通常不包含缺失值。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "进行描述性统计" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "A 0.474038\n", "B 0.474008\n", "C 0.442600\n", "D 5.000000\n", "F 3.000000\n", "dtype: float64" ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.mean()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "对其他轴进行同样的运算" ] }, { "cell_type": "code", "execution_count": 49, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "2013-01-01 1.114559\n", "2013-01-02 0.936497\n", "2013-01-03 1.740704\n", "2013-01-04 2.214075\n", "2013-01-05 2.501728\n", "2013-01-06 2.384123\n", "Freq: D, dtype: float64" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.mean(1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "对于拥有不同维度的对象进行运算时需要对齐。除此之外,pandas会自动沿着指定维度计算。" ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2013-01-01 NaN\n", "2013-01-02 NaN\n", "2013-01-03 1.0\n", "2013-01-04 3.0\n", "2013-01-05 5.0\n", "2013-01-06 NaN\n", "Freq: D, dtype: float64" ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s = pd.Series([1,3,5,np.nan,6,8], index=dates).shift(2)\n", "s" ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCDF
2013-01-01NaNNaNNaNNaNNaN
2013-01-02NaNNaNNaNNaNNaN
2013-01-03-0.779178-0.209473-0.3078284.01.0
2013-01-04-1.739724-1.999703-2.1901992.00.0
2013-01-05-3.320619-3.531391-4.6393520.0-1.0
2013-01-06NaNNaNNaNNaNNaN
\n", "
" ], "text/plain": [ " A B C D F\n", "2013-01-01 NaN NaN NaN NaN NaN\n", "2013-01-02 NaN NaN NaN NaN NaN\n", "2013-01-03 -0.779178 -0.209473 -0.307828 4.0 1.0\n", "2013-01-04 -1.739724 -1.999703 -2.190199 2.0 0.0\n", "2013-01-05 -3.320619 -3.531391 -4.639352 0.0 -1.0\n", "2013-01-06 NaN NaN NaN NaN NaN" ] }, "execution_count": 51, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.sub(s, axis='index')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Apply 函数作用" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "通过apply()对函数作用" ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCDF
2013-01-010.0000000.000000-0.5417625NaN
2013-01-02-0.884117-0.650741-0.324417101.0
2013-01-03-0.6632950.1397860.367755153.0
2013-01-040.5969821.1400831.177556206.0
2013-01-052.2763622.6086931.5382042510.0
2013-01-062.8442292.8440452.6555993015.0
\n", "
" ], "text/plain": [ " A B C D F\n", "2013-01-01 0.000000 0.000000 -0.541762 5 NaN\n", "2013-01-02 -0.884117 -0.650741 -0.324417 10 1.0\n", "2013-01-03 -0.663295 0.139786 0.367755 15 3.0\n", "2013-01-04 0.596982 1.140083 1.177556 20 6.0\n", "2013-01-05 2.276362 2.608693 1.538204 25 10.0\n", "2013-01-06 2.844229 2.844045 2.655599 30 15.0" ] }, "execution_count": 52, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.apply(np.cumsum)" ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "A 2.563498\n", "B 2.119350\n", "C 1.659157\n", "D 0.000000\n", "F 4.000000\n", "dtype: float64" ] }, "execution_count": 53, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.apply(lambda x:x.max()-x.min())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 频数统计" ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 2\n", "1 0\n", "2 5\n", "3 1\n", "4 6\n", "5 1\n", "6 1\n", "7 1\n", "8 5\n", "9 4\n", "dtype: int32" ] }, "execution_count": 54, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s = pd.Series(np.random.randint(0, 7, size=10))\n", "s" ] }, { "cell_type": "code", "execution_count": 55, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1 4\n", "5 2\n", "6 1\n", "4 1\n", "2 1\n", "0 1\n", "dtype: int64" ] }, "execution_count": 55, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s.value_counts()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 字符串方法" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "对于Series对象,在其str属性中有着一系列的字符串处理方法。就如同下段代码一样,能很方便的对array中各个元素进行运算。值得注意的是,在str属性中的模式匹配默认使用正则表达式。" ] }, { "cell_type": "code", "execution_count": 56, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 a\n", "1 b\n", "2 c\n", "3 aaba\n", "4 baca\n", "5 NaN\n", "6 caba\n", "7 dog\n", "8 cat\n", "dtype: object" ] }, "execution_count": 56, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s = pd.Series(['A', 'B', 'C', 'Aaba', 'Baca', np.nan, 'CABA', 'dog', 'cat'])\n", "s.str.lower()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 合并" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Concat 连接" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "pandas中提供了大量的方法能够轻松对Series,DataFrame和Panel对象进行不同满足逻辑关系的合并操作" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "通过**concat()**来连接pandas对象" ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
0123
01.5606902.2534791.7285861.224112
1-1.237557-1.571768-1.687004-0.226474
2-0.591146-0.0546440.6008060.076132
3-0.5676780.426496-0.9724870.200211
4-2.073311-1.566767-0.5336021.366468
52.2447671.6122321.934717-0.403805
6-2.6409170.6405491.2572380.043773
71.5454051.771884-0.2736872.441483
8-0.4404760.5675362.3790721.152354
9-0.047853-0.440427-1.3823890.647217
\n", "
" ], "text/plain": [ " 0 1 2 3\n", "0 1.560690 2.253479 1.728586 1.224112\n", "1 -1.237557 -1.571768 -1.687004 -0.226474\n", "2 -0.591146 -0.054644 0.600806 0.076132\n", "3 -0.567678 0.426496 -0.972487 0.200211\n", "4 -2.073311 -1.566767 -0.533602 1.366468\n", "5 2.244767 1.612232 1.934717 -0.403805\n", "6 -2.640917 0.640549 1.257238 0.043773\n", "7 1.545405 1.771884 -0.273687 2.441483\n", "8 -0.440476 0.567536 2.379072 1.152354\n", "9 -0.047853 -0.440427 -1.382389 0.647217" ] }, "execution_count": 57, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.DataFrame(np.random.randn(10,4))\n", "df" ] }, { "cell_type": "code", "execution_count": 58, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[ 0 1 2 3\n", " 0 1.560690 2.253479 1.728586 1.224112\n", " 1 -1.237557 -1.571768 -1.687004 -0.226474\n", " 2 -0.591146 -0.054644 0.600806 0.076132,\n", " 0 1 2 3\n", " 3 -0.567678 0.426496 -0.972487 0.200211\n", " 4 -2.073311 -1.566767 -0.533602 1.366468\n", " 5 2.244767 1.612232 1.934717 -0.403805\n", " 6 -2.640917 0.640549 1.257238 0.043773,\n", " 0 1 2 3\n", " 7 1.545405 1.771884 -0.273687 2.441483\n", " 8 -0.440476 0.567536 2.379072 1.152354\n", " 9 -0.047853 -0.440427 -1.382389 0.647217]" ] }, "execution_count": 58, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#break it into pieces\n", "pieces = [df[:3], df[3:7], df[7:]]\n", "pieces" ] }, { "cell_type": "code", "execution_count": 59, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
0123
01.5606902.2534791.7285861.224112
1-1.237557-1.571768-1.687004-0.226474
2-0.591146-0.0546440.6008060.076132
3-0.5676780.426496-0.9724870.200211
4-2.073311-1.566767-0.5336021.366468
52.2447671.6122321.934717-0.403805
6-2.6409170.6405491.2572380.043773
71.5454051.771884-0.2736872.441483
8-0.4404760.5675362.3790721.152354
9-0.047853-0.440427-1.3823890.647217
\n", "
" ], "text/plain": [ " 0 1 2 3\n", "0 1.560690 2.253479 1.728586 1.224112\n", "1 -1.237557 -1.571768 -1.687004 -0.226474\n", "2 -0.591146 -0.054644 0.600806 0.076132\n", "3 -0.567678 0.426496 -0.972487 0.200211\n", "4 -2.073311 -1.566767 -0.533602 1.366468\n", "5 2.244767 1.612232 1.934717 -0.403805\n", "6 -2.640917 0.640549 1.257238 0.043773\n", "7 1.545405 1.771884 -0.273687 2.441483\n", "8 -0.440476 0.567536 2.379072 1.152354\n", "9 -0.047853 -0.440427 -1.382389 0.647217" ] }, "execution_count": 59, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.concat(pieces)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Join 合并" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "类似于SQL中的合并(merge)" ] }, { "cell_type": "code", "execution_count": 60, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
keylval
0foo1
1foo2
\n", "
" ], "text/plain": [ " key lval\n", "0 foo 1\n", "1 foo 2" ] }, "execution_count": 60, "metadata": {}, "output_type": "execute_result" } ], "source": [ "left = pd.DataFrame({'key':['foo', 'foo'], 'lval':[1,2]})\n", "left" ] }, { "cell_type": "code", "execution_count": 61, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
keylval
0foo4
1foo5
\n", "
" ], "text/plain": [ " key lval\n", "0 foo 4\n", "1 foo 5" ] }, "execution_count": 61, "metadata": {}, "output_type": "execute_result" } ], "source": [ "right = pd.DataFrame({'key':['foo', 'foo'], 'lval':[4,5]})\n", "right" ] }, { "cell_type": "code", "execution_count": 62, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
keylval_xlval_y
0foo14
1foo15
2foo24
3foo25
\n", "
" ], "text/plain": [ " key lval_x lval_y\n", "0 foo 1 4\n", "1 foo 1 5\n", "2 foo 2 4\n", "3 foo 2 5" ] }, "execution_count": 62, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.merge(left, right, on='key')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Append 添加" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "将若干行添加到dataFrame后面" ] }, { "cell_type": "code", "execution_count": 63, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCD
00.415810-1.106857-0.6879202.422911
10.696149-1.2359750.2014091.424596
2-0.5406220.121096-0.861667-0.171690
30.1639041.324567-0.768324-0.205520
4-1.581152-0.0790610.251810-0.195755
51.2542461.6045560.766464-1.090743
60.6086091.000765-0.4079800.034970
7-3.1119142.1633440.619885-0.705518
\n", "
" ], "text/plain": [ " A B C D\n", "0 0.415810 -1.106857 -0.687920 2.422911\n", "1 0.696149 -1.235975 0.201409 1.424596\n", "2 -0.540622 0.121096 -0.861667 -0.171690\n", "3 0.163904 1.324567 -0.768324 -0.205520\n", "4 -1.581152 -0.079061 0.251810 -0.195755\n", "5 1.254246 1.604556 0.766464 -1.090743\n", "6 0.608609 1.000765 -0.407980 0.034970\n", "7 -3.111914 2.163344 0.619885 -0.705518" ] }, "execution_count": 63, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.DataFrame(np.random.randn(8, 4), columns=['A', 'B', 'C', 'D'])\n", "df" ] }, { "cell_type": "code", "execution_count": 64, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "A 0.163904\n", "B 1.324567\n", "C -0.768324\n", "D -0.205520\n", "Name: 3, dtype: float64" ] }, "execution_count": 64, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s = df.iloc[3]\n", "s" ] }, { "cell_type": "code", "execution_count": 65, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCD
00.415810-1.106857-0.6879202.422911
10.696149-1.2359750.2014091.424596
2-0.5406220.121096-0.861667-0.171690
30.1639041.324567-0.768324-0.205520
4-1.581152-0.0790610.251810-0.195755
51.2542461.6045560.766464-1.090743
60.6086091.000765-0.4079800.034970
7-3.1119142.1633440.619885-0.705518
80.1639041.324567-0.768324-0.205520
\n", "
" ], "text/plain": [ " A B C D\n", "0 0.415810 -1.106857 -0.687920 2.422911\n", "1 0.696149 -1.235975 0.201409 1.424596\n", "2 -0.540622 0.121096 -0.861667 -0.171690\n", "3 0.163904 1.324567 -0.768324 -0.205520\n", "4 -1.581152 -0.079061 0.251810 -0.195755\n", "5 1.254246 1.604556 0.766464 -1.090743\n", "6 0.608609 1.000765 -0.407980 0.034970\n", "7 -3.111914 2.163344 0.619885 -0.705518\n", "8 0.163904 1.324567 -0.768324 -0.205520" ] }, "execution_count": 65, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.append(s, ignore_index=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 分组" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "对于“group by”操作,我们通常是指以下一个或几个步骤:\n", "* **划分** 按照某些标准将数据分为不同的组\n", "* **应用** 对每组数据分别执行一个函数\n", "* **组合** 将结果组合到一个数据结构" ] }, { "cell_type": "code", "execution_count": 66, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCD
0fooone0.1906630.589384
1barone1.0563310.035044
2footwo0.7236450.372672
3barthree-1.3068690.435296
4footwo0.673661-1.292242
5bartwo-0.8237280.837556
6fooone0.6385732.453041
7barthree0.5089220.578740
\n", "
" ], "text/plain": [ " A B C D\n", "0 foo one 0.190663 0.589384\n", "1 bar one 1.056331 0.035044\n", "2 foo two 0.723645 0.372672\n", "3 bar three -1.306869 0.435296\n", "4 foo two 0.673661 -1.292242\n", "5 bar two -0.823728 0.837556\n", "6 foo one 0.638573 2.453041\n", "7 bar three 0.508922 0.578740" ] }, "execution_count": 66, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar', \n", " 'foo', 'bar', 'foo', 'bar'],\n", " 'B' : ['one', 'one', 'two', 'three', \n", " 'two', 'two', 'one', 'three'],\n", " 'C' : np.random.randn(8),\n", " 'D' : np.random.randn(8)})\n", "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "分组并对每个分组应用sum函数" ] }, { "cell_type": "code", "execution_count": 67, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
CD
A
bar-0.5653441.886637
foo2.2265422.122855
\n", "
" ], "text/plain": [ " C D\n", "A \n", "bar -0.565344 1.886637\n", "foo 2.226542 2.122855" ] }, "execution_count": 67, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.groupby('A').sum()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "按多个列分组形成层级索引,然后应用函数" ] }, { "cell_type": "code", "execution_count": 68, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
CD
AB
barone1.0563310.035044
three-0.7979471.014036
two-0.8237280.837556
fooone0.8292363.042425
two1.397306-0.919570
\n", "
" ], "text/plain": [ " C D\n", "A B \n", "bar one 1.056331 0.035044\n", " three -0.797947 1.014036\n", " two -0.823728 0.837556\n", "foo one 0.829236 3.042425\n", " two 1.397306 -0.919570" ] }, "execution_count": 68, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.groupby(['A','B']).sum()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 变形" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 堆叠" ] }, { "cell_type": "code", "execution_count": 69, "metadata": {}, "outputs": [], "source": [ "tuples = list(zip(*[['bar', 'bar', 'baz', 'baz',\n", " 'foo', 'foo', 'qux', 'qux'],\n", " ['one', 'two', 'one', 'two',\n", " 'one', 'two', 'one', 'two']]))" ] }, { "cell_type": "code", "execution_count": 70, "metadata": {}, "outputs": [], "source": [ "index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second'])" ] }, { "cell_type": "code", "execution_count": 71, "metadata": {}, "outputs": [], "source": [ "df = pd.DataFrame(np.random.randn(8, 2), index=index, columns=['A', 'B'])" ] }, { "cell_type": "code", "execution_count": 72, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AB
firstsecond
barone-0.5518940.358046
two-0.773283-0.489393
bazone-0.461588-1.561085
two2.304456-0.241811
\n", "
" ], "text/plain": [ " A B\n", "first second \n", "bar one -0.551894 0.358046\n", " two -0.773283 -0.489393\n", "baz one -0.461588 -1.561085\n", " two 2.304456 -0.241811" ] }, "execution_count": 72, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df2 = df[:4]\n", "df2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**stack()**方法对DataFrame的列“压缩”一个层级" ] }, { "cell_type": "code", "execution_count": 73, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "first second \n", "bar one A -0.551894\n", " B 0.358046\n", " two A -0.773283\n", " B -0.489393\n", "baz one A -0.461588\n", " B -1.561085\n", " two A 2.304456\n", " B -0.241811\n", "dtype: float64" ] }, "execution_count": 73, "metadata": {}, "output_type": "execute_result" } ], "source": [ "stacked = df2.stack()\n", "stacked" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "对于一个“堆叠过的”DataFrame或者Series(拥有MultiIndex作为索引),**stack()**的逆操作是**unstack()**,默认反堆叠到上一个层级" ] }, { "cell_type": "code", "execution_count": 74, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AB
firstsecond
barone-0.5518940.358046
two-0.773283-0.489393
bazone-0.461588-1.561085
two2.304456-0.241811
\n", "
" ], "text/plain": [ " A B\n", "first second \n", "bar one -0.551894 0.358046\n", " two -0.773283 -0.489393\n", "baz one -0.461588 -1.561085\n", " two 2.304456 -0.241811" ] }, "execution_count": 74, "metadata": {}, "output_type": "execute_result" } ], "source": [ "stacked.unstack()" ] }, { "cell_type": "code", "execution_count": 75, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
secondonetwo
first
barA-0.551894-0.773283
B0.358046-0.489393
bazA-0.4615882.304456
B-1.561085-0.241811
\n", "
" ], "text/plain": [ "second one two\n", "first \n", "bar A -0.551894 -0.773283\n", " B 0.358046 -0.489393\n", "baz A -0.461588 2.304456\n", " B -1.561085 -0.241811" ] }, "execution_count": 75, "metadata": {}, "output_type": "execute_result" } ], "source": [ "stacked.unstack(1)" ] }, { "cell_type": "code", "execution_count": 76, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
firstbarbaz
second
oneA-0.551894-0.461588
B0.358046-1.561085
twoA-0.7732832.304456
B-0.489393-0.241811
\n", "
" ], "text/plain": [ "first bar baz\n", "second \n", "one A -0.551894 -0.461588\n", " B 0.358046 -1.561085\n", "two A -0.773283 2.304456\n", " B -0.489393 -0.241811" ] }, "execution_count": 76, "metadata": {}, "output_type": "execute_result" } ], "source": [ "stacked.unstack(0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 数据透视表" ] }, { "cell_type": "code", "execution_count": 77, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCDE
0oneAfoo-0.169373-1.070179
1oneBfoo-0.484603-1.627113
2twoCfoo-1.2892070.635274
3threeAbar0.034032-0.553259
4oneBbar0.536531-0.088784
5oneCbar-0.977931-0.211193
6twoAfoo1.486196-0.377266
7threeBfoo-1.1087250.050407
8oneCfoo0.562988-0.195356
9oneAbar0.510381-2.050069
10twoBbar0.0056970.708523
11threeCbar0.9422760.769442
\n", "
" ], "text/plain": [ " A B C D E\n", "0 one A foo -0.169373 -1.070179\n", "1 one B foo -0.484603 -1.627113\n", "2 two C foo -1.289207 0.635274\n", "3 three A bar 0.034032 -0.553259\n", "4 one B bar 0.536531 -0.088784\n", "5 one C bar -0.977931 -0.211193\n", "6 two A foo 1.486196 -0.377266\n", "7 three B foo -1.108725 0.050407\n", "8 one C foo 0.562988 -0.195356\n", "9 one A bar 0.510381 -2.050069\n", "10 two B bar 0.005697 0.708523\n", "11 three C bar 0.942276 0.769442" ] }, "execution_count": 77, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.DataFrame({'A' : ['one', 'one', 'two', 'three'] * 3,\n", " 'B' : ['A', 'B', 'C'] * 4,\n", " 'C' : ['foo', 'foo', 'foo', 'bar', 'bar', 'bar'] * 2,\n", " 'D' : np.random.randn(12),\n", " 'E' : np.random.randn(12)})\n", "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " 我们可以轻松地从这个数据得到透视表" ] }, { "cell_type": "code", "execution_count": 78, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Cbarfoo
AB
oneA0.510381-0.169373
B0.536531-0.484603
C-0.9779310.562988
threeA0.034032NaN
BNaN-1.108725
C0.942276NaN
twoANaN1.486196
B0.005697NaN
CNaN-1.289207
\n", "
" ], "text/plain": [ "C bar foo\n", "A B \n", "one A 0.510381 -0.169373\n", " B 0.536531 -0.484603\n", " C -0.977931 0.562988\n", "three A 0.034032 NaN\n", " B NaN -1.108725\n", " C 0.942276 NaN\n", "two A NaN 1.486196\n", " B 0.005697 NaN\n", " C NaN -1.289207" ] }, "execution_count": 78, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.pivot_table(df, values='D', index=['A', 'B'], columns=['C'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 时间序列" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "pandas在对频率转换进行重新采样时拥有着简单,强大而且高效的功能(例如把按秒采样的数据转换为按5分钟采样的数据)。这在金融领域很常见,但又不限于此。" ] }, { "cell_type": "code", "execution_count": 79, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "DatetimeIndex(['2012-01-01 00:00:00', '2012-01-01 00:00:01',\n", " '2012-01-01 00:00:02', '2012-01-01 00:00:03',\n", " '2012-01-01 00:00:04', '2012-01-01 00:00:05',\n", " '2012-01-01 00:00:06', '2012-01-01 00:00:07',\n", " '2012-01-01 00:00:08', '2012-01-01 00:00:09',\n", " '2012-01-01 00:00:10', '2012-01-01 00:00:11',\n", " '2012-01-01 00:00:12', '2012-01-01 00:00:13',\n", " '2012-01-01 00:00:14', '2012-01-01 00:00:15',\n", " '2012-01-01 00:00:16', '2012-01-01 00:00:17',\n", " '2012-01-01 00:00:18', '2012-01-01 00:00:19',\n", " '2012-01-01 00:00:20', '2012-01-01 00:00:21',\n", " '2012-01-01 00:00:22', '2012-01-01 00:00:23',\n", " '2012-01-01 00:00:24', '2012-01-01 00:00:25',\n", " '2012-01-01 00:00:26', '2012-01-01 00:00:27',\n", " '2012-01-01 00:00:28', '2012-01-01 00:00:29',\n", " '2012-01-01 00:00:30', '2012-01-01 00:00:31',\n", " '2012-01-01 00:00:32', '2012-01-01 00:00:33',\n", " '2012-01-01 00:00:34', '2012-01-01 00:00:35',\n", " '2012-01-01 00:00:36', '2012-01-01 00:00:37',\n", " '2012-01-01 00:00:38', '2012-01-01 00:00:39',\n", " '2012-01-01 00:00:40', '2012-01-01 00:00:41',\n", " '2012-01-01 00:00:42', '2012-01-01 00:00:43',\n", " '2012-01-01 00:00:44', '2012-01-01 00:00:45',\n", " '2012-01-01 00:00:46', '2012-01-01 00:00:47',\n", " '2012-01-01 00:00:48', '2012-01-01 00:00:49',\n", " '2012-01-01 00:00:50', '2012-01-01 00:00:51',\n", " '2012-01-01 00:00:52', '2012-01-01 00:00:53',\n", " '2012-01-01 00:00:54', '2012-01-01 00:00:55',\n", " '2012-01-01 00:00:56', '2012-01-01 00:00:57',\n", " '2012-01-01 00:00:58', '2012-01-01 00:00:59',\n", " '2012-01-01 00:01:00', '2012-01-01 00:01:01',\n", " '2012-01-01 00:01:02', '2012-01-01 00:01:03',\n", " '2012-01-01 00:01:04', '2012-01-01 00:01:05',\n", " '2012-01-01 00:01:06', '2012-01-01 00:01:07',\n", " '2012-01-01 00:01:08', '2012-01-01 00:01:09',\n", " '2012-01-01 00:01:10', '2012-01-01 00:01:11',\n", " '2012-01-01 00:01:12', '2012-01-01 00:01:13',\n", " '2012-01-01 00:01:14', '2012-01-01 00:01:15',\n", " '2012-01-01 00:01:16', '2012-01-01 00:01:17',\n", " '2012-01-01 00:01:18', '2012-01-01 00:01:19',\n", " '2012-01-01 00:01:20', '2012-01-01 00:01:21',\n", " '2012-01-01 00:01:22', '2012-01-01 00:01:23',\n", " '2012-01-01 00:01:24', '2012-01-01 00:01:25',\n", " '2012-01-01 00:01:26', '2012-01-01 00:01:27',\n", " '2012-01-01 00:01:28', '2012-01-01 00:01:29',\n", " '2012-01-01 00:01:30', '2012-01-01 00:01:31',\n", " '2012-01-01 00:01:32', '2012-01-01 00:01:33',\n", " '2012-01-01 00:01:34', '2012-01-01 00:01:35',\n", " '2012-01-01 00:01:36', '2012-01-01 00:01:37',\n", " '2012-01-01 00:01:38', '2012-01-01 00:01:39'],\n", " dtype='datetime64[ns]', freq='S')" ] }, "execution_count": 79, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rng = pd.date_range('1/1/2012', periods=100, freq='S')\n", "rng" ] }, { "cell_type": "code", "execution_count": 80, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2012-01-01 00:00:00 100\n", "2012-01-01 00:00:01 47\n", "2012-01-01 00:00:02 473\n", "2012-01-01 00:00:03 136\n", "2012-01-01 00:00:04 192\n", "2012-01-01 00:00:05 372\n", "2012-01-01 00:00:06 459\n", "2012-01-01 00:00:07 450\n", "2012-01-01 00:00:08 244\n", "2012-01-01 00:00:09 383\n", "2012-01-01 00:00:10 250\n", "2012-01-01 00:00:11 53\n", "2012-01-01 00:00:12 364\n", "2012-01-01 00:00:13 139\n", "2012-01-01 00:00:14 239\n", "2012-01-01 00:00:15 494\n", "2012-01-01 00:00:16 370\n", "2012-01-01 00:00:17 329\n", "2012-01-01 00:00:18 48\n", "2012-01-01 00:00:19 278\n", "2012-01-01 00:00:20 100\n", "2012-01-01 00:00:21 443\n", "2012-01-01 00:00:22 348\n", "2012-01-01 00:00:23 25\n", "2012-01-01 00:00:24 257\n", "2012-01-01 00:00:25 245\n", "2012-01-01 00:00:26 60\n", "2012-01-01 00:00:27 12\n", "2012-01-01 00:00:28 312\n", "2012-01-01 00:00:29 154\n", " ... \n", "2012-01-01 00:01:10 31\n", "2012-01-01 00:01:11 225\n", "2012-01-01 00:01:12 364\n", "2012-01-01 00:01:13 171\n", "2012-01-01 00:01:14 351\n", "2012-01-01 00:01:15 459\n", "2012-01-01 00:01:16 363\n", "2012-01-01 00:01:17 369\n", "2012-01-01 00:01:18 421\n", "2012-01-01 00:01:19 389\n", "2012-01-01 00:01:20 408\n", "2012-01-01 00:01:21 63\n", "2012-01-01 00:01:22 55\n", "2012-01-01 00:01:23 368\n", "2012-01-01 00:01:24 439\n", "2012-01-01 00:01:25 14\n", "2012-01-01 00:01:26 220\n", "2012-01-01 00:01:27 250\n", "2012-01-01 00:01:28 495\n", "2012-01-01 00:01:29 391\n", "2012-01-01 00:01:30 79\n", "2012-01-01 00:01:31 408\n", "2012-01-01 00:01:32 232\n", "2012-01-01 00:01:33 413\n", "2012-01-01 00:01:34 373\n", "2012-01-01 00:01:35 355\n", "2012-01-01 00:01:36 308\n", "2012-01-01 00:01:37 51\n", "2012-01-01 00:01:38 375\n", "2012-01-01 00:01:39 185\n", "Freq: S, Length: 100, dtype: int32" ] }, "execution_count": 80, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ts = pd.Series(np.random.randint(0,500,len(rng)), index=rng)\n", "ts" ] }, { "cell_type": "code", "execution_count": 81, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\ipykernel_launcher.py:1: FutureWarning: how in .resample() is deprecated\n", "the new syntax is .resample(...).sum()\n", " \"\"\"Entry point for launching an IPython kernel.\n" ] }, { "data": { "text/plain": [ "2012-01-01 26203\n", "Freq: 5T, dtype: int32" ] }, "execution_count": 81, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ts.resample('5Min', how='sum')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "时区表示" ] }, { "cell_type": "code", "execution_count": 82, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "DatetimeIndex(['2012-03-06', '2012-03-07', '2012-03-08', '2012-03-09',\n", " '2012-03-10'],\n", " dtype='datetime64[ns]', freq='D')" ] }, "execution_count": 82, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rng = pd.date_range('3/6/2012', periods=5, freq='D')\n", "rng" ] }, { "cell_type": "code", "execution_count": 83, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2012-03-06 0.523781\n", "2012-03-07 -0.670822\n", "2012-03-08 0.934826\n", "2012-03-09 0.002239\n", "2012-03-10 -0.091952\n", "Freq: D, dtype: float64" ] }, "execution_count": 83, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ts = pd.Series(np.random.randn(len(rng)), index=rng)\n", "ts" ] }, { "cell_type": "code", "execution_count": 84, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2012-03-06 00:00:00+00:00 0.523781\n", "2012-03-07 00:00:00+00:00 -0.670822\n", "2012-03-08 00:00:00+00:00 0.934826\n", "2012-03-09 00:00:00+00:00 0.002239\n", "2012-03-10 00:00:00+00:00 -0.091952\n", "Freq: D, dtype: float64" ] }, "execution_count": 84, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ts_utc = ts.tz_localize('UTC')\n", "ts_utc" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "时区转换" ] }, { "cell_type": "code", "execution_count": 85, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2012-03-05 19:00:00-05:00 0.523781\n", "2012-03-06 19:00:00-05:00 -0.670822\n", "2012-03-07 19:00:00-05:00 0.934826\n", "2012-03-08 19:00:00-05:00 0.002239\n", "2012-03-09 19:00:00-05:00 -0.091952\n", "Freq: D, dtype: float64" ] }, "execution_count": 85, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ts_utc.tz_convert('US/Eastern')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "时间跨度转换" ] }, { "cell_type": "code", "execution_count": 86, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "DatetimeIndex(['2012-01-31', '2012-02-29', '2012-03-31', '2012-04-30',\n", " '2012-05-31'],\n", " dtype='datetime64[ns]', freq='M')" ] }, "execution_count": 86, "metadata": {}, "output_type": "execute_result" } ], "source": [ "rng = pd.date_range('1/1/2012', periods=5, freq='M')\n", "rng" ] }, { "cell_type": "code", "execution_count": 87, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2012-01-31 1.296132\n", "2012-02-29 1.023936\n", "2012-03-31 -0.249774\n", "2012-04-30 1.007810\n", "2012-05-31 -0.051413\n", "Freq: M, dtype: float64" ] }, "execution_count": 87, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ts = pd.Series(np.random.randn(len(rng)), index=rng)\n", "ts" ] }, { "cell_type": "code", "execution_count": 88, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2012-01 1.296132\n", "2012-02 1.023936\n", "2012-03 -0.249774\n", "2012-04 1.007810\n", "2012-05 -0.051413\n", "Freq: M, dtype: float64" ] }, "execution_count": 88, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ps = ts.to_period()\n", "ps" ] }, { "cell_type": "code", "execution_count": 89, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2012-01-01 1.296132\n", "2012-02-01 1.023936\n", "2012-03-01 -0.249774\n", "2012-04-01 1.007810\n", "2012-05-01 -0.051413\n", "Freq: MS, dtype: float64" ] }, "execution_count": 89, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ps.to_timestamp()" ] }, { "cell_type": "markdown", "metadata": { "collapsed": true }, "source": [ "日期与时间戳之间的转换使得可以使用一些方便的算术函数。例如,我们把以11月为年底的季度数据转换为当前季度末月底为始的数据" ] }, { "cell_type": "code", "execution_count": 90, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "PeriodIndex(['1990Q1', '1990Q2', '1990Q3', '1990Q4', '1991Q1', '1991Q2',\n", " '1991Q3', '1991Q4', '1992Q1', '1992Q2', '1992Q3', '1992Q4',\n", " '1993Q1', '1993Q2', '1993Q3', '1993Q4', '1994Q1', '1994Q2',\n", " '1994Q3', '1994Q4', '1995Q1', '1995Q2', '1995Q3', '1995Q4',\n", " '1996Q1', '1996Q2', '1996Q3', '1996Q4', '1997Q1', '1997Q2',\n", " '1997Q3', '1997Q4', '1998Q1', '1998Q2', '1998Q3', '1998Q4',\n", " '1999Q1', '1999Q2', '1999Q3', '1999Q4', '2000Q1', '2000Q2',\n", " '2000Q3', '2000Q4'],\n", " dtype='period[Q-NOV]', freq='Q-NOV')" ] }, "execution_count": 90, "metadata": {}, "output_type": "execute_result" } ], "source": [ "prng = pd.period_range('1990Q1', '2000Q4', freq='Q-NOV')\n", "prng" ] }, { "cell_type": "code", "execution_count": 91, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1990Q1 0.467059\n", "1990Q2 -0.745741\n", "1990Q3 0.106234\n", "1990Q4 -0.306761\n", "1991Q1 -2.012034\n", "1991Q2 -2.033417\n", "1991Q3 -1.116709\n", "1991Q4 0.031495\n", "1992Q1 0.407074\n", "1992Q2 0.988878\n", "1992Q3 -0.195428\n", "1992Q4 -0.144770\n", "1993Q1 0.733104\n", "1993Q2 -0.742351\n", "1993Q3 -0.464713\n", "1993Q4 -1.247317\n", "1994Q1 -0.108473\n", "1994Q2 0.188728\n", "1994Q3 0.052446\n", "1994Q4 -0.004046\n", "1995Q1 1.075490\n", "1995Q2 -0.436009\n", "1995Q3 0.747165\n", "1995Q4 2.433366\n", "1996Q1 -0.471832\n", "1996Q2 -1.337675\n", "1996Q3 0.931348\n", "1996Q4 -0.461312\n", "1997Q1 0.041943\n", "1997Q2 -1.003802\n", "1997Q3 -0.572660\n", "1997Q4 -0.959966\n", "1998Q1 -1.864559\n", "1998Q2 -2.196461\n", "1998Q3 -1.317999\n", "1998Q4 -0.796643\n", "1999Q1 1.183292\n", "1999Q2 -0.046480\n", "1999Q3 -0.727018\n", "1999Q4 -0.972557\n", "2000Q1 0.541060\n", "2000Q2 1.221401\n", "2000Q3 -1.407534\n", "2000Q4 -0.773754\n", "Freq: Q-NOV, dtype: float64" ] }, "execution_count": 91, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ts = pd.Series(np.random.randn(len(prng)), index = prng)\n", "ts" ] }, { "cell_type": "code", "execution_count": 92, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1990-02-01 09:00 0.467059\n", "1990-05-01 09:00 -0.745741\n", "1990-08-01 09:00 0.106234\n", "1990-11-01 09:00 -0.306761\n", "1991-02-01 09:00 -2.012034\n", "1991-05-01 09:00 -2.033417\n", "1991-08-01 09:00 -1.116709\n", "1991-11-01 09:00 0.031495\n", "1992-02-01 09:00 0.407074\n", "1992-05-01 09:00 0.988878\n", "1992-08-01 09:00 -0.195428\n", "1992-11-01 09:00 -0.144770\n", "1993-02-01 09:00 0.733104\n", "1993-05-01 09:00 -0.742351\n", "1993-08-01 09:00 -0.464713\n", "1993-11-01 09:00 -1.247317\n", "1994-02-01 09:00 -0.108473\n", "1994-05-01 09:00 0.188728\n", "1994-08-01 09:00 0.052446\n", "1994-11-01 09:00 -0.004046\n", "1995-02-01 09:00 1.075490\n", "1995-05-01 09:00 -0.436009\n", "1995-08-01 09:00 0.747165\n", "1995-11-01 09:00 2.433366\n", "1996-02-01 09:00 -0.471832\n", "1996-05-01 09:00 -1.337675\n", "1996-08-01 09:00 0.931348\n", "1996-11-01 09:00 -0.461312\n", "1997-02-01 09:00 0.041943\n", "1997-05-01 09:00 -1.003802\n", "1997-08-01 09:00 -0.572660\n", "1997-11-01 09:00 -0.959966\n", "1998-02-01 09:00 -1.864559\n", "1998-05-01 09:00 -2.196461\n", "1998-08-01 09:00 -1.317999\n", "1998-11-01 09:00 -0.796643\n", "1999-02-01 09:00 1.183292\n", "1999-05-01 09:00 -0.046480\n", "1999-08-01 09:00 -0.727018\n", "1999-11-01 09:00 -0.972557\n", "2000-02-01 09:00 0.541060\n", "2000-05-01 09:00 1.221401\n", "2000-08-01 09:00 -1.407534\n", "2000-11-01 09:00 -0.773754\n", "Freq: H, dtype: float64" ] }, "execution_count": 92, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ts.index = (prng.asfreq('M', 'end') ) .asfreq('H', 'start') +9\n", "ts" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 分类" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "从版本0.15开始,pandas在**DataFrame**中开始包括分类数据。" ] }, { "cell_type": "code", "execution_count": 93, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
idraw_grade
01a
12b
23b
34a
45e
56e
\n", "
" ], "text/plain": [ " id raw_grade\n", "0 1 a\n", "1 2 b\n", "2 3 b\n", "3 4 a\n", "4 5 e\n", "5 6 e" ] }, "execution_count": 93, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.DataFrame({\"id\":[1,2,3,4,5,6], \"raw_grade\":['a', 'b', 'b', 'a', 'e', 'e']})\n", "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "把raw_grade转换为分类类型" ] }, { "cell_type": "code", "execution_count": 94, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 a\n", "1 b\n", "2 b\n", "3 a\n", "4 e\n", "5 e\n", "Name: grade, dtype: category\n", "Categories (3, object): [a, b, e]" ] }, "execution_count": 94, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[\"grade\"] = df[\"raw_grade\"].astype(\"category\")\n", "df[\"grade\"]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "重命名类别名为更有意义的名称" ] }, { "cell_type": "code", "execution_count": 95, "metadata": {}, "outputs": [], "source": [ "df[\"grade\"].cat.categories = [\"very good\", \"good\", \"very bad\"]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "对分类重新排序,并添加缺失的分类" ] }, { "cell_type": "code", "execution_count": 96, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 very good\n", "1 good\n", "2 good\n", "3 very good\n", "4 very bad\n", "5 very bad\n", "Name: grade, dtype: category\n", "Categories (5, object): [very bad, bad, medium, good, very good]" ] }, "execution_count": 96, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[\"grade\"] = df[\"grade\"].cat.set_categories([\"very bad\", \"bad\", \"medium\", \"good\", \"very good\"])\n", "df[\"grade\"]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "排序是按照分类的顺序进行的,而不是字典序" ] }, { "cell_type": "code", "execution_count": 97, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
idraw_gradegrade
45every bad
56every bad
12bgood
23bgood
01avery good
34avery good
\n", "
" ], "text/plain": [ " id raw_grade grade\n", "4 5 e very bad\n", "5 6 e very bad\n", "1 2 b good\n", "2 3 b good\n", "0 1 a very good\n", "3 4 a very good" ] }, "execution_count": 97, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.sort_values(by=\"grade\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "按分类分组时,也会显示空的分类" ] }, { "cell_type": "code", "execution_count": 98, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "grade\n", "very bad 2\n", "bad 0\n", "medium 0\n", "good 2\n", "very good 2\n", "dtype: int64" ] }, "execution_count": 98, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.groupby(\"grade\").size()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 绘图" ] }, { "cell_type": "code", "execution_count": 99, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 99, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "ts = pd.Series(np.random.randn(1000), index=pd.date_range('1/1/2000', periods=1000))\n", "ts = ts.cumsum()\n", "ts.plot()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "对于DataFrame类型,**plot()**能很方便地画出所有列及其标签" ] }, { "cell_type": "code", "execution_count": 100, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 100, "metadata": {}, "output_type": "execute_result" }, { "data": { "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "df = pd.DataFrame(np.random.randn(1000, 4), index=ts.index, columns=['A', 'B', 'C', 'D'])\n", "df = df.cumsum()\n", "plt.figure(); df.plot(); plt.legend(loc='best')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 获取数据的I/O" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## CSV" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "写入一个csv文件" ] }, { "cell_type": "code", "execution_count": 101, "metadata": {}, "outputs": [], "source": [ "df.to_csv('data/foo.csv')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "从一个csv文件读入" ] }, { "cell_type": "code", "execution_count": 102, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Unnamed: 0ABCD
02000-01-01-0.5479150.758504-0.791553-0.014276
12000-01-02-1.478652-1.8248630.001416-1.067864
22000-01-03-3.070727-1.655967-0.551411-2.188238
32000-01-04-3.317105-1.8107780.354000-1.995760
42000-01-05-2.822308-2.7570771.210057-1.250592
52000-01-06-2.223865-3.2569313.658672-1.232510
62000-01-07-0.559411-2.8428204.860993-0.418853
72000-01-08-0.524812-2.7487626.2808140.170616
82000-01-090.204528-0.8650225.5604560.875871
92000-01-100.688895-1.7040245.2260620.444483
102000-01-111.272138-2.4783772.763524-1.229797
112000-01-121.255657-2.9940732.8696880.745504
122000-01-13-0.001803-2.2958232.7380872.640307
132000-01-140.144209-0.9268104.0873080.164138
142000-01-151.3048110.6255303.542700-1.499446
152000-01-160.6820260.5524413.201389-0.155674
162000-01-17-1.065321-0.3390923.792634-1.754946
172000-01-18-1.268418-3.5127733.656896-0.132124
182000-01-19-1.936390-1.0691882.5548870.413930
192000-01-20-1.138678-2.9938703.094198-0.956574
202000-01-21-0.096721-4.1411083.341248-0.436886
212000-01-22-0.678763-5.0126630.8235761.303377
222000-01-23-2.498525-6.0759380.302908-0.294204
232000-01-24-0.937785-6.768487-0.078521-0.165799
242000-01-25-0.252338-6.8828600.545684-1.108641
252000-01-26-0.772653-7.0801290.764647-3.041450
262000-01-27-0.348831-6.0353750.507673-2.522836
272000-01-281.751721-5.756738-0.469014-2.825118
282000-01-290.799938-4.559172-0.086763-3.243101
292000-01-301.149650-4.4333311.476689-2.479956
..................
9702002-08-280.46675638.780786-6.743120-15.206051
9712002-08-291.90319936.687258-5.720742-14.335689
9722002-08-301.43280137.186065-6.274877-14.879621
9732002-08-312.21802136.200395-5.638178-15.625389
9742002-09-013.40531836.987365-4.441912-14.162031
9752002-09-023.85425238.283545-4.845949-15.449302
9762002-09-034.32803337.123804-6.006344-14.158929
9772002-09-045.21910337.203486-6.035182-14.461389
9782002-09-054.88454738.192836-6.447570-13.541204
9792002-09-065.81743537.669998-5.983732-12.238303
9802002-09-077.95333437.503576-4.783659-12.092902
9812002-09-088.57518137.377622-3.154240-12.895208
9822002-09-098.24224038.155500-3.285132-13.483775
9832002-09-109.69969337.421024-1.763105-13.397276
9842002-09-117.22802738.070563-1.250151-14.455654
9852002-09-127.27633638.503057-1.110047-15.362900
9862002-09-136.95545337.038613-0.571942-14.527590
9872002-09-146.23280037.254276-1.893050-14.385401
9882002-09-155.33180236.671504-1.782282-13.645305
9892002-09-165.82563836.920733-2.718137-13.875984
9902002-09-175.97213736.785577-3.923763-13.281418
9912002-09-185.15468534.789858-4.426825-13.805227
9922002-09-194.22803534.400350-4.431980-14.520423
9932002-09-203.04764036.244469-5.093584-15.106412
9942002-09-212.98436138.095349-5.560222-16.584216
9952002-09-223.18709837.169742-6.132250-14.910771
9962002-09-231.77247036.399488-6.257600-13.668261
9972002-09-241.88627234.543307-6.644915-15.213739
9982002-09-252.91843833.722114-5.736130-14.919711
9992002-09-262.60826833.473087-5.111581-15.969800
\n", "

1000 rows × 5 columns

\n", "
" ], "text/plain": [ " Unnamed: 0 A B C D\n", "0 2000-01-01 -0.547915 0.758504 -0.791553 -0.014276\n", "1 2000-01-02 -1.478652 -1.824863 0.001416 -1.067864\n", "2 2000-01-03 -3.070727 -1.655967 -0.551411 -2.188238\n", "3 2000-01-04 -3.317105 -1.810778 0.354000 -1.995760\n", "4 2000-01-05 -2.822308 -2.757077 1.210057 -1.250592\n", "5 2000-01-06 -2.223865 -3.256931 3.658672 -1.232510\n", "6 2000-01-07 -0.559411 -2.842820 4.860993 -0.418853\n", "7 2000-01-08 -0.524812 -2.748762 6.280814 0.170616\n", "8 2000-01-09 0.204528 -0.865022 5.560456 0.875871\n", "9 2000-01-10 0.688895 -1.704024 5.226062 0.444483\n", "10 2000-01-11 1.272138 -2.478377 2.763524 -1.229797\n", "11 2000-01-12 1.255657 -2.994073 2.869688 0.745504\n", "12 2000-01-13 -0.001803 -2.295823 2.738087 2.640307\n", "13 2000-01-14 0.144209 -0.926810 4.087308 0.164138\n", "14 2000-01-15 1.304811 0.625530 3.542700 -1.499446\n", "15 2000-01-16 0.682026 0.552441 3.201389 -0.155674\n", "16 2000-01-17 -1.065321 -0.339092 3.792634 -1.754946\n", "17 2000-01-18 -1.268418 -3.512773 3.656896 -0.132124\n", "18 2000-01-19 -1.936390 -1.069188 2.554887 0.413930\n", "19 2000-01-20 -1.138678 -2.993870 3.094198 -0.956574\n", "20 2000-01-21 -0.096721 -4.141108 3.341248 -0.436886\n", "21 2000-01-22 -0.678763 -5.012663 0.823576 1.303377\n", "22 2000-01-23 -2.498525 -6.075938 0.302908 -0.294204\n", "23 2000-01-24 -0.937785 -6.768487 -0.078521 -0.165799\n", "24 2000-01-25 -0.252338 -6.882860 0.545684 -1.108641\n", "25 2000-01-26 -0.772653 -7.080129 0.764647 -3.041450\n", "26 2000-01-27 -0.348831 -6.035375 0.507673 -2.522836\n", "27 2000-01-28 1.751721 -5.756738 -0.469014 -2.825118\n", "28 2000-01-29 0.799938 -4.559172 -0.086763 -3.243101\n", "29 2000-01-30 1.149650 -4.433331 1.476689 -2.479956\n", ".. ... ... ... ... ...\n", "970 2002-08-28 0.466756 38.780786 -6.743120 -15.206051\n", "971 2002-08-29 1.903199 36.687258 -5.720742 -14.335689\n", "972 2002-08-30 1.432801 37.186065 -6.274877 -14.879621\n", "973 2002-08-31 2.218021 36.200395 -5.638178 -15.625389\n", "974 2002-09-01 3.405318 36.987365 -4.441912 -14.162031\n", "975 2002-09-02 3.854252 38.283545 -4.845949 -15.449302\n", "976 2002-09-03 4.328033 37.123804 -6.006344 -14.158929\n", "977 2002-09-04 5.219103 37.203486 -6.035182 -14.461389\n", "978 2002-09-05 4.884547 38.192836 -6.447570 -13.541204\n", "979 2002-09-06 5.817435 37.669998 -5.983732 -12.238303\n", "980 2002-09-07 7.953334 37.503576 -4.783659 -12.092902\n", "981 2002-09-08 8.575181 37.377622 -3.154240 -12.895208\n", "982 2002-09-09 8.242240 38.155500 -3.285132 -13.483775\n", "983 2002-09-10 9.699693 37.421024 -1.763105 -13.397276\n", "984 2002-09-11 7.228027 38.070563 -1.250151 -14.455654\n", "985 2002-09-12 7.276336 38.503057 -1.110047 -15.362900\n", "986 2002-09-13 6.955453 37.038613 -0.571942 -14.527590\n", "987 2002-09-14 6.232800 37.254276 -1.893050 -14.385401\n", "988 2002-09-15 5.331802 36.671504 -1.782282 -13.645305\n", "989 2002-09-16 5.825638 36.920733 -2.718137 -13.875984\n", "990 2002-09-17 5.972137 36.785577 -3.923763 -13.281418\n", "991 2002-09-18 5.154685 34.789858 -4.426825 -13.805227\n", "992 2002-09-19 4.228035 34.400350 -4.431980 -14.520423\n", "993 2002-09-20 3.047640 36.244469 -5.093584 -15.106412\n", "994 2002-09-21 2.984361 38.095349 -5.560222 -16.584216\n", "995 2002-09-22 3.187098 37.169742 -6.132250 -14.910771\n", "996 2002-09-23 1.772470 36.399488 -6.257600 -13.668261\n", "997 2002-09-24 1.886272 34.543307 -6.644915 -15.213739\n", "998 2002-09-25 2.918438 33.722114 -5.736130 -14.919711\n", "999 2002-09-26 2.608268 33.473087 -5.111581 -15.969800\n", "\n", "[1000 rows x 5 columns]" ] }, "execution_count": 102, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.read_csv('data/foo.csv')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## HDF5" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "HDFStores的读写" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "写入一个HDF5 Store" ] }, { "cell_type": "code", "execution_count": 103, "metadata": {}, "outputs": [], "source": [ "df.to_hdf('data/foo.h5', 'df')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "从一个HDF5 Store读入" ] }, { "cell_type": "code", "execution_count": 104, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCD
2000-01-01-0.5479150.758504-0.791553-0.014276
2000-01-02-1.478652-1.8248630.001416-1.067864
2000-01-03-3.070727-1.655967-0.551411-2.188238
2000-01-04-3.317105-1.8107780.354000-1.995760
2000-01-05-2.822308-2.7570771.210057-1.250592
2000-01-06-2.223865-3.2569313.658672-1.232510
2000-01-07-0.559411-2.8428204.860993-0.418853
2000-01-08-0.524812-2.7487626.2808140.170616
2000-01-090.204528-0.8650225.5604560.875871
2000-01-100.688895-1.7040245.2260620.444483
2000-01-111.272138-2.4783772.763524-1.229797
2000-01-121.255657-2.9940732.8696880.745504
2000-01-13-0.001803-2.2958232.7380872.640307
2000-01-140.144209-0.9268104.0873080.164138
2000-01-151.3048110.6255303.542700-1.499446
2000-01-160.6820260.5524413.201389-0.155674
2000-01-17-1.065321-0.3390923.792634-1.754946
2000-01-18-1.268418-3.5127733.656896-0.132124
2000-01-19-1.936390-1.0691882.5548870.413930
2000-01-20-1.138678-2.9938703.094198-0.956574
2000-01-21-0.096721-4.1411083.341248-0.436886
2000-01-22-0.678763-5.0126630.8235761.303377
2000-01-23-2.498525-6.0759380.302908-0.294204
2000-01-24-0.937785-6.768487-0.078521-0.165799
2000-01-25-0.252338-6.8828600.545684-1.108641
2000-01-26-0.772653-7.0801290.764647-3.041450
2000-01-27-0.348831-6.0353750.507673-2.522836
2000-01-281.751721-5.756738-0.469014-2.825118
2000-01-290.799938-4.559172-0.086763-3.243101
2000-01-301.149650-4.4333311.476689-2.479956
...............
2002-08-280.46675638.780786-6.743120-15.206051
2002-08-291.90319936.687258-5.720742-14.335689
2002-08-301.43280137.186065-6.274877-14.879621
2002-08-312.21802136.200395-5.638178-15.625389
2002-09-013.40531836.987365-4.441912-14.162031
2002-09-023.85425238.283545-4.845949-15.449302
2002-09-034.32803337.123804-6.006344-14.158929
2002-09-045.21910337.203486-6.035182-14.461389
2002-09-054.88454738.192836-6.447570-13.541204
2002-09-065.81743537.669998-5.983732-12.238303
2002-09-077.95333437.503576-4.783659-12.092902
2002-09-088.57518137.377622-3.154240-12.895208
2002-09-098.24224038.155500-3.285132-13.483775
2002-09-109.69969337.421024-1.763105-13.397276
2002-09-117.22802738.070563-1.250151-14.455654
2002-09-127.27633638.503057-1.110047-15.362900
2002-09-136.95545337.038613-0.571942-14.527590
2002-09-146.23280037.254276-1.893050-14.385401
2002-09-155.33180236.671504-1.782282-13.645305
2002-09-165.82563836.920733-2.718137-13.875984
2002-09-175.97213736.785577-3.923763-13.281418
2002-09-185.15468534.789858-4.426825-13.805227
2002-09-194.22803534.400350-4.431980-14.520423
2002-09-203.04764036.244469-5.093584-15.106412
2002-09-212.98436138.095349-5.560222-16.584216
2002-09-223.18709837.169742-6.132250-14.910771
2002-09-231.77247036.399488-6.257600-13.668261
2002-09-241.88627234.543307-6.644915-15.213739
2002-09-252.91843833.722114-5.736130-14.919711
2002-09-262.60826833.473087-5.111581-15.969800
\n", "

1000 rows × 4 columns

\n", "
" ], "text/plain": [ " A B C D\n", "2000-01-01 -0.547915 0.758504 -0.791553 -0.014276\n", "2000-01-02 -1.478652 -1.824863 0.001416 -1.067864\n", "2000-01-03 -3.070727 -1.655967 -0.551411 -2.188238\n", "2000-01-04 -3.317105 -1.810778 0.354000 -1.995760\n", "2000-01-05 -2.822308 -2.757077 1.210057 -1.250592\n", "2000-01-06 -2.223865 -3.256931 3.658672 -1.232510\n", "2000-01-07 -0.559411 -2.842820 4.860993 -0.418853\n", "2000-01-08 -0.524812 -2.748762 6.280814 0.170616\n", "2000-01-09 0.204528 -0.865022 5.560456 0.875871\n", "2000-01-10 0.688895 -1.704024 5.226062 0.444483\n", "2000-01-11 1.272138 -2.478377 2.763524 -1.229797\n", "2000-01-12 1.255657 -2.994073 2.869688 0.745504\n", "2000-01-13 -0.001803 -2.295823 2.738087 2.640307\n", "2000-01-14 0.144209 -0.926810 4.087308 0.164138\n", "2000-01-15 1.304811 0.625530 3.542700 -1.499446\n", "2000-01-16 0.682026 0.552441 3.201389 -0.155674\n", "2000-01-17 -1.065321 -0.339092 3.792634 -1.754946\n", "2000-01-18 -1.268418 -3.512773 3.656896 -0.132124\n", "2000-01-19 -1.936390 -1.069188 2.554887 0.413930\n", "2000-01-20 -1.138678 -2.993870 3.094198 -0.956574\n", "2000-01-21 -0.096721 -4.141108 3.341248 -0.436886\n", "2000-01-22 -0.678763 -5.012663 0.823576 1.303377\n", "2000-01-23 -2.498525 -6.075938 0.302908 -0.294204\n", "2000-01-24 -0.937785 -6.768487 -0.078521 -0.165799\n", "2000-01-25 -0.252338 -6.882860 0.545684 -1.108641\n", "2000-01-26 -0.772653 -7.080129 0.764647 -3.041450\n", "2000-01-27 -0.348831 -6.035375 0.507673 -2.522836\n", "2000-01-28 1.751721 -5.756738 -0.469014 -2.825118\n", "2000-01-29 0.799938 -4.559172 -0.086763 -3.243101\n", "2000-01-30 1.149650 -4.433331 1.476689 -2.479956\n", "... ... ... ... ...\n", "2002-08-28 0.466756 38.780786 -6.743120 -15.206051\n", "2002-08-29 1.903199 36.687258 -5.720742 -14.335689\n", "2002-08-30 1.432801 37.186065 -6.274877 -14.879621\n", "2002-08-31 2.218021 36.200395 -5.638178 -15.625389\n", "2002-09-01 3.405318 36.987365 -4.441912 -14.162031\n", "2002-09-02 3.854252 38.283545 -4.845949 -15.449302\n", "2002-09-03 4.328033 37.123804 -6.006344 -14.158929\n", "2002-09-04 5.219103 37.203486 -6.035182 -14.461389\n", "2002-09-05 4.884547 38.192836 -6.447570 -13.541204\n", "2002-09-06 5.817435 37.669998 -5.983732 -12.238303\n", "2002-09-07 7.953334 37.503576 -4.783659 -12.092902\n", "2002-09-08 8.575181 37.377622 -3.154240 -12.895208\n", "2002-09-09 8.242240 38.155500 -3.285132 -13.483775\n", "2002-09-10 9.699693 37.421024 -1.763105 -13.397276\n", "2002-09-11 7.228027 38.070563 -1.250151 -14.455654\n", "2002-09-12 7.276336 38.503057 -1.110047 -15.362900\n", "2002-09-13 6.955453 37.038613 -0.571942 -14.527590\n", "2002-09-14 6.232800 37.254276 -1.893050 -14.385401\n", "2002-09-15 5.331802 36.671504 -1.782282 -13.645305\n", "2002-09-16 5.825638 36.920733 -2.718137 -13.875984\n", "2002-09-17 5.972137 36.785577 -3.923763 -13.281418\n", "2002-09-18 5.154685 34.789858 -4.426825 -13.805227\n", "2002-09-19 4.228035 34.400350 -4.431980 -14.520423\n", "2002-09-20 3.047640 36.244469 -5.093584 -15.106412\n", "2002-09-21 2.984361 38.095349 -5.560222 -16.584216\n", "2002-09-22 3.187098 37.169742 -6.132250 -14.910771\n", "2002-09-23 1.772470 36.399488 -6.257600 -13.668261\n", "2002-09-24 1.886272 34.543307 -6.644915 -15.213739\n", "2002-09-25 2.918438 33.722114 -5.736130 -14.919711\n", "2002-09-26 2.608268 33.473087 -5.111581 -15.969800\n", "\n", "[1000 rows x 4 columns]" ] }, "execution_count": 104, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.read_hdf('data/foo.h5', 'df')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Excel" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "MS Excel的读写" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "写入一个Excel文件" ] }, { "cell_type": "code", "execution_count": 105, "metadata": {}, "outputs": [], "source": [ "df.to_excel('data/foo.xlsx', sheet_name='Sheet1')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "从一个excel文件读入" ] }, { "cell_type": "code", "execution_count": 106, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCD
2000-01-01-0.5479150.758504-0.791553-0.014276
2000-01-02-1.478652-1.8248630.001416-1.067864
2000-01-03-3.070727-1.655967-0.551411-2.188238
2000-01-04-3.317105-1.8107780.354000-1.995760
2000-01-05-2.822308-2.7570771.210057-1.250592
2000-01-06-2.223865-3.2569313.658672-1.232510
2000-01-07-0.559411-2.8428204.860993-0.418853
2000-01-08-0.524812-2.7487626.2808140.170616
2000-01-090.204528-0.8650225.5604560.875871
2000-01-100.688895-1.7040245.2260620.444483
2000-01-111.272138-2.4783772.763524-1.229797
2000-01-121.255657-2.9940732.8696880.745504
2000-01-13-0.001803-2.2958232.7380872.640307
2000-01-140.144209-0.9268104.0873080.164138
2000-01-151.3048110.6255303.542700-1.499446
2000-01-160.6820260.5524413.201389-0.155674
2000-01-17-1.065321-0.3390923.792634-1.754946
2000-01-18-1.268418-3.5127733.656896-0.132124
2000-01-19-1.936390-1.0691882.5548870.413930
2000-01-20-1.138678-2.9938703.094198-0.956574
2000-01-21-0.096721-4.1411083.341248-0.436886
2000-01-22-0.678763-5.0126630.8235761.303377
2000-01-23-2.498525-6.0759380.302908-0.294204
2000-01-24-0.937785-6.768487-0.078521-0.165799
2000-01-25-0.252338-6.8828600.545684-1.108641
2000-01-26-0.772653-7.0801290.764647-3.041450
2000-01-27-0.348831-6.0353750.507673-2.522836
2000-01-281.751721-5.756738-0.469014-2.825118
2000-01-290.799938-4.559172-0.086763-3.243101
2000-01-301.149650-4.4333311.476689-2.479956
...............
2002-08-280.46675638.780786-6.743120-15.206051
2002-08-291.90319936.687258-5.720742-14.335689
2002-08-301.43280137.186065-6.274877-14.879621
2002-08-312.21802136.200395-5.638178-15.625389
2002-09-013.40531836.987365-4.441912-14.162031
2002-09-023.85425238.283545-4.845949-15.449302
2002-09-034.32803337.123804-6.006344-14.158929
2002-09-045.21910337.203486-6.035182-14.461389
2002-09-054.88454738.192836-6.447570-13.541204
2002-09-065.81743537.669998-5.983732-12.238303
2002-09-077.95333437.503576-4.783659-12.092902
2002-09-088.57518137.377622-3.154240-12.895208
2002-09-098.24224038.155500-3.285132-13.483775
2002-09-109.69969337.421024-1.763105-13.397276
2002-09-117.22802738.070563-1.250151-14.455654
2002-09-127.27633638.503057-1.110047-15.362900
2002-09-136.95545337.038613-0.571942-14.527590
2002-09-146.23280037.254276-1.893050-14.385401
2002-09-155.33180236.671504-1.782282-13.645305
2002-09-165.82563836.920733-2.718137-13.875984
2002-09-175.97213736.785577-3.923763-13.281418
2002-09-185.15468534.789858-4.426825-13.805227
2002-09-194.22803534.400350-4.431980-14.520423
2002-09-203.04764036.244469-5.093584-15.106412
2002-09-212.98436138.095349-5.560222-16.584216
2002-09-223.18709837.169742-6.132250-14.910771
2002-09-231.77247036.399488-6.257600-13.668261
2002-09-241.88627234.543307-6.644915-15.213739
2002-09-252.91843833.722114-5.736130-14.919711
2002-09-262.60826833.473087-5.111581-15.969800
\n", "

1000 rows × 4 columns

\n", "
" ], "text/plain": [ " A B C D\n", "2000-01-01 -0.547915 0.758504 -0.791553 -0.014276\n", "2000-01-02 -1.478652 -1.824863 0.001416 -1.067864\n", "2000-01-03 -3.070727 -1.655967 -0.551411 -2.188238\n", "2000-01-04 -3.317105 -1.810778 0.354000 -1.995760\n", "2000-01-05 -2.822308 -2.757077 1.210057 -1.250592\n", "2000-01-06 -2.223865 -3.256931 3.658672 -1.232510\n", "2000-01-07 -0.559411 -2.842820 4.860993 -0.418853\n", "2000-01-08 -0.524812 -2.748762 6.280814 0.170616\n", "2000-01-09 0.204528 -0.865022 5.560456 0.875871\n", "2000-01-10 0.688895 -1.704024 5.226062 0.444483\n", "2000-01-11 1.272138 -2.478377 2.763524 -1.229797\n", "2000-01-12 1.255657 -2.994073 2.869688 0.745504\n", "2000-01-13 -0.001803 -2.295823 2.738087 2.640307\n", "2000-01-14 0.144209 -0.926810 4.087308 0.164138\n", "2000-01-15 1.304811 0.625530 3.542700 -1.499446\n", "2000-01-16 0.682026 0.552441 3.201389 -0.155674\n", "2000-01-17 -1.065321 -0.339092 3.792634 -1.754946\n", "2000-01-18 -1.268418 -3.512773 3.656896 -0.132124\n", "2000-01-19 -1.936390 -1.069188 2.554887 0.413930\n", "2000-01-20 -1.138678 -2.993870 3.094198 -0.956574\n", "2000-01-21 -0.096721 -4.141108 3.341248 -0.436886\n", "2000-01-22 -0.678763 -5.012663 0.823576 1.303377\n", "2000-01-23 -2.498525 -6.075938 0.302908 -0.294204\n", "2000-01-24 -0.937785 -6.768487 -0.078521 -0.165799\n", "2000-01-25 -0.252338 -6.882860 0.545684 -1.108641\n", "2000-01-26 -0.772653 -7.080129 0.764647 -3.041450\n", "2000-01-27 -0.348831 -6.035375 0.507673 -2.522836\n", "2000-01-28 1.751721 -5.756738 -0.469014 -2.825118\n", "2000-01-29 0.799938 -4.559172 -0.086763 -3.243101\n", "2000-01-30 1.149650 -4.433331 1.476689 -2.479956\n", "... ... ... ... ...\n", "2002-08-28 0.466756 38.780786 -6.743120 -15.206051\n", "2002-08-29 1.903199 36.687258 -5.720742 -14.335689\n", "2002-08-30 1.432801 37.186065 -6.274877 -14.879621\n", "2002-08-31 2.218021 36.200395 -5.638178 -15.625389\n", "2002-09-01 3.405318 36.987365 -4.441912 -14.162031\n", "2002-09-02 3.854252 38.283545 -4.845949 -15.449302\n", "2002-09-03 4.328033 37.123804 -6.006344 -14.158929\n", "2002-09-04 5.219103 37.203486 -6.035182 -14.461389\n", "2002-09-05 4.884547 38.192836 -6.447570 -13.541204\n", "2002-09-06 5.817435 37.669998 -5.983732 -12.238303\n", "2002-09-07 7.953334 37.503576 -4.783659 -12.092902\n", "2002-09-08 8.575181 37.377622 -3.154240 -12.895208\n", "2002-09-09 8.242240 38.155500 -3.285132 -13.483775\n", "2002-09-10 9.699693 37.421024 -1.763105 -13.397276\n", "2002-09-11 7.228027 38.070563 -1.250151 -14.455654\n", "2002-09-12 7.276336 38.503057 -1.110047 -15.362900\n", "2002-09-13 6.955453 37.038613 -0.571942 -14.527590\n", "2002-09-14 6.232800 37.254276 -1.893050 -14.385401\n", "2002-09-15 5.331802 36.671504 -1.782282 -13.645305\n", "2002-09-16 5.825638 36.920733 -2.718137 -13.875984\n", "2002-09-17 5.972137 36.785577 -3.923763 -13.281418\n", "2002-09-18 5.154685 34.789858 -4.426825 -13.805227\n", "2002-09-19 4.228035 34.400350 -4.431980 -14.520423\n", "2002-09-20 3.047640 36.244469 -5.093584 -15.106412\n", "2002-09-21 2.984361 38.095349 -5.560222 -16.584216\n", "2002-09-22 3.187098 37.169742 -6.132250 -14.910771\n", "2002-09-23 1.772470 36.399488 -6.257600 -13.668261\n", "2002-09-24 1.886272 34.543307 -6.644915 -15.213739\n", "2002-09-25 2.918438 33.722114 -5.736130 -14.919711\n", "2002-09-26 2.608268 33.473087 -5.111581 -15.969800\n", "\n", "[1000 rows x 4 columns]" ] }, "execution_count": 106, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.read_excel('data/foo.xlsx', 'Sheet1', index_col=None, na_values=['NA'])" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.4" } }, "nbformat": 4, "nbformat_minor": 1 } ================================================ FILE: 3.pandas/1.10-Minutes-to-pandas/README.md ================================================ #《十分钟搞定pandas》 This is the official document [*10 minutes in pandas*](http://pandas.pydata.org/pandas-docs/stable/10min.html) in Chinese. **在线阅读**:[十分钟搞定pandas](http://nbviewer.ipython.org/github/Wenice/10-Minutes-to-pandas/blob/master/10%20Minutes%20to%20pandas.ipynb) ================================================ FILE: 3.pandas/1.10-Minutes-to-pandas/data/foo.csv ================================================ ,A,B,C,D 2000-01-01,-0.5479151810928263,0.7585035671650282,-0.7915527339166057,-0.014276215096031601 2000-01-02,-1.4786520159926413,-1.8248625282371542,0.0014156168611411113,-1.0678637707676857 2000-01-03,-3.070726803294386,-1.6559670104838138,-0.5514114277617373,-2.188238071682052 2000-01-04,-3.317105151330431,-1.8107775637061068,0.35399957681797334,-1.9957602625575013 2000-01-05,-2.8223080422684053,-2.7570770510658162,1.2100570973141975,-1.250591800103325 2000-01-06,-2.2238654140791843,-3.2569312430910142,3.658672125514629,-1.2325098503514262 2000-01-07,-0.5594111460103863,-2.842820321805858,4.860993002850001,-0.41885310344935245 2000-01-08,-0.5248123941035769,-2.748761819012095,6.280814318672206,0.17061580567436863 2000-01-09,0.20452797637738251,-0.8650219289606849,5.5604564931096245,0.8758712574726347 2000-01-10,0.6888948427676997,-1.704024084076032,5.226061715267047,0.44448340249010054 2000-01-11,1.2721382276801598,-2.478376889434483,2.7635236568855355,-1.2297973063009824 2000-01-12,1.2556573280476269,-2.9940727284671547,2.8696882264270824,0.7455039549957143 2000-01-13,-0.001803096363478307,-2.2958225295690524,2.7380872706189385,2.6403070811495812 2000-01-14,0.14420855917496228,-0.9268104788688967,4.087307513149795,0.16413797136337038 2000-01-15,1.3048112345082097,0.625529819245046,3.542700248753867,-1.499446048805507 2000-01-16,0.6820255215869164,0.552441168813194,3.2013890987505933,-0.1556737759579232 2000-01-17,-1.0653206021467818,-0.3390922219549005,3.792633720572308,-1.7549456837096764 2000-01-18,-1.268417991846499,-3.5127728937899807,3.656896352448523,-0.13212374936468096 2000-01-19,-1.9363895722461735,-1.0691882087955191,2.5548874547692533,0.4139300024774504 2000-01-20,-1.1386783549322619,-2.9938698722214783,3.0941980471639163,-0.9565739071330779 2000-01-21,-0.0967209592721705,-4.141107976672696,3.341247787033567,-0.4368863889001323 2000-01-22,-0.6787631029612109,-5.012663362996001,0.8235755214448042,1.303376542224544 2000-01-23,-2.498525351314982,-6.075937935347145,0.3029075372147785,-0.29420367882053644 2000-01-24,-0.9377849549144852,-6.768486878935357,-0.07852080930445127,-0.16579929271120988 2000-01-25,-0.2523381344594503,-6.882859842870638,0.5456844362733024,-1.10864064302118 2000-01-26,-0.7726525436485714,-7.080129393914403,0.7646473830398788,-3.0414499870053096 2000-01-27,-0.34883114214948274,-6.035375352760035,0.5076734756100604,-2.5228356312436824 2000-01-28,1.7517208606760517,-5.756738453776143,-0.469013586616583,-2.825118245978936 2000-01-29,0.7999382193098763,-4.5591723741285275,-0.08676292365066768,-3.2431010367343807 2000-01-30,1.1496498779660085,-4.433330666070112,1.4766887503403954,-2.4799560486189054 2000-01-31,2.015157420590959,-3.914373037341744,1.8003438320421326,-1.7593074887356686 2000-02-01,2.1446861376492614,-2.493985075771966,1.0528526799065323,-3.370994454742795 2000-02-02,3.5825237909751344,-1.6883529623660896,0.9555215105407281,-4.506622803727957 2000-02-03,3.77858456048812,-1.8695906178146002,1.7328568266584483,-6.366590493475355 2000-02-04,4.911224138464443,-2.792802742526688,2.959023100485572,-6.41543910887446 2000-02-05,4.919579700872011,-3.6134645422606426,4.106508110010683,-5.132982804055395 2000-02-06,4.9912248366103045,-3.0800670418111364,3.360152490466963,-4.257640834946202 2000-02-07,5.84301351347017,-2.274814937876478,3.874482014073722,-3.483566859684065 2000-02-08,6.282913269927594,-3.3212621807173726,5.406769627108887,-2.487107562447327 2000-02-09,5.606514188552685,-4.2972780304888625,5.24867711705864,-3.441072678568298 2000-02-10,4.23969940114971,-3.5294198042534726,6.61626959355184,-4.033283847046932 2000-02-11,3.810936270661771,-6.209501923923973,7.2146097641512235,-4.675556604570748 2000-02-12,3.7548349229976044,-5.387459097519608,5.591537353506659,-5.266877990099926 2000-02-13,4.398418877233283,-4.092690594333276,5.83673928417155,-5.732427205869718 2000-02-14,4.208439302300944,-3.939930465301921,5.745024490941508,-5.745265088590907 2000-02-15,4.618456266628262,-4.336032528111899,5.120647699675505,-5.724330331210495 2000-02-16,4.608565987901993,-3.6825790947879606,5.421018461543752,-6.28194901295681 2000-02-17,4.0298056115015966,-3.2786845885897034,5.444264565675136,-5.98588569819204 2000-02-18,4.023146898326493,-2.6424844119702193,5.095117815888905,-6.931500085605662 2000-02-19,3.9539230087607127,-1.4416559080827118,4.42066814722992,-7.522024117383445 2000-02-20,2.68300908162072,-1.722367774434868,5.274642325817944,-7.9776930383243965 2000-02-21,2.7025426914699673,-1.101631128955392,2.4076127311250524,-6.925695073478119 2000-02-22,3.2464434572643515,-2.0175473264229407,2.3755364896158904,-7.372567213164693 2000-02-23,3.110297259102999,-1.9732585163924015,4.431850856650208,-5.988990396157977 2000-02-24,4.020013389337046,-1.6065159460310385,5.451286456877222,-5.436563849532217 2000-02-25,4.270457043581444,-1.6633765024641105,4.929513873714631,-5.514751638493159 2000-02-26,4.430837140670408,-1.7978288826924314,5.877764475202645,-5.122168618439229 2000-02-27,4.78399574274304,-1.7328331187008823,5.996985896543003,-5.424989104361209 2000-02-28,4.462661708406604,0.5779633496782859,5.866711058719864,-3.9522009007685215 2000-02-29,3.2167893854841436,1.98206387719617,5.1947265324765475,-5.190891993965762 2000-03-01,3.8854317027604903,3.2905483296668487,4.428339265231501,-6.609873681067576 2000-03-02,2.5132138486763402,4.112288030655646,3.9144438847080254,-7.202577217818801 2000-03-03,2.045303065575,5.674057936091805,4.962552232824457,-6.936759601562905 2000-03-04,3.1055435636790527,5.303293078839912,5.7178887593991865,-7.533933249489456 2000-03-05,2.9303282471827683,6.020237430192089,4.7170060058564465,-5.841456207964156 2000-03-06,3.2086284435204715,6.008074371542074,2.414537360628778,-6.126722057688056 2000-03-07,3.0640018944765965,4.500526647692864,1.4866874341678717,-6.720315297150439 2000-03-08,4.417327323439372,4.222542885466145,2.94607008178067,-6.571754118376534 2000-03-09,5.339925791571573,5.542359474522746,2.801976910296672,-6.972999576994983 2000-03-10,5.958880014408018,5.498780704401638,4.102043030387295,-7.806555675529262 2000-03-11,4.867572710104769,5.888326919858121,4.342796901735356,-6.933968040292356 2000-03-12,4.273108057007724,6.30220610547509,5.123091170488652,-7.599270157425516 2000-03-13,1.5963877530091803,6.62298926203196,4.6227407012779365,-6.817792328268104 2000-03-14,1.3459588767646857,6.693547808325552,3.4414036090578035,-5.116991125084802 2000-03-15,3.146293195248088,5.52075842301444,3.517817745095587,-3.1338073719676114 2000-03-16,3.1491047500576297,6.446197157923078,4.741201214916111,-3.194735310926937 2000-03-17,3.8125754837708317,6.544710835692392,4.2959594626002895,-3.265448019946603 2000-03-18,5.742513263079161,8.649881493581065,3.8983610137449243,-2.425349342122163 2000-03-19,5.296151210240883,8.596990021030965,4.331231815447542,-1.9003542184733924 2000-03-20,5.361463662485451,6.995616304326393,4.888053052849155,-3.4877052708034784 2000-03-21,5.157036208792603,7.888277531994388,5.80034661772927,-2.10355817216402 2000-03-22,3.9808744143221757,8.734096917732264,7.197354676585626,-3.3067652919937327 2000-03-23,3.530293921633306,7.3197060561034935,6.843090124091032,-3.584511221994211 2000-03-24,3.810823772959755,6.01251968558164,8.116529458454334,-5.731550644808493 2000-03-25,3.7371222414550203,6.735012490417306,8.806076679928053,-4.51320029433043 2000-03-26,5.464777297358747,7.627008098847979,9.258728238496584,-3.747198978286944 2000-03-27,5.16750601577976,6.125818555808724,9.272041474609296,-1.9402802639339674 2000-03-28,5.151204875826996,5.570595563885197,8.752317118669714,-2.9201357939799992 2000-03-29,5.247080902780622,5.572041050863495,8.038896493448219,-3.2864034928941166 2000-03-30,4.361738319403585,4.6363574311481495,7.866261940381432,-3.794696285213521 2000-03-31,5.6454872022309806,6.221476965590354,8.802836763888475,-2.9832443534070605 2000-04-01,5.625531556234311,8.017764791445074,9.944153926810843,-2.6514204353563953 2000-04-02,6.331722352177701,7.496392532884768,11.043773381353493,-1.4973999120653196 2000-04-03,7.892119183701923,7.382798379732132,10.732047860613083,-0.4910283567582858 2000-04-04,7.2619596129663355,7.692306742870892,10.720233538589643,-0.45035480175257 2000-04-05,8.114276186599021,7.657963988876193,11.871149624799544,-2.187334410368915 2000-04-06,9.131771316558963,8.333309823816181,11.11306588946877,-3.7879886335948134 2000-04-07,8.2884995380164,8.5456091569644,11.912837443397175,-2.7910588531463 2000-04-08,8.616652794180293,8.178857628533331,12.252474935297595,-2.9866330533034837 2000-04-09,9.16290052428061,9.092252846521326,13.132969041259996,-2.6060841618206605 2000-04-10,9.248868345290468,8.733541863700921,13.95647827756978,0.9029024304121447 2000-04-11,8.410094560704168,8.975362429019112,13.279423521037781,1.8857638556987473 2000-04-12,8.718676510471601,9.040313793787956,14.613591193095626,0.5942612358116333 2000-04-13,6.762694168114433,10.127060931833348,15.742276475860102,1.2625066168942203 2000-04-14,5.759763325809027,9.822077968256034,15.996908424180553,0.18594531116921975 2000-04-15,6.706595323488484,10.219598786877887,16.638478085589217,0.541211092715733 2000-04-16,5.712025484436679,10.483109077180357,17.93537728258346,0.41865859742688827 2000-04-17,5.995856531038643,10.875476386167511,19.040645908911113,1.4986190784973226 2000-04-18,7.3803503117950955,10.790168674337382,18.885045579736694,1.7110746348758903 2000-04-19,8.564428671337197,10.62712874420876,18.040924371190147,2.657062778215155 2000-04-20,8.703841540741315,9.383982000710741,16.3009892953631,2.4486672254020654 2000-04-21,10.351170020689565,7.680309439105316,18.432954649430865,1.7683901181446153 2000-04-22,10.718581220110226,7.046721808822742,18.816924519346347,1.2577187075459921 2000-04-23,12.849079460253824,7.016956859499061,18.373212106492105,2.1444000387829965 2000-04-24,13.624620215471795,8.8469830252395,19.00714374375892,2.084238396552183 2000-04-25,14.214705390696208,9.329588155475216,19.530564019361695,1.8730726977840624 2000-04-26,11.746165517499229,8.176736325378227,19.625605394772514,2.9382780675858955 2000-04-27,12.01364788481901,8.918385911234497,19.933849539942027,1.2218532778391686 2000-04-28,9.727036015052295,8.322585438809071,19.965998301571165,2.3907384321479714 2000-04-29,9.031119711357228,7.993438239454833,20.355646435660194,2.100872104933938 2000-04-30,9.039117303709464,6.243952828054143,20.88666338957767,3.0056797536014574 2000-05-01,9.850542129538681,7.643519197165121,21.23806689850051,3.0173866009049224 2000-05-02,10.769375576740293,7.7305628718936985,22.428660713752237,1.9130097980383411 2000-05-03,12.172912070165825,8.108562335633113,22.00618596543359,2.3730524336698924 2000-05-04,13.210968740475845,7.120078196016681,22.03819335197078,0.5831183484574134 2000-05-05,14.173708572467032,8.07759001106508,21.708481034849257,0.9287982037019358 2000-05-06,13.528422043996242,8.00484465700068,20.821159198753072,1.505679663286333 2000-05-07,14.71683612710396,6.819391567459963,22.46077204561903,0.7279244611435826 2000-05-08,15.064600557086408,7.7890589133566985,24.657723196401857,0.8431295164112514 2000-05-09,15.975467765871658,8.428284974874,25.447035796315706,0.14777984348138962 2000-05-10,13.973676371951184,9.40023159709841,25.249738304543,0.13869605980803432 2000-05-11,12.994261902677692,11.757186561411862,25.581848220497008,0.7861775196035735 2000-05-12,12.680791994538552,11.052609192285571,24.729766800127592,1.5281643761706873 2000-05-13,11.496778211603814,12.011417191039786,23.231318352178466,0.6068347299069217 2000-05-14,11.286389414020897,13.77994174395219,23.246312063306917,-0.25735393978760246 2000-05-15,10.606467117191698,13.195480819902631,22.262931438236347,1.0489031708663532 2000-05-16,10.914098844892036,12.136175019095894,22.02079974059002,1.8975606389374142 2000-05-17,11.377139061776353,12.373669162959452,24.60566277546434,1.4149329054074034 2000-05-18,12.08264096478579,12.721652544424494,24.17724909390381,1.627612638073566 2000-05-19,11.93107165086129,12.642703779146162,24.050576049112134,0.6573843459986358 2000-05-20,9.390346525867637,11.556196818704816,23.24607357768769,0.07028682216897153 2000-05-21,8.974734387068608,13.747320081868855,21.127975643758838,-0.3418124791690146 2000-05-22,9.641950486673394,15.961947716999626,19.626483076634003,0.03901106099899887 2000-05-23,9.286503453250107,16.023056169414154,19.593884390067995,0.5134908068434137 2000-05-24,9.27707385295611,16.473647129390894,19.698587965051356,0.9795336272395481 2000-05-25,9.412317353755386,17.215459530327514,21.41800034380297,1.1276154550160697 2000-05-26,8.05683655591479,15.081028971403384,21.644838530426842,1.0197773705619808 2000-05-27,7.530415849186657,16.31476509001918,23.37435641691825,2.4996660413210394 2000-05-28,7.273579674945432,16.540202057768777,23.078010836390554,2.3641254277694754 2000-05-29,7.569432004448269,16.155542323317878,22.503744077643287,0.3180457103642027 2000-05-30,7.891127907806678,15.28354932808477,21.7533599714689,-0.17049563935188233 2000-05-31,8.811296825399914,15.889274146395426,22.085187206771945,0.30653243909714617 2000-06-01,10.103506464584862,15.325322618470585,21.919676197892958,1.3962601807865256 2000-06-02,9.883455926915287,15.68223990680751,23.55051142784166,3.096874061491484 2000-06-03,9.620210682084195,15.403670378611023,23.90096819125178,1.5169271006214604 2000-06-04,8.801530122544081,16.645087323789323,24.1987589966488,1.547312767864966 2000-06-05,9.392526720012809,18.077558063499293,24.4356923368315,0.7233747377536697 2000-06-06,10.004604031513445,18.627746658272926,25.17458151059728,0.46069170905895596 2000-06-07,7.831780853218504,18.8812285869467,25.034859291714234,0.8265345643482445 2000-06-08,8.407159727379833,19.148622445170403,24.964092882274457,-0.6090231331994169 2000-06-09,8.832025623328205,19.2999845857807,25.457526718459004,-2.099332127313692 2000-06-10,7.809902666843925,21.603606220867576,25.738825748455625,-1.8768475506059459 2000-06-11,8.641115785987296,22.669017216056957,24.65650640352117,-2.1348451611808015 2000-06-12,8.224962545881224,23.742197955449956,25.592069019397766,-1.9168465185880759 2000-06-13,7.127999771398554,21.593235643420993,25.780156154047,-0.9816098356148008 2000-06-14,6.948601428369489,23.61713228925721,25.232101314920396,-0.9665356368981436 2000-06-15,7.179798797563664,24.112484947981873,25.960950350276715,-0.7098338579882738 2000-06-16,7.830854136363416,24.268147951876166,26.693042133639967,0.8543621754769323 2000-06-17,7.16942557820811,24.283511069714866,27.84563070777805,-0.04385806986290541 2000-06-18,5.833189070627421,24.54761694202242,25.490612633145354,1.3714890818858605 2000-06-19,5.221038181116551,25.96716446665566,26.023140650222174,2.4423950508779635 2000-06-20,2.399678760444473,25.561175367362324,25.36834559988582,3.745926784015115 2000-06-21,2.789530651743388,26.690624542090163,22.73665300115234,4.1049855060824765 2000-06-22,2.7894067574409966,27.497562498634245,23.032477897815987,3.8377930335737447 2000-06-23,2.3526852037623716,28.186427250670825,22.437502109065175,3.593745668443482 2000-06-24,2.3311992293589663,27.96727171123694,21.102074212310793,3.0110904939362753 2000-06-25,1.7086289746141758,28.236294049683842,21.811370719867746,2.8430238262086394 2000-06-26,2.073369161586631,27.840676881716735,20.31268290458233,3.141576768902143 2000-06-27,2.370706594681833,27.820349288608504,21.141336110056045,2.1350927559919928 2000-06-28,2.869761695875994,28.37612119823523,21.311436952949666,2.66601966673135 2000-06-29,2.5552348884986773,27.35605884659218,21.565830200635574,2.2468375983112665 2000-06-30,3.523177381492901,27.36728022882054,23.205409219782727,1.1708787655507367 2000-07-01,2.801525178565796,28.281353392274006,24.64712491179292,1.085958161905498 2000-07-02,4.400879271324683,28.10303831892765,24.03633119633691,1.0309654111091573 2000-07-03,2.7659920381840344,27.43600166970747,24.065686814324874,0.287548618192656 2000-07-04,1.8322097623720381,27.952738568786508,25.624814521355045,0.14752476220055608 2000-07-05,2.295497801428439,28.582961498330867,24.699466516005156,1.0557103234760539 2000-07-06,1.6658803010032985,28.38546005960531,24.45383769550146,0.40560520177752235 2000-07-07,2.998144552635987,27.73026101688902,24.725112109510942,1.9846369415988088 2000-07-08,3.9632909165821646,27.642001317634058,24.381952672072806,0.5574601267247323 2000-07-09,4.134759050274844,27.595850856462686,25.085812457963176,0.41363059153047543 2000-07-10,4.446264352583322,27.788856617056663,23.264845387128837,0.6527139796082968 2000-07-11,4.820931512811497,28.35273113915803,21.30204523475498,1.7294713879695405 2000-07-12,2.892334555992507,28.881401591612182,23.205129829440523,1.3758157814900343 2000-07-13,2.672926021541038,29.86677107566537,23.97507411406382,-0.024994231475178097 2000-07-14,2.006061608120694,29.308120575992195,25.129666860349683,-1.0183533759195336 2000-07-15,1.0202480875764233,29.58644936518391,26.039903887467762,-0.17004577941968035 2000-07-16,0.21936764440011225,29.114852710950785,25.600804003071577,-0.6372749077866224 2000-07-17,-0.5061559018576326,29.927706242443612,25.498021837922945,-1.9146316192701727 2000-07-18,-0.5341380107818693,29.790541490131183,26.981886804637007,-0.8201056183818443 2000-07-19,-1.9595906256869196,30.741077778854372,25.93175805028763,-1.3937115337985775 2000-07-20,-1.8769480540289099,30.758014503331754,25.339767156374393,-1.4181836402175902 2000-07-21,-1.5850925217351888,31.006052787798648,24.89853495789603,-2.285711287708623 2000-07-22,0.21320755494892674,30.766810174475083,23.21068705373322,-1.9572175758465562 2000-07-23,0.3267060558026272,31.011763231512628,22.42621939778488,-0.683080664960575 2000-07-24,-0.34000255124895645,30.440068221736396,21.63218656224683,-0.5436139018664645 2000-07-25,0.7597286125744731,30.39827098971702,21.659300177291428,-0.15303628987808415 2000-07-26,1.3388022518909684,30.14505600376375,20.875104995105183,0.018975896605463227 2000-07-27,0.01978435473113782,29.009398622000198,23.03131837691802,1.7215691583229125 2000-07-28,-1.0486067742067922,27.07174048228657,22.533245563043298,1.4190536336297508 2000-07-29,-1.0427260317352698,27.386781848195955,22.50559454156711,1.5538770517935412 2000-07-30,0.10631761686902186,27.510440170723253,22.315168815038533,0.7202305375241836 2000-07-31,-1.5306659737326738,29.607732426372316,21.815629130365274,0.05223654951929202 2000-08-01,-1.343576317730149,29.931649400946775,22.013732572064278,1.6064329764030632 2000-08-02,-0.7256977633699521,30.04036202294028,21.951833186402173,2.1113898145155154 2000-08-03,1.627270211206819,29.814276366238477,22.2874929203075,1.7376360128722492 2000-08-04,3.0980324860381483,29.45822124884931,21.03847884188657,1.2089247958935645 2000-08-05,3.5492510951147507,28.856347125726487,23.026772675531667,2.1325061395509186 2000-08-06,2.7644626282313802,30.194916919808474,23.184191989869777,1.3443634525320158 2000-08-07,3.102231761320587,29.841701304794487,23.445798224686826,1.9349335252181317 2000-08-08,1.3226122240034146,29.335951840028695,23.54843984272162,1.2830058581289192 2000-08-09,1.1686398452072704,28.930482700033476,23.114609999366895,0.9121967448522725 2000-08-10,1.825851418989115,30.229435749730175,24.930880757393115,1.876758563379624 2000-08-11,2.2930566298212827,29.97822072662784,25.37464106458355,0.23838215520962414 2000-08-12,2.486691913126857,30.002318251722198,24.372893205857462,-2.0640175846613236 2000-08-13,3.5529452766109335,30.827285222933185,26.25583490661103,-1.9328541245208488 2000-08-14,3.839550380871044,30.10895056746847,24.736816590278195,0.101799209921835 2000-08-15,2.020742153216613,29.270300586202303,25.70331219314334,-0.4300593565570169 2000-08-16,0.43027672100375614,29.754357860946975,25.6651853430416,1.2571523859980007 2000-08-17,-0.45661011823856956,30.652404822996107,25.329336965882252,2.8049792270210614 2000-08-18,0.5232576759084343,30.209893008968276,27.621246571795613,2.3882946677016688 2000-08-19,-0.605878366953413,30.035476792850563,26.60523915369789,0.8511317070779694 2000-08-20,-1.5040868804914953,31.044012283098013,24.274127123299444,1.8413474269388612 2000-08-21,-2.309078735506744,28.555349924960822,24.798705933264834,3.035632347848898 2000-08-22,-2.9889780740289456,28.724707730785468,24.253193501941645,5.911239026158834 2000-08-23,-1.1416749021392618,29.536247255308258,24.965909148231706,6.185883510447938 2000-08-24,-0.6507409432605924,30.590522448965608,25.686707028235556,6.543494567980154 2000-08-25,-0.7305966518473951,29.31540694388016,24.609675301812988,7.567526534233766 2000-08-26,0.636054452477329,28.628345269172325,24.677882745072004,7.597610760319354 2000-08-27,0.3878817612275197,27.923175008839323,23.973389394469127,6.1042023186361325 2000-08-28,1.8153413726606127,28.137890814433185,22.312449666548883,6.237468043941574 2000-08-29,2.443936033663786,27.580256962916817,21.790543229605216,6.305675056817472 2000-08-30,2.1093446672116354,28.050787270042516,19.66459384218875,7.060788553322078 2000-08-31,0.01706525200896758,28.68093060502336,18.212371306928425,7.351832783130473 2000-09-01,-1.5107167381453157,30.21832031734569,18.391907906302396,7.847340046506086 2000-09-02,-2.3641966628128857,31.831680421780995,18.535490793230323,7.002701393905596 2000-09-03,-2.7215747652719964,31.478040034502587,16.51106674490523,7.282699742649361 2000-09-04,-2.2644419414262456,30.177247940057942,16.088741929794107,4.853377479015617 2000-09-05,-2.427146545939115,31.036039797500873,14.326194217666165,4.565185770745056 2000-09-06,-3.638230361883371,31.452011707483745,13.94801679886225,3.757978140681942 2000-09-07,-4.36615344514553,32.56028932496935,13.826210156495454,3.7343926025984415 2000-09-08,-2.4750558418623676,32.40297577432034,12.722901830442948,5.0315071324849185 2000-09-09,-2.3446281092705434,33.01521788059914,12.415689496321479,4.45389287656483 2000-09-10,-2.207495747507607,33.805082739751256,12.407200513943673,6.940973084753254 2000-09-11,-2.5377333094040306,33.689902716527264,13.916305937582313,5.654035629397407 2000-09-12,-3.7566090818046414,33.437133009510006,13.618161354603462,6.023946176921353 2000-09-13,-4.243875068878356,33.08827299269769,11.383153035897127,5.273621597675394 2000-09-14,-3.195819771362531,32.4297158896498,10.600465244250358,5.1868570234902975 2000-09-15,-2.6071887586682165,30.26295166083127,10.964965912069554,6.451070658028057 2000-09-16,-2.663723188288643,30.924739315555023,10.353149785813528,5.407035075804448 2000-09-17,-0.9481423570728393,29.733297963367782,10.109849434777361,4.296319760862568 2000-09-18,0.6650310167318914,30.112314901768617,12.167214326290145,3.959374398072914 2000-09-19,0.9554397293851269,29.705389477938674,11.638490977102508,2.3350169965920595 2000-09-20,1.3940909170719036,30.310607521854827,13.204743984775758,2.1087443888865125 2000-09-21,-0.11523770340613426,30.774431561589264,13.786630700345995,4.950186779145337 2000-09-22,0.005607281270906789,30.288643732573043,13.140966320501786,3.543031059553729 2000-09-23,-0.2898761383644297,29.904879854691576,11.948811633248555,2.793670186332765 2000-09-24,0.2098319992100054,29.38018992482331,11.524764626327707,1.9402845156175716 2000-09-25,0.2212391650193721,29.242747460476323,13.005042834412045,1.217047702147644 2000-09-26,0.6517848345560792,29.82571726764486,12.883534189999706,2.0142263505820406 2000-09-27,1.0146619459616577,28.603514915893438,13.542998896359311,0.5115239956201252 2000-09-28,0.04716450232743519,28.95221169463816,12.864015149586177,1.0473714414087074 2000-09-29,0.281544099965402,28.117088040946125,11.93204198444298,-0.62792469598587 2000-09-30,0.03918537387600096,30.085594993213565,13.156151815200667,-0.9300149303281362 2000-10-01,0.32314242208090854,30.124642672280142,13.732717299831663,-2.5367740074623315 2000-10-02,0.41372760036661593,29.380998540058105,14.610526197003978,-1.0421888651178415 2000-10-03,-0.23037470940107507,29.867983970362243,13.61294768022897,-0.5539925296873014 2000-10-04,1.40614626891553,27.99020428880305,13.911671054016837,-1.7780163149811075 2000-10-05,1.4604050361584158,28.13452714053033,13.657072823604993,-1.3101227860184093 2000-10-06,1.9423693908370048,27.930350695690237,14.878773440047201,-1.7887428421086753 2000-10-07,2.477733020139749,28.072784972499928,16.71301239120095,-1.3961347958234347 2000-10-08,4.053863705312072,30.06932368399505,16.540611474468,-0.30125121641111763 2000-10-09,5.7091376206270095,32.39387457370714,16.12034471220906,1.046938802628549 2000-10-10,5.233666617986685,33.937793271906926,18.236535100490574,1.6333738738602788 2000-10-11,4.442991988906787,33.79366802443033,19.4951946076699,0.9006012122077734 2000-10-12,6.916316253477124,33.13251343968089,20.577883326434808,2.472773425173729 2000-10-13,8.302273277847124,34.57608076950681,21.428197590393072,2.114817381270857 2000-10-14,9.622279052978287,35.24489788193609,20.941516416207616,0.9567965878554645 2000-10-15,10.37518654352972,36.324152211375214,21.48853000554736,1.7430477301167677 2000-10-16,9.505521012214846,35.58572572732208,20.94170176062655,3.5102632195364207 2000-10-17,8.637696847404687,35.46263775707059,19.237829852569536,3.0959723668068704 2000-10-18,9.631320370410078,35.12271792844478,20.766051010238456,3.8155397520424312 2000-10-19,10.762039910082265,34.88911090042456,20.807759766623516,3.499487718027089 2000-10-20,10.28735093234845,35.56747487677994,20.15604441718233,3.2470082204676958 2000-10-21,8.328558974370203,34.902597623022785,19.529846667946188,1.7825007960433024 2000-10-22,9.422037874046259,34.13024501698661,19.644145583333824,0.8508667694452217 2000-10-23,8.35916246184058,35.03814048437553,18.91134295176759,-0.39919890322325946 2000-10-24,7.85695213385609,34.656124334941325,18.19311665806326,-0.21204742166169777 2000-10-25,6.9016648029051835,32.61811342949467,18.7212564502174,-0.2266455733618595 2000-10-26,6.4229100220600435,33.56846976628876,18.488436888337485,-1.7509184234865736 2000-10-27,6.598909106707833,33.70512753177329,18.590111316377556,-1.6071948905262454 2000-10-28,5.04836756828696,34.9186305746746,17.800318707634332,-3.2740081387995605 2000-10-29,5.635269717140604,34.29746015225312,18.85626820124721,-1.1371878998933718 2000-10-30,7.131205662676704,33.48974417664093,18.01982503365355,-3.0823391531288724 2000-10-31,5.903048093024534,33.72465230570068,17.070955479736437,-3.643464247833706 2000-11-01,6.952020594670534,32.624522328129046,17.1453707076917,-0.8087911801318408 2000-11-02,6.8322542694170005,32.73953741649748,16.976774546660288,-0.7386045548816833 2000-11-03,6.414867059386957,33.13881634949875,16.315036725716606,-1.670319502391392 2000-11-04,9.648522424807556,33.20883923815546,15.710458181219849,-0.20029969850728468 2000-11-05,8.100666994778846,34.107377325574134,16.786709817023098,-0.5671780615937969 2000-11-06,7.466284263484471,33.934406828382194,17.509046046983975,0.5419384614275347 2000-11-07,6.872295757698674,34.03370383602555,17.899916677232675,-0.5975973165513215 2000-11-08,6.190853284790896,33.44773694298671,18.004914015228742,-0.9104722816523558 2000-11-09,6.559697261375895,32.5094809993407,17.632642625310048,-1.37387125836737 2000-11-10,5.768562623867928,32.435861271417124,18.206472732523906,-1.401550855075286 2000-11-11,5.694716270439078,31.61035141173944,18.5340924396973,-0.9967285971686273 2000-11-12,6.404737652937556,32.08225776224555,18.330880138440605,-1.4103470790736483 2000-11-13,5.530091039113547,32.501992098994855,17.150062486965584,-2.0464554919988065 2000-11-14,6.291021074946932,33.147967517984405,16.782948192844454,-2.6642744074486133 2000-11-15,5.65926628802209,34.682444560272636,17.650711325955335,-2.2229976623812457 2000-11-16,6.836504314569369,34.02715066942684,17.285550344758434,-1.9100968614772105 2000-11-17,6.49082178877653,34.175158531570574,16.4062410344927,-2.891262667455245 2000-11-18,6.51898516838026,33.13220760534176,15.78417098558323,-0.865389284582887 2000-11-19,4.720253051768519,33.47628151823707,15.208082801657978,-0.45543097044132447 2000-11-20,4.6140501050909455,32.93534890147391,15.418052801974238,-1.4173152142835697 2000-11-21,4.975070534964408,33.06774034469862,15.838299795495823,-3.7139936599031085 2000-11-22,4.5995349529921565,34.100045669074326,15.282758862444979,-2.4201656617683325 2000-11-23,2.9647965452972063,33.489841149352245,14.292096467712833,-1.5770554390296798 2000-11-24,1.4488087887632668,32.60487738882424,13.72562467398418,-0.7760389893552174 2000-11-25,0.7857304097873958,34.159021216163396,12.192361513449347,-1.852669688998052 2000-11-26,1.8227428185458476,34.98722565369984,11.610574029215455,-3.691701014016226 2000-11-27,1.2095960857059744,34.31905010702731,11.679664938432694,-4.497899320155682 2000-11-28,1.6252753833276978,33.50826615571004,13.342972760747209,-6.409068952508173 2000-11-29,1.8973800742956177,33.8017829108419,13.315068796238666,-7.237557531542729 2000-11-30,2.8122925950081594,31.73757779969329,13.697981831310923,-6.259158360925601 2000-12-01,2.109196351628598,31.98731704791361,14.099446258863901,-5.284865832765974 2000-12-02,1.8797076691427381,32.48579600254712,14.11967234963866,-4.388469583160566 2000-12-03,2.898903743009314,32.4398676118068,16.063858754975655,-4.51423622308419 2000-12-04,1.8971151982416654,31.892581734803123,15.095562057584319,-4.749383252697157 2000-12-05,3.4086519916769964,33.773598151799476,14.332677122819684,-3.5619576252291476 2000-12-06,3.695024533357371,35.456276037501546,13.230376238471115,-2.9401304088434967 2000-12-07,2.5447826539894116,36.04304525824002,14.17946377286752,-3.8190518843227945 2000-12-08,2.4870352634712916,36.531393822851626,13.72110943043385,-3.8835714739684315 2000-12-09,2.1763121366233253,36.91002916166499,13.351255195942626,-3.0347784448201356 2000-12-10,1.526602996123768,37.60924637233787,13.620559822848227,-3.9634583641383188 2000-12-11,1.8705708644400159,35.66154487480452,13.686997769479891,-5.2043920800500825 2000-12-12,2.082853481880052,34.52463879783045,13.308583559856903,-4.0241592166014275 2000-12-13,3.5535688537199803,35.120836937645194,12.731567799005958,-3.4622335970692353 2000-12-14,5.0032951236190915,37.33404749147878,13.029118211867944,-3.3149606720476754 2000-12-15,4.719246524896127,37.54769468561018,13.888566234246424,-3.6610814682537547 2000-12-16,4.848509131744804,37.80784247651826,14.10662738300523,-3.274269549904657 2000-12-17,6.812081444424473,37.24936995213407,16.141116576285164,-4.3041891601464295 2000-12-18,7.411197177250875,38.79639143569782,14.582673961599161,-3.8918303475247322 2000-12-19,6.867133120406276,40.280945177517,14.60939398811954,-3.975515274228677 2000-12-20,6.447908381513658,40.821501852874405,13.875240808636264,-2.434757858855649 2000-12-21,6.261628291291947,40.363736747902955,12.59327212784628,-3.80261026115985 2000-12-22,6.318450496202979,39.54253478942314,13.428694833203817,-4.833787312833712 2000-12-23,5.6998811142158985,38.636632934354694,14.264728511691004,-6.791656548194617 2000-12-24,5.79138499661303,39.59527105619955,14.868899097567816,-6.1469905706015435 2000-12-25,5.8227706025913815,39.52404025000739,13.725143266207116,-4.812609271586917 2000-12-26,5.522277411306711,39.58715139265423,13.026614186196776,-5.95429243504954 2000-12-27,5.1252791106221744,39.48162100584306,13.221426963837095,-5.617170197814992 2000-12-28,5.281168750409122,37.93673789128844,13.880637383230905,-5.780156073693906 2000-12-29,6.155794805756146,37.823932596626435,12.730532506591276,-5.4062506979029745 2000-12-30,6.905760961285683,39.217744640578026,13.414755563331608,-5.620324186579249 2000-12-31,5.829716748002931,39.98228767720026,14.885742811331173,-4.617363934885923 2001-01-01,5.503759241033415,38.837057608132625,15.177865866242735,-5.913056473595754 2001-01-02,4.749099421721323,39.91428171310104,16.532487067384967,-5.478569841422457 2001-01-03,4.868060312736191,38.09794224325348,16.916700607303508,-6.343231088657781 2001-01-04,5.729959754590219,37.06516549591992,17.212200296514368,-6.958278870025686 2001-01-05,6.10544165063909,35.547060307368845,16.37956740902512,-7.277361718965547 2001-01-06,5.968553227306868,36.02560102574818,15.909601903697968,-7.238978301044576 2001-01-07,6.228308656801743,37.28483543895409,15.711064029754182,-5.073778866802961 2001-01-08,6.009931490914014,38.3406145704957,14.532559380534632,-3.7120989601163457 2001-01-09,5.001906794635207,37.83614977796834,14.663646515663967,-5.178665760442101 2001-01-10,4.234086551116151,38.79961106498149,15.223315917786763,-4.549970878358602 2001-01-11,4.824591184542143,40.16600842328058,15.832533301595355,-5.327490283981912 2001-01-12,5.121036306149883,40.600711943412456,13.732940720659045,-3.7593360594683385 2001-01-13,6.086490347263575,39.290150752257496,15.123380269667344,-3.4127096999275146 2001-01-14,6.381686885983614,39.37028501118378,15.04928722254484,-2.339245684928096 2001-01-15,5.9453042951686825,40.44526904687712,15.533281772316103,-3.032588734511112 2001-01-16,7.094112382760026,39.80620826867413,16.371965879219022,-3.2309535548945085 2001-01-17,7.699328774271717,38.877851604440465,17.566494915960096,-4.967141224306974 2001-01-18,6.015528289556153,39.197792353843894,16.30777498380241,-4.097480517381565 2001-01-19,7.2590165459288745,37.15708062709677,16.77593386242204,-3.6399664279227566 2001-01-20,8.017673910375056,37.38989234944849,14.43824421469447,-2.589396960476566 2001-01-21,9.343944324470346,37.333384658679925,15.803354723655652,-2.0623416708055267 2001-01-22,8.724534976824865,37.45737864724276,14.144641912326056,-1.7774125145099076 2001-01-23,8.535467750176183,38.01950844664745,15.140865577011002,-3.3632736728484627 2001-01-24,9.57416262716742,38.83955723024873,15.116220096691823,-2.6265929891824142 2001-01-25,8.191171468845342,39.01997181405083,14.648585694059179,-1.8328456882217434 2001-01-26,8.522745324999962,39.89247033151156,13.461449708288079,-0.6159791234988099 2001-01-27,9.139735372315334,39.70777527557298,13.812120579453557,-0.8274296297414019 2001-01-28,8.050153859106077,42.37686005605794,12.803572814924047,0.12847298304555133 2001-01-29,9.054822449464972,42.10207171901224,10.477316219804955,-0.04215232046648515 2001-01-30,9.81680934049161,42.019990749002275,10.38911612652563,-1.4906654514810573 2001-01-31,10.613210591617001,40.91717016318322,10.762225553079572,-0.9219500415872485 2001-02-01,9.970409532094344,39.27424166304476,11.826460150961811,-1.7723785505102314 2001-02-02,9.383097560504423,39.890021999226676,10.570829643838184,-2.7382360154105942 2001-02-03,10.979944010865815,39.7496723561291,9.032692519513137,-2.9904608630857217 2001-02-04,10.094434655148,39.51441401562851,8.135254317899985,-2.314627111405503 2001-02-05,9.558828967412577,39.885506998248665,10.8736088285529,-2.472037100853699 2001-02-06,8.759627790068018,40.841535107720695,10.746531785405862,-2.398140639961323 2001-02-07,9.974858659257224,41.866326937657945,9.303851673083935,-2.789817056255607 2001-02-08,9.564408031411563,43.23383043292772,8.433757229755376,-2.142652594093805 2001-02-09,7.785265948283871,44.30987953352701,8.740921820075988,-2.349720400832668 2001-02-10,7.917715302437031,44.42927817328894,9.003736078920669,-2.488111921340998 2001-02-11,8.845630850237582,44.615399539643036,7.135804841044616,-3.10149513613374 2001-02-12,7.826062662332,44.680277277511195,6.661381990866838,-1.7408945264697353 2001-02-13,7.741823163421331,44.582602130583645,8.565384946277106,-1.6578941805120164 2001-02-14,9.454276881616645,45.34354394932076,9.866479809689208,-1.6507994030497963 2001-02-15,9.67718913209644,45.37882305929622,10.258057599834483,-0.9897655236424074 2001-02-16,9.521890672587546,45.98822488519646,9.334558934222262,-2.2739334726705955 2001-02-17,9.553173067762343,45.78765996902022,9.02673543324078,-1.6927450278337233 2001-02-18,10.322412157036895,45.2654098766201,9.730422519159188,-1.756770731870258 2001-02-19,9.929881852023957,45.20977454386577,9.041031590997544,-1.4088854885073885 2001-02-20,10.645925258287829,46.71665589010275,10.206129503746208,-1.3318761851917964 2001-02-21,8.09267471368495,45.77869373928036,11.21233717586592,-1.3334302587773128 2001-02-22,8.529098667468299,45.856406204369264,11.824016229046656,-0.37013300776765756 2001-02-23,8.489682218339077,45.79495833436979,13.23140292336489,-0.7844702476696286 2001-02-24,7.529914136705415,46.227323684932834,10.72795194083732,-0.5287273080077751 2001-02-25,7.04525560564469,46.28186291301922,9.672421213893964,-0.8397824442322461 2001-02-26,8.280298743369022,47.94284637556163,8.656166667392558,-1.688198892336031 2001-02-27,8.556647466059124,47.44160643691543,7.1454138199158725,-1.4598199638550964 2001-02-28,8.578617911181269,49.062322236389576,7.132490481075853,-2.9752499043040053 2001-03-01,11.187826322880614,48.56929684649752,6.402998844469964,-1.7036304902179271 2001-03-02,10.914051098325006,49.77404499521681,6.968478233778134,-1.362882059225329 2001-03-03,9.918668865213371,48.456979153437096,5.358971479124497,-0.15312136327253367 2001-03-04,9.353798610652667,47.006631118365306,3.0310849474207644,0.9450575303721889 2001-03-05,9.819002706153224,46.73592905933224,5.339065022661875,0.8478186297207565 2001-03-06,7.790153375814229,45.79889524774911,5.5447273810591975,0.8173729692857029 2001-03-07,7.98147462086624,45.451268848738664,7.020654325530547,2.2212110884108953 2001-03-08,6.6844336912126066,46.04186478672286,6.283586938942015,2.244967304932588 2001-03-09,6.336198270608848,44.472221479796815,6.296791403867259,2.5104489483688157 2001-03-10,6.63097251741894,43.775164620979034,6.7886675930865055,2.05468778803315 2001-03-11,7.606529197277977,44.480121570558886,6.91884457315605,1.272852637502114 2001-03-12,7.47766339424638,43.79254539367369,8.195929065619083,0.07493416094515304 2001-03-13,6.586928247364026,44.3571737941997,9.093204040728109,-0.5028599963329772 2001-03-14,5.826192078434472,43.5499394259071,9.99354146478374,-0.7621939732357105 2001-03-15,7.4018180811932455,43.502708857733346,9.352389699530363,-1.10520371601202 2001-03-16,6.479902386438396,42.21596157318356,9.590661044388806,-1.5919095101167033 2001-03-17,7.337014582144868,41.88132845913287,11.87255757147825,-1.716683319541024 2001-03-18,8.160968250740204,40.585577193385454,12.519304792512001,-0.379628160292083 2001-03-19,8.869861485331036,40.18858776963871,12.165578595262954,-0.555790521124762 2001-03-20,9.859730345143332,42.16335110007273,11.639383941877536,1.3692076776609905 2001-03-21,8.897643572659891,42.51724111284834,10.279935983863105,2.211650498128079 2001-03-22,8.519252826154739,43.59460452983374,11.30579403329277,1.0048379978724031 2001-03-23,6.461676587892454,44.25872715084234,10.36190423887616,-0.0027527022142526114 2001-03-24,7.1893241361547515,44.28530741643795,11.165134814685551,0.6482504847886178 2001-03-25,3.795394874324143,44.36730922352451,10.179542782892211,2.8517771702960015 2001-03-26,4.059857770819444,44.29951074387277,8.927749875362114,1.9599737166633546 2001-03-27,5.018494593856667,43.04646307487682,9.88580732656835,1.6474539467274267 2001-03-28,5.710835252869395,42.651535851838666,9.056781326106547,3.033687553498492 2001-03-29,4.701561241064543,40.74385630764689,7.785115911651568,2.4548281135190546 2001-03-30,4.695560058165707,39.68131039682319,5.835108964170706,1.9386437199274469 2001-03-31,3.6612450350423007,40.265878308986174,5.818453952050944,0.1245182468420043 2001-04-01,3.289318853104147,38.725824382485676,6.0126479578171015,-0.6836352510303799 2001-04-02,3.437104627678082,38.833754270875986,5.397662148394684,-0.7699881437961346 2001-04-03,5.894475272491338,38.64739991587407,6.332634955686869,-0.33686946737775453 2001-04-04,5.6342728145458985,37.19469404719815,7.48225814430536,-1.285296047958924 2001-04-05,4.1747401953983285,35.805595387002576,8.85751110178433,-4.048387274732211 2001-04-06,4.78570516980969,37.474937144610614,8.884990387483631,-4.337643101986636 2001-04-07,4.025904049757645,36.37689436344344,9.982437123453153,-5.069924892708605 2001-04-08,3.0857427339695596,36.46256363314862,10.69853853468743,-5.316152948106565 2001-04-09,4.3871572592287595,37.34425306472257,11.496088675156775,-4.3278988259467255 2001-04-10,4.17709031539995,36.7113015775191,11.410575180944242,-5.927386162295745 2001-04-11,3.533894881103011,36.49829823899763,9.87727642292794,-4.985409705786665 2001-04-12,5.26789740792387,36.09755713356517,9.915516298184237,-3.2711758669244473 2001-04-13,7.272622158107572,35.452595779517345,9.973569938639521,-3.540063916081792 2001-04-14,6.818334437067443,35.07098987286739,9.161810839650542,-4.2983994081281605 2001-04-15,5.639857847266934,35.312370443702,8.086262000790798,-4.366262160356343 2001-04-16,6.622572365067461,35.725490159504226,8.847982814438616,-3.4894975196325584 2001-04-17,6.267391818318139,37.37768399992513,7.950733301609649,-4.130423401840357 2001-04-18,7.684369874411013,36.70402167778688,8.424367397648535,-4.400959973479237 2001-04-19,6.431940236828805,37.07790811343778,8.632955596796311,-5.417966081520497 2001-04-20,5.7481576799402445,37.21020081783609,7.479939099738951,-5.480390832316415 2001-04-21,6.359701001966415,37.37702330292177,6.617562000426278,-4.506493559193894 2001-04-22,6.390319425942261,36.661064990080305,4.9392906962243295,-3.8409464185933047 2001-04-23,6.30585643567213,34.80117989833214,4.122876950163264,-3.4021189546546213 2001-04-24,5.261589054587135,34.53764634419672,3.495238182963558,-3.3839655187979854 2001-04-25,4.9631902067821985,36.153393781970905,2.925729909534172,-3.5430576826240894 2001-04-26,7.24408705041926,36.75131835465713,2.936941214326243,-4.144060775581072 2001-04-27,6.494259749788092,35.42872502538154,3.6867503103912393,-4.047052534528475 2001-04-28,5.3749663378684565,35.00553194176307,4.159364539140776,-5.728521696388672 2001-04-29,6.166688170970863,35.99351557155161,5.113498145423908,-5.427566521698036 2001-04-30,5.570884202869149,36.00570483190867,3.750537971644571,-5.146700471833744 2001-05-01,4.886048540892621,37.15469318528586,4.154631275643921,-5.038653456043438 2001-05-02,6.004045239438712,34.79333669283303,4.49720044430367,-6.986512551261249 2001-05-03,7.070822242731794,34.54864307464261,4.443866286148105,-6.410770946151397 2001-05-04,7.411081230457838,35.189416376545914,4.573013241568688,-5.832139625954165 2001-05-05,8.712435137295554,35.95726856030186,2.239807091396822,-5.915201408462183 2001-05-06,7.308815429974141,36.510458435568296,1.726369203437974,-5.194228577075178 2001-05-07,6.070402229119733,33.92389647080908,2.534298878316303,-5.15343285385748 2001-05-08,4.651959877501636,33.698282812786786,1.4365790834200494,-5.601152237596341 2001-05-09,6.018666575196271,34.09463006065813,0.2855904509278897,-4.4957609075474805 2001-05-10,5.619889494987087,34.6697235090068,0.20448404974065548,-2.0000342113861773 2001-05-11,4.016039797105803,35.086085935247496,0.34202571969496265,-1.4025521958322869 2001-05-12,5.784417757074931,36.93663632156356,0.6429133264008617,-1.265742570614966 2001-05-13,4.870431671566766,36.66883742228078,0.5287310162574627,-3.3346377392373894 2001-05-14,6.414323066027149,36.680893212813395,1.0481626131599744,-3.6603171268856998 2001-05-15,4.811579314517346,37.13694059960904,0.24682079440809745,-4.140189664084867 2001-05-16,6.329847378141981,37.320333072788564,0.15877011006685443,-3.940946479842947 2001-05-17,6.650437841338878,38.3037367191814,-0.3581531272692858,-4.138363746466476 2001-05-18,6.434138934466488,39.96764379959397,-0.1865880203408835,-1.708027735170937 2001-05-19,7.121354697491109,40.7033581412744,0.2005274087230241,-2.296103700969136 2001-05-20,7.052233735404124,41.85733951752085,-0.03969029616157255,-1.9121717103562397 2001-05-21,5.7280052388672456,41.30160189566895,0.7529231735674311,-1.408152806621656 2001-05-22,6.198222682761453,41.53743497537792,-0.023386246458385385,-2.641057993237446 2001-05-23,6.032326980585774,42.67681167982284,-0.6586148848644982,-2.7806014091142592 2001-05-24,5.272543514235733,42.958416120509355,-0.1688237691888298,-2.3590796608542886 2001-05-25,6.200457329304364,42.608333572325556,-1.491406813718549,-2.0223485556795184 2001-05-26,5.485286971604739,41.857639331771786,-0.928411388525098,-2.612198311413846 2001-05-27,5.065737633463403,40.81706362525795,-2.720978452849484,-2.0939853526647143 2001-05-28,3.8949012262880904,40.80464055795699,-1.157146831364241,-1.0372399316361116 2001-05-29,3.4019128216165377,41.5915843325676,0.9039854772931055,0.5653547108154782 2001-05-30,4.296999696142689,43.64331420845798,1.350298976048592,1.8430632599976462 2001-05-31,5.227858380624231,44.876903572273385,1.4796030818908916,2.415660087667727 2001-06-01,7.241739757513007,45.07054159410103,0.3925648965875894,1.965701029987127 2001-06-02,6.516440511274152,45.74732714007582,-0.06748830738275224,2.475512088576453 2001-06-03,7.475543344020313,46.81306507630798,-1.1989424155196802,1.3119262959979554 2001-06-04,7.756711403697438,47.377107488996536,-2.153612988929183,-0.2537477139888984 2001-06-05,7.876012797416326,47.45377395057983,-3.1485249679675493,0.06786235201777246 2001-06-06,6.395389575241579,46.45684146412582,-3.8525434538482823,0.5982910691239244 2001-06-07,4.948380707446779,47.04840642136096,-5.034554675583366,1.91591381765768 2001-06-08,6.516036828812734,46.25995677505605,-5.659497309753919,1.834781191382645 2001-06-09,8.011770658588155,45.698130079852916,-6.366843278364281,3.28758866656937 2001-06-10,8.536492915161,45.411732427833186,-5.837096595496406,2.9052361502399537 2001-06-11,9.788544749734298,45.392557060947524,-5.859295663317769,2.596906268821889 2001-06-12,10.108224414111833,45.187687841977144,-6.10728135706201,3.357074576027342 2001-06-13,11.521725629655736,46.421193011979206,-4.179453550711494,1.2369899961222615 2001-06-14,12.313890670421582,45.58314161179958,-3.326634824449587,1.6643316609829184 2001-06-15,11.743920165235254,46.2419907890654,-3.554419186277347,0.02681028830151022 2001-06-16,12.113727370943968,46.87080668466663,-4.155527790883372,-1.4606514339845647 2001-06-17,13.283632160327851,47.084229812138446,-4.79882458798544,-1.6879079346703887 2001-06-18,14.699230741170608,47.108593784038796,-3.732385206003809,-2.745451979511262 2001-06-19,17.051816367508824,47.58517212148085,-3.139805332609535,-1.762930913632614 2001-06-20,16.379183953411495,48.726248769111486,-2.861358968776531,-0.5635729319340519 2001-06-21,17.36786287277621,49.06522683694911,-3.4629443087781464,-0.8412134935190458 2001-06-22,18.2456058562286,50.21790605822649,-2.2017005850612015,0.38588578867300716 2001-06-23,17.809522029305192,49.05690111634313,-2.183208466991686,0.3575287031306816 2001-06-24,20.12971648440929,47.13076502871244,-3.7050570509964813,0.7053795417806439 2001-06-25,19.232835539303696,48.237362213880154,-3.8758451599027883,1.682394878117429 2001-06-26,19.81523612294692,48.24135112139976,-4.277840652209914,0.397924627131905 2001-06-27,18.747145620105186,46.67180824256726,-3.8402108126540546,1.392811011037913 2001-06-28,19.772971948198823,46.15218647956734,-4.105977292826318,3.7389018580130964 2001-06-29,20.21542676822067,45.90023804923704,-4.370249832840907,3.264091711001159 2001-06-30,20.441173632737883,44.77046234771771,-5.260659541951448,4.679498590916183 2001-07-01,19.50599110060455,45.15071494786337,-3.364552571528444,5.101736948346838 2001-07-02,19.92210068628597,46.371798377979836,-4.999820232918162,6.002929329048421 2001-07-03,20.865315544501186,47.094489949091894,-6.454073483249345,7.284713512379213 2001-07-04,22.241544427229886,46.09257522572897,-6.134848294762016,6.626684794257475 2001-07-05,21.64225973161916,47.69006773488919,-6.492959958529439,7.533049010562264 2001-07-06,24.022492022859733,45.38274263675027,-7.84982825378053,7.877804717675486 2001-07-07,23.218268459310078,46.42927623846366,-7.072038738849694,8.538848917794882 2001-07-08,21.687690647532076,45.81441877829073,-6.328952702676829,8.145315706118462 2001-07-09,21.900608197961873,45.40454003399529,-6.496799246871805,7.184393296281362 2001-07-10,21.42524868333816,45.740808994891985,-7.025231812243674,7.09282260721037 2001-07-11,21.461451783762758,46.54951727441347,-6.7360628853893925,8.57563596908803 2001-07-12,20.895365504204694,46.76461914083249,-7.041937890759022,9.233049725576086 2001-07-13,21.149772382153714,46.32789058759868,-7.807794977646855,9.91356212904093 2001-07-14,22.881664721883972,45.54246332923202,-7.127408280953732,9.081352545052653 2001-07-15,23.74376337458775,45.58123425833129,-6.172618040850636,9.660653681890139 2001-07-16,24.398925543250392,45.49846061765798,-6.163515393450108,11.282754198246534 2001-07-17,24.308746634342032,45.00035983938308,-7.633508044106203,10.605061773565588 2001-07-18,26.025916788052427,46.27420951174518,-8.506791203262754,9.195047374399753 2001-07-19,24.65834242218863,46.933074778767136,-8.923403307687872,9.414702279660565 2001-07-20,25.1664990097308,47.9994789873878,-8.671163300784135,8.81583660235834 2001-07-21,24.250050939577644,47.85533900863291,-7.192541962090887,7.09847287156915 2001-07-22,22.93227974046609,47.14874169290698,-6.158253248451907,7.047057847937398 2001-07-23,21.63856379820883,48.84590516060836,-4.682301793176009,6.55985151962216 2001-07-24,21.280039018881137,47.67025631830912,-5.184956724387783,7.515261598237492 2001-07-25,21.23011082105756,46.643571475004926,-5.12022163972382,6.282171055305274 2001-07-26,20.716918063658635,46.55905353173742,-5.269448102881972,5.606688943145051 2001-07-27,22.50006532332666,45.04177065674524,-5.449999986108431,6.502627788939263 2001-07-28,21.817315277182736,45.79138537000093,-5.121289394279367,5.533145217562909 2001-07-29,20.985247948859904,45.95511012109547,-4.09760381090152,5.198543082771671 2001-07-30,21.3071123829849,45.99196230014856,-3.9884855687094243,3.292534020091904 2001-07-31,21.348821141401036,45.17880602020121,-4.618542616834704,2.1894013012062983 2001-08-01,20.01678347707029,46.525766682360526,-4.732608684853011,3.6932547472998136 2001-08-02,20.60453198312471,45.42813477796693,-2.3872356405416757,1.7977922416423802 2001-08-03,20.186997740249936,45.64217900918244,-1.9197086202830007,1.8156057582396883 2001-08-04,20.096346937180535,44.24697697378764,-0.17571271497977525,1.004883258762427 2001-08-05,21.45483784238316,44.6252593891575,1.4599794892586726,1.9353661101364699 2001-08-06,22.050879323517737,44.163398842874145,0.5138891180581563,0.6767868068257494 2001-08-07,22.39580192342688,43.50430107385971,0.9780741092882546,2.4909986966187176 2001-08-08,21.88162538580478,41.19195613580194,1.2901151352886289,2.018817774914541 2001-08-09,21.403815961572036,40.88590368753567,0.026357617751237683,1.3651260325960464 2001-08-10,19.357708279000477,41.05840524906586,0.09000677358246024,2.9877539026366025 2001-08-11,17.68196318733851,38.983989852938414,-1.040288885422477,4.1839742533442585 2001-08-12,18.451828203050965,40.78838840216401,-0.8108939221532018,5.105038447777475 2001-08-13,18.842254888722067,40.60404335728947,-0.46955840382660297,3.5401474167970033 2001-08-14,19.67445377216017,39.68833968057459,0.9837843436371037,3.89911318920948 2001-08-15,20.929846115015714,40.5755510987299,0.3672028456165646,4.264076754432711 2001-08-16,20.563453369142348,39.62573786377112,1.513699638630786,3.1445035698460115 2001-08-17,20.791395344107535,40.0652590931714,4.155810550562947,4.317098643863133 2001-08-18,23.025416221782898,39.8969282078241,5.899518789108212,2.347438407009628 2001-08-19,22.11025973395954,40.97238795114011,5.501799711037425,1.3510793030321748 2001-08-20,20.30296259688794,39.51812772281622,4.035162076177294,0.4652138062088844 2001-08-21,21.159248974907374,39.212473915984624,3.907905467238036,1.7348903090364318 2001-08-22,22.41271722419443,38.16965495069512,4.2269923615194305,1.8029957415954694 2001-08-23,23.370762386816583,38.128987664596096,4.817887537942197,3.4476334261427475 2001-08-24,23.39865245157923,37.112715315272055,5.789281534035388,4.6208132153853665 2001-08-25,22.587501718344054,36.017128188933604,4.084071970433094,5.367200785109356 2001-08-26,22.04615893373234,36.41224094162227,3.459526586055366,4.106597900293616 2001-08-27,20.622250438191966,36.80652894019266,4.3623699769423325,4.77653953835057 2001-08-28,17.93698457461201,35.75945862800698,5.680785761478584,4.036970294277948 2001-08-29,20.004777718921243,36.52982316522839,6.688139565602747,3.9219149257388435 2001-08-30,18.6453425502581,36.756031519945836,7.519895846862774,2.704345933448382 2001-08-31,19.947482067008558,34.901216321602874,6.008466932690479,2.237933931363923 2001-09-01,20.119260211740304,34.820367421327504,4.88205752544923,2.8301081178840137 2001-09-02,17.60187925136328,35.88061327298548,2.2162615729876918,2.209776403071261 2001-09-03,16.610610475923977,35.93619209114575,1.9089617498096954,2.7802122077474305 2001-09-04,16.06563810380965,36.734470322630294,3.6496980500560454,3.240850157631392 2001-09-05,16.119821587200278,37.49451303129608,3.4692473438351246,2.2757379622112914 2001-09-06,15.211687551814192,36.007960047705886,5.4519200414830165,3.943664341233613 2001-09-07,15.52656456590484,36.2396550326748,6.371518489515928,4.405808869105248 2001-09-08,15.961693382842913,36.7900474450611,6.401726040965582,2.8455463024103986 2001-09-09,15.523253433495318,36.18853821637606,8.124530284506095,0.706105018092916 2001-09-10,16.15647167569631,36.384159608278,7.829616663510789,1.8684551457465841 2001-09-11,16.247609434258536,34.88907001629428,6.472135027737518,2.8496795214930475 2001-09-12,14.7640600136661,36.77444096966613,7.191712300760361,4.327583636977895 2001-09-13,14.647611810359285,37.08691800017282,7.843156939197244,5.011175319525444 2001-09-14,13.820882289300906,36.76362877954573,6.888026155412114,6.1903910765301315 2001-09-15,15.554074598239085,36.567712894799286,6.483908625624182,6.141066742470061 2001-09-16,17.1246702155433,36.14426812391266,6.010345774814487,6.675127594955661 2001-09-17,15.031040780836754,36.04794927471214,4.872753245981915,6.9509490568026 2001-09-18,13.135695670949072,35.200289847980294,4.574720921303576,5.660480336177954 2001-09-19,13.095259708304514,36.67846317775179,2.143850481650452,5.657418857070584 2001-09-20,12.572986615355811,34.39929869757946,0.012006418488002879,4.8999810023096755 2001-09-21,14.73747222375775,33.99306009535053,0.7613611984126266,4.038668087920326 2001-09-22,14.70560642188863,34.36018196787965,1.6376867513253615,2.9757057790881114 2001-09-23,16.7948011843013,33.45319584628983,2.2778461611501695,3.6614953542252597 2001-09-24,14.282746323062895,34.14415277603675,3.0251591797321327,3.9810939121619326 2001-09-25,12.192386501104234,33.6043382530136,2.5005799630917735,4.180583233368246 2001-09-26,11.581088511562495,34.48753596020976,2.3268468572088237,5.590657593860188 2001-09-27,10.290955361791374,35.37385157075069,1.095094703464643,6.108270582999626 2001-09-28,11.190330286046546,34.69704864152425,-0.16003199380815158,7.3312787569316065 2001-09-29,10.120957679221396,34.421746730880436,-0.3188848018165986,6.480690084683598 2001-09-30,9.926648588102807,34.174168072854926,-0.161212212870652,6.278168400193447 2001-10-01,9.090564692681966,34.18793562235047,0.924337668896479,5.800324962555544 2001-10-02,8.177699790532774,32.32660767299672,1.0328092439311174,5.629548867910504 2001-10-03,7.20485473197292,31.37108517048915,2.75955343182485,5.834141727262782 2001-10-04,7.333230672584123,30.718787118392946,2.999065913114088,6.330372168384675 2001-10-05,7.272435125000071,31.505114317306564,3.3962588436530883,5.949595796120247 2001-10-06,5.388572438893376,30.910176632069575,2.132818240110166,5.34552823863928 2001-10-07,4.979547116826041,28.626733093259396,2.6718877425965055,5.614893186068739 2001-10-08,5.469281381943203,28.657600195607507,3.860021257544177,5.275719751914943 2001-10-09,7.139019134846588,27.693310620469965,4.166048393872201,4.907706003576247 2001-10-10,6.955831923333832,28.4688044889625,5.086768382252009,4.919464254384534 2001-10-11,7.724979927613988,28.594546984918146,5.384887070994737,5.238666756900844 2001-10-12,8.38989248693278,28.84110668863768,5.721419896663913,5.912988520900096 2001-10-13,9.485649648816233,31.134714291370965,5.2162308353141364,5.2422000384360645 2001-10-14,9.313799079611528,31.352237204811964,5.640223464319817,6.153005438212147 2001-10-15,10.025224525774586,32.05319756603353,6.339991401615621,6.174268077615479 2001-10-16,10.167213171238682,33.278719719129825,5.246845996794679,5.960132996993025 2001-10-17,10.666265911250743,33.31411389616121,5.405342844230312,5.7505754013307975 2001-10-18,9.283598186074402,31.927487672864206,5.516717215922956,4.880573880159396 2001-10-19,9.681523071874086,32.04771256970985,5.058255254144909,4.634965202540383 2001-10-20,10.572953195107623,32.165696670401374,6.095538235322544,5.936679165143395 2001-10-21,10.115922901386925,29.977096333960546,6.096645604535091,6.766254824374065 2001-10-22,10.373639278184417,30.439737697776973,5.134233439657428,7.663586326736239 2001-10-23,9.614212101742554,30.649015777194187,4.38612690405915,7.398579474124356 2001-10-24,9.128096824297524,30.11356884187269,4.917964139019769,7.447493424605999 2001-10-25,7.014246930570265,30.104553796469407,5.2034909230914455,8.738485059585354 2001-10-26,6.896531681053483,30.706778411445907,4.254512539962511,7.868569905991297 2001-10-27,6.4909015347367225,31.713520385117086,4.7275642970982625,7.744201681354446 2001-10-28,5.525015287169337,33.566595729494836,4.57688958095721,9.08990678232884 2001-10-29,7.259720970780395,34.50933313257515,4.661102425877593,7.829850040179414 2001-10-30,8.95676689429814,33.910711077933954,4.334181472841326,7.350474704315262 2001-10-31,7.958955375534687,33.51407228604175,4.7546183655294385,6.110134502655738 2001-11-01,7.775763604899158,32.85619107315497,5.126600897997341,6.386568173650255 2001-11-02,5.354087451178011,32.758783917540974,8.009557972004105,7.146008348684198 2001-11-03,5.715224089165379,30.818672215162692,7.81014963430976,7.669121316990013 2001-11-04,6.165000916881531,31.626593548994496,9.147362329356257,7.383649932303651 2001-11-05,7.691193317095612,32.310354371011606,9.098295765412017,8.59152960655298 2001-11-06,7.124394703287769,33.16944856092169,9.310022052299677,7.727128677380049 2001-11-07,7.462365647272176,34.142828114422954,10.698111427154062,7.813592106107745 2001-11-08,8.601863615298344,35.797284815962975,11.622889886853866,8.423878043668202 2001-11-09,7.034853781100065,35.47743942707177,11.795925824853516,8.364388972647289 2001-11-10,5.007850089770884,36.18517025176995,11.800663273701641,8.606567268453619 2001-11-11,4.67778407456656,36.437734539915006,11.47543003880114,6.981837235969836 2001-11-12,3.9522283611136784,37.21625131123837,8.901768721059176,6.242085889733706 2001-11-13,5.233270630550338,37.242561011899255,10.042395177655061,6.836226798636365 2001-11-14,3.1954464436329557,36.88055278114155,10.578093639747197,7.628366778812605 2001-11-15,5.133025156050282,36.115588435121246,9.764194620097268,9.031801699893997 2001-11-16,3.2424052932235985,35.821487095129136,9.009090578394622,9.982648838056573 2001-11-17,2.54437207149554,36.48040378035027,9.731958610867233,10.395194579941188 2001-11-18,3.8425491966883945,38.298173476108566,9.844921259994962,10.135368723477375 2001-11-19,3.463809029910597,38.38701900960285,9.943574086767649,8.374158658502902 2001-11-20,3.003493404205702,38.450757392333244,9.194506131238223,8.032654561606783 2001-11-21,0.49997556524864706,39.06552771472796,8.413976750182034,7.488254534404179 2001-11-22,1.8158109558175592,37.94771302748708,7.662215294395902,6.929888580848436 2001-11-23,2.015776402322595,37.81981584860048,7.645994737831494,5.598514384492379 2001-11-24,2.7314676339524686,37.930244972751545,7.756601952251432,5.67984968558005 2001-11-25,3.1793213731299184,36.33795917386623,6.879282729447501,3.1956460227679364 2001-11-26,1.9691852239551177,36.542082532412785,6.403533107248284,4.283995612185605 2001-11-27,2.5570208935345478,36.84874627676283,6.454158156472656,4.537733610818396 2001-11-28,1.4474560345136513,36.03453821309129,4.908828884016277,4.487446469644824 2001-11-29,1.0076397689718746,36.15202517475637,4.420684943098645,4.556813414447545 2001-11-30,1.7744858931398975,36.345317068092875,4.799490463832136,4.768689547169646 2001-12-01,1.9665052947852013,37.44543020664677,3.138287679859522,4.052899726794386 2001-12-02,2.9708380367448237,38.76489161899656,3.724012028132707,4.601591694872982 2001-12-03,2.7773562403456538,39.141449318843016,2.7264423965197158,1.7435974544655473 2001-12-04,2.9002842127283595,38.237781143441744,3.6709972563204407,2.356448858126527 2001-12-05,3.3515666865963127,39.07559111507514,4.12277005615349,1.573125110828986 2001-12-06,3.792505092361262,39.90795151924473,5.173556920082682,0.6743804848813841 2001-12-07,6.418381053136979,40.28692702703778,5.353708100534751,0.06090705863093282 2001-12-08,5.773557793595471,38.20966300477103,5.055460625165453,-0.39715016025802163 2001-12-09,4.92888868571851,37.861353551440985,3.5837303461218193,-2.77302621456779 2001-12-10,6.58352125456431,40.00006694205309,3.2794150474983845,-0.6812886222779171 2001-12-11,6.9554963936971435,40.45560449826505,2.5705480987905815,1.0247728996252317 2001-12-12,6.456295664449397,38.4719720865536,2.2815173497109082,0.983828322572829 2001-12-13,4.502536594951016,37.13252024816027,1.784959089282794,0.5486071920032354 2001-12-14,3.9133532089626697,36.36344674262464,2.317579380753239,0.3182188031299043 2001-12-15,4.795946138619068,35.595725483195835,1.1939904557737826,-0.07390355490003964 2001-12-16,3.8646775968863185,33.878257783946566,0.6946971420381081,-0.1363240148225787 2001-12-17,4.35251071351477,33.84938881631695,0.361762129092673,-1.9861839424896588 2001-12-18,5.336101124906457,33.16889128349531,0.060439061993427745,-3.721129559996364 2001-12-19,5.790273656735723,30.798640647941006,1.4426649550766992,-3.3529952711873694 2001-12-20,6.787094353556743,30.344102145071925,0.38749249436540456,-4.806376307657324 2001-12-21,7.279483018451908,29.319227315477143,0.32857846293200565,-4.0126952050950875 2001-12-22,6.979069293438342,28.742614442933995,0.19222428564386654,-3.024760288974022 2001-12-23,6.520835934934696,26.857952544564466,-0.22987497789166658,-2.2733848995930037 2001-12-24,6.350892052303508,27.20386567139706,0.5597612528517497,-2.807635933992452 2001-12-25,8.137900517509772,25.808535868897817,1.731797941821206,-2.5842194058344377 2001-12-26,10.001860490455707,25.70973275781972,2.6242290729781983,-3.04895346278716 2001-12-27,10.808576642189355,25.2109844889432,2.4795768863446055,-2.1791978327736885 2001-12-28,10.48451284907984,24.20512019213274,3.2910611290695386,-1.4213432475120804 2001-12-29,10.077406048460626,24.176986664155642,5.628902730293397,-1.763848883189749 2001-12-30,10.083099195641207,25.931795163548195,5.127126871710569,-1.1557476434614666 2001-12-31,10.196701928507858,25.045674600210074,4.338069373509712,-1.8450757904530484 2002-01-01,10.689919121805428,25.41473599197034,3.208511622898907,-0.7646420442656194 2002-01-02,9.594098927833956,26.61957284324243,4.536014543528835,-1.001068787798294 2002-01-03,7.920381754642914,25.598045605287787,3.754068880958656,-0.16748986987130732 2002-01-04,8.986087367784773,25.38244160592386,2.8256188982458137,-1.6630552513706323 2002-01-05,9.591771545419267,27.198761878077985,4.099647112640453,-1.581195326602402 2002-01-06,8.553303712201847,29.082828155319312,1.6004801730561917,-0.7293760000407856 2002-01-07,10.154103629177968,27.93689794311821,2.859310077223836,-0.4691147202276215 2002-01-08,9.84370639117641,27.705784259144156,1.3496078462245293,0.5771350013195786 2002-01-09,9.649059621094738,26.661915133372673,2.041404766903204,1.6845607769528905 2002-01-10,10.477283428998144,26.327471997797478,2.5250237685456147,3.248569789841186 2002-01-11,11.321021570913143,26.48593448776489,2.792654885557721,1.5600144007901415 2002-01-12,11.365138169505988,27.50619315164108,3.9925868367806596,1.6754713459940438 2002-01-13,11.182982355751683,27.972600056176347,4.083567060319916,1.875435844554914 2002-01-14,11.605304702691456,27.22459537038456,3.1570895006560162,1.4306405738538053 2002-01-15,11.886070965146832,28.047443635987985,4.959477047365752,0.9611986012238944 2002-01-16,11.344889396189414,27.910550290882725,4.7462984194751225,1.177765566796905 2002-01-17,11.817902849915049,26.900885606396297,5.114516350287483,2.108592388396763 2002-01-18,12.033074950408423,26.30615364874709,3.0138095925134607,2.4653129543859347 2002-01-19,11.471603209993084,27.4472862678701,2.057392755798387,0.9917070450544387 2002-01-20,11.803166035561677,26.740809019814062,1.0610426351570963,0.25070757095191964 2002-01-21,11.00680343895195,25.631066005950878,1.1417631822855003,1.6369549129928171 2002-01-22,11.168829537103628,23.946430157825723,2.224700950190509,2.6642312047931807 2002-01-23,11.752096380840724,24.860308039390528,1.6333651630117694,1.5057723840145951 2002-01-24,13.825033792000404,24.883735481021155,2.283760174253172,1.7171933268546526 2002-01-25,12.717499209141229,24.84831789175078,2.302885038095152,1.7749144040408376 2002-01-26,12.007070541037791,26.116826045022492,2.6783831017289095,1.7759664597262848 2002-01-27,10.555882775486218,27.931256542853987,1.4030633893214015,2.2018581553987486 2002-01-28,9.83964570690923,25.899690129956696,1.8011486624683264,3.0525747931785547 2002-01-29,11.817029492759874,23.83555725027891,2.986397256468427,2.2855841950879245 2002-01-30,13.051911006658028,24.733486826639076,2.2543240695920517,4.264499874158733 2002-01-31,14.515619793013853,26.16901986661303,0.7863571762239832,3.6317766165430814 2002-02-01,14.408794136562705,27.037381001865583,0.7966814520523282,4.762060168381849 2002-02-02,16.209018270653413,27.648317835712902,1.1666464717740983,4.7317021891337685 2002-02-03,15.619200470397415,26.8041279246084,1.3136682970452722,4.30649341986076 2002-02-04,13.919737203778118,29.58295170657461,1.591445776816705,3.9801178549485705 2002-02-05,13.71022611701179,29.609714287010576,1.2602534853897156,3.265645956963732 2002-02-06,15.95268179673183,29.808616268393965,2.998457920977617,4.722723442926996 2002-02-07,15.498285614865635,30.814533386422205,4.9059681103581205,3.619342640314645 2002-02-08,17.504453921175376,30.756211039107992,5.527312505969254,3.6505056562486367 2002-02-09,15.992528353456201,29.643659863128423,5.251539242356751,3.6877125561470043 2002-02-10,16.75325677321116,28.438811630625718,5.848664519213557,2.618055241294819 2002-02-11,17.597672455746153,28.07648689823622,7.216089063314505,2.5832634738845086 2002-02-12,16.613104751170244,28.27334078842121,8.544573120601457,1.429952387904851 2002-02-13,18.51927709085085,29.357348527416825,9.526713604741241,2.621487211749681 2002-02-14,17.89163369924528,30.33273766199842,8.808478557029451,3.917756202668185 2002-02-15,17.19310385229297,29.729901739424395,9.404345335527928,2.858085203280367 2002-02-16,17.735318180791896,30.79225336112216,8.277346857285885,3.1079088924713747 2002-02-17,17.550435514592756,30.18814091270696,7.797482203664662,3.5025109880927876 2002-02-18,19.261254793349835,29.88434550333386,6.6747640743856,3.7007836132616125 2002-02-19,19.269368731051067,30.49582079236815,6.911211501298462,1.789365957925391 2002-02-20,19.170733475205747,30.44135659151587,7.283488976504449,0.025290215143180195 2002-02-21,18.807469138617808,30.822833043495734,6.7598341685693235,-1.485725726364241 2002-02-22,18.00157636016067,32.0640193820913,6.619647082577677,-0.4347485410189438 2002-02-23,17.592438682083017,32.0585688575236,7.605497444545715,0.6946626307081651 2002-02-24,17.56655403990463,30.957309110137015,8.101580401468567,2.088576134725284 2002-02-25,16.3508592574412,29.725923117882157,9.707684274249821,3.5725994255801474 2002-02-26,17.446538075348204,28.198926378178278,11.416184399681054,4.103912608507612 2002-02-27,16.79072183684228,27.802353166231434,11.19963286581051,4.38830501170036 2002-02-28,17.127139747276612,26.736405917350236,12.044642530161608,4.0402118618106595 2002-03-01,14.739470014716254,26.336281536678403,12.396514845602569,3.0648716740446793 2002-03-02,15.123598227658546,27.316126629218957,12.702859063894334,2.604189305563034 2002-03-03,14.384815875591913,27.154577735819732,11.92042876491194,2.6152406388201186 2002-03-04,13.904490539943499,26.78602272267983,13.293275884385183,3.3467256142947237 2002-03-05,14.321352702179388,27.106235746792198,12.278435065119172,2.6700307559236944 2002-03-06,14.19505368939179,28.277110992548433,11.165647770945897,1.9866165700479868 2002-03-07,13.461231190438657,28.856344775831953,11.854601467456353,2.6392460644994333 2002-03-08,13.793070898258534,28.09866545737333,12.83010688402014,3.8734527359510444 2002-03-09,14.684924914181366,27.77417491614185,12.678285219298525,3.7660900055223583 2002-03-10,13.876013085260876,28.394363311641655,11.212252732527489,3.8347639115435554 2002-03-11,13.082032123404636,28.402960944394607,11.138805015894338,2.632912704741756 2002-03-12,13.74558361188228,28.16617619485997,10.90675742160813,4.065479607292243 2002-03-13,12.984688187050914,27.054652929135987,11.573950405944512,3.923352128475163 2002-03-14,13.06323775085511,26.2343899445405,12.841773895922739,3.7520911998612583 2002-03-15,13.466322299366809,26.465554926195633,11.722720908314344,4.490403169082323 2002-03-16,13.2155673964832,26.687412112344568,12.880846875224123,4.010009412867779 2002-03-17,11.428149939997933,27.83873599200323,12.895633929735467,4.158552247002115 2002-03-18,11.45319031729109,26.342492398251984,12.955679304772996,2.9686776271088915 2002-03-19,12.579711190560085,26.357776503325656,11.615214905310093,3.025081380427287 2002-03-20,13.587209849767195,25.944692059041067,10.825359046961303,3.7338626107286004 2002-03-21,12.972056088504601,26.18850849678151,12.01676127042493,4.513200846937141 2002-03-22,13.24671561511398,25.295200901869624,12.022807404278907,3.4517805953095673 2002-03-23,12.509050390128522,25.61774741261698,12.945302797521041,5.432146899876614 2002-03-24,14.037258835480136,26.26948285199573,13.073500345140685,4.775338129738009 2002-03-25,12.666308517923007,26.84566307311888,14.117939470532246,3.0133910662674976 2002-03-26,13.733835846849214,27.65681582678881,13.491433107825694,1.589899508528846 2002-03-27,14.505090081370776,27.32723121680477,13.916010418828211,0.9880396299957898 2002-03-28,14.362280470120792,25.34023944801838,14.125040785972258,-0.7589766904181171 2002-03-29,13.655201069940619,26.11401141372248,13.52798236403561,-1.4767580228425818 2002-03-30,15.719704354648371,26.413927744874677,11.21810130768026,-1.4332706601337704 2002-03-31,16.286990070691285,26.155626359211016,11.593136407217171,-0.6933188969414769 2002-04-01,16.454233437615112,27.130208504380384,12.214884937550895,-2.1365996184016463 2002-04-02,15.560937841801671,27.068420828826838,13.529101461721785,-0.4018667344574205 2002-04-03,14.905382657388849,28.4479799159111,13.071488122692857,-0.4769883564960634 2002-04-04,15.950384769627545,27.44687746812985,13.022607081893103,0.6839740583933734 2002-04-05,14.671488513494133,28.905938025405224,12.828013147879563,0.6789671805939411 2002-04-06,13.966780031730826,28.70737270079127,12.86894654332806,1.0588878517004554 2002-04-07,12.594950666265452,27.735879538583763,11.499126715065978,-0.3765757641543317 2002-04-08,13.228017617798992,26.248904362406723,13.031937915154803,0.29287392425806624 2002-04-09,12.125310650985936,26.32995205592232,12.16053516272806,-2.058434992677148 2002-04-10,11.484714153480095,26.096095568367314,12.60282230894352,-2.4505961127484603 2002-04-11,10.35621331876515,25.416527388468353,12.074359291819592,-2.0980631289569738 2002-04-12,8.544720545568236,25.799605080737606,14.935345553090364,-2.9113824199966847 2002-04-13,8.80114758352938,24.86790349883602,15.680345484931152,-3.7050444795330777 2002-04-14,9.002973216524854,23.162325692998962,16.652626018234994,-3.6062697446180225 2002-04-15,10.861481085187354,22.37884732308538,18.408671934502657,-2.970103579969206 2002-04-16,11.66259704069192,22.21354299490792,17.738942723016343,-3.5112381877582215 2002-04-17,13.226468386181205,22.531476960130302,17.454944971715953,-4.105744455074736 2002-04-18,12.81060008472868,21.751106500165147,16.42949269852332,-3.702953725306473 2002-04-19,13.120856554963687,21.95817360935196,16.585716830016192,-1.962439167788851 2002-04-20,14.335417458085772,24.037149439520682,15.074854453613902,-3.6010444345677244 2002-04-21,13.803817477659859,22.200198875537115,14.974844382379937,-4.939567632834501 2002-04-22,12.918492513209467,23.577325758611618,14.957711787908552,-4.750253631056477 2002-04-23,13.927166320266743,25.34851121964118,15.416924324995987,-5.593316350617263 2002-04-24,13.481626676659856,26.526161840367195,15.894788711564217,-5.330446676611626 2002-04-25,12.789173783589384,25.689254007832538,16.684387445427195,-5.695881088186041 2002-04-26,13.143154918088355,26.398382975344024,15.966448627505713,-5.148092507767889 2002-04-27,10.858242256361695,27.086114133301262,14.657376300849954,-4.997160888447258 2002-04-28,10.574950585462906,27.945672865912442,12.765156316190534,-5.815988159096735 2002-04-29,12.714528729065602,28.004439150704652,14.008740263381346,-4.961481939482251 2002-04-30,12.770695694880656,27.365722474420767,13.966451954123785,-3.5597916358986414 2002-05-01,11.731599525940894,28.9322607165133,15.799266236184513,-4.1414203555307605 2002-05-02,9.669709800542748,29.08903244269035,16.46375297260826,-5.096430665079807 2002-05-03,9.327151795389685,28.043479288787438,16.26072177728403,-5.310974190432107 2002-05-04,9.52156721480844,27.668996386088534,15.563818025311388,-6.897324130460747 2002-05-05,9.79308643514307,27.38728831770673,14.510374314380842,-6.437694474620948 2002-05-06,10.184332380334032,26.97369551452054,14.54010920571053,-6.038183895042181 2002-05-07,10.699168515424507,26.47664185747897,12.807456938183936,-6.99623334230132 2002-05-08,10.007212294297283,27.55742736439412,11.422298894460827,-8.822065909280923 2002-05-09,9.26174029032253,28.036768694998965,11.562035284173263,-9.932658841996707 2002-05-10,9.436959792110368,26.557153978968476,10.950119747425907,-9.229265727323403 2002-05-11,9.31810551209856,26.111808672097013,9.638679122406781,-8.81024186011419 2002-05-12,10.750526974657664,25.486214400296447,10.70876083218376,-7.5176843512564195 2002-05-13,11.321230488588014,23.648490643487133,9.485408000406519,-6.655247652836403 2002-05-14,11.275875704100967,23.140124458804394,10.92855348362898,-6.576682765332052 2002-05-15,12.95712459353934,22.38353339665763,11.941382232450605,-4.967616877222564 2002-05-16,12.248430001666142,23.08109933742369,9.779346445418867,-5.854865734347349 2002-05-17,11.324922664029282,23.875941529585532,10.415709788072984,-5.606904259904223 2002-05-18,12.122108599483465,24.912429165588808,10.88943587948652,-4.535983560894385 2002-05-19,11.69902597430822,25.432699212451432,9.721246630458278,-4.306624686424766 2002-05-20,11.943583147752586,27.466853010695843,8.556792949375048,-5.491997272009451 2002-05-21,12.334404490936313,27.65275674587585,8.234127377257918,-3.973073641420297 2002-05-22,11.95040569918204,28.491723557363976,8.199534153589676,-2.5338040118355236 2002-05-23,11.62783998607484,28.5128928018195,8.993423345353676,-4.069758110565735 2002-05-24,11.872101151048936,28.07260665832784,8.812303662940465,-5.052279071252547 2002-05-25,11.773706875946234,28.440010672505903,9.70589340652998,-4.633435226979444 2002-05-26,13.108499711558697,27.556461761035855,10.855589120145043,-5.941853586912831 2002-05-27,12.0481664957758,26.385007840972804,11.306624351727667,-5.9507499305388825 2002-05-28,12.509317127037148,27.18840584792781,10.987911655602089,-4.892036503246576 2002-05-29,12.440362246080163,27.734944739343145,9.016870773459686,-5.693549435679297 2002-05-30,10.433390638204324,28.977192429894945,9.189227356537156,-4.704866559834118 2002-05-31,10.718927999059517,28.107149790233876,8.168235219856758,-7.028384738464581 2002-06-01,10.085341305497199,28.842424689144643,8.020840818866137,-6.893638556327868 2002-06-02,9.206725227119438,30.48380196765894,7.5039439984414384,-9.174397574081443 2002-06-03,8.846559165589301,30.981962369633237,7.248750877251425,-9.104509962655387 2002-06-04,8.888680473913597,33.34656625590518,7.735011033162237,-10.238317507031354 2002-06-05,9.566085883073804,34.55505856730992,7.513690972671664,-10.94935343914638 2002-06-06,9.190860001584868,32.812065324250824,6.721009501931841,-10.728663420541686 2002-06-07,9.658962465171763,34.21945420028826,6.430334004642834,-10.953286262922742 2002-06-08,11.295490650543456,34.248064650478995,4.879097398133197,-9.989312303784917 2002-06-09,10.42326436284071,34.14781727168654,4.95019703533814,-10.133056305244713 2002-06-10,10.647765382249757,32.94846341182883,4.956664854936064,-10.793823298358387 2002-06-11,11.78470788847655,32.01605863026069,4.189287953041459,-11.430786537887592 2002-06-12,12.943698163599894,32.55406151090813,3.354332205213647,-11.689974814737639 2002-06-13,11.580850133854055,31.989630784154066,1.801398246006962,-12.501886908467899 2002-06-14,12.048561706946161,30.726189126451025,2.0894838568338154,-12.178817303331435 2002-06-15,12.922722323795506,31.075733345796788,1.3388961261219579,-12.455841721597755 2002-06-16,12.52431941401089,30.75152180364699,0.7718647942812498,-12.05331743843885 2002-06-17,12.518104898695523,30.50988353137339,0.3225671561040728,-10.739613534232857 2002-06-18,14.412395257925871,30.9405266434762,0.25524718802247487,-11.325342454995996 2002-06-19,14.74502773590649,31.829009998288424,-1.1668597777996166,-10.535606405569817 2002-06-20,14.447490337126334,34.12628709461956,-2.659546936186314,-10.282883971455774 2002-06-21,14.519829896104769,34.388191867781266,-2.53457107738429,-10.059157769380164 2002-06-22,14.769606564124159,33.77885481762409,-4.35362531124184,-10.059941477019535 2002-06-23,14.750896321347,35.02279264006916,-4.593316416142507,-11.977694377548302 2002-06-24,15.620122074557317,34.152552072177855,-5.123494112733322,-11.504261814895683 2002-06-25,15.110189306866802,34.270910725422986,-6.315753016144846,-11.43654014277263 2002-06-26,15.572644217365465,34.86542327360858,-6.138160115997585,-10.549386081816513 2002-06-27,13.817049810010605,35.779483881911624,-7.538563395914298,-8.729817633253129 2002-06-28,13.855331749765847,36.36225666285497,-6.397645862459288,-6.421098519319523 2002-06-29,15.526814951461668,36.367227423118095,-7.129256240579685,-5.99123455814731 2002-06-30,16.55044417010993,36.91690779193136,-7.882067718138321,-6.79491772959829 2002-07-01,16.29313950036167,38.53028107390204,-8.394676915495785,-6.841597211505544 2002-07-02,16.71744050205574,38.04216082084981,-7.971067485786059,-7.565735591578952 2002-07-03,17.06339277288392,38.07391109927163,-9.089494823633862,-7.768585298371256 2002-07-04,17.126488233053966,39.75621973923622,-8.600867239714665,-7.121565882513259 2002-07-05,18.4165042852927,40.985689181579176,-11.224292990419032,-7.591857260168251 2002-07-06,15.678335722718924,39.82781060470543,-11.412249236224755,-7.28934321286441 2002-07-07,15.485694643471085,41.15225101065243,-11.738356057877045,-7.36040959957595 2002-07-08,17.58976214553273,41.23026682389081,-12.056891682878446,-8.225514184085066 2002-07-09,14.901497551491783,42.5308935354459,-12.823346019394009,-8.740668038506401 2002-07-10,15.601482664689224,40.05967870214433,-12.327190759781859,-7.47782657829943 2002-07-11,14.429365677798643,41.16276252428984,-11.370333175438093,-6.674118760668368 2002-07-12,13.013982140546934,40.9685525322976,-11.138047443538696,-8.249293577275509 2002-07-13,12.234528402076585,41.99896850980836,-12.234172216853727,-7.6898335615731215 2002-07-14,13.491918221915382,41.637639355127746,-11.887670393216263,-7.191110717646542 2002-07-15,12.810221794558789,40.312317716967854,-12.698383239786313,-7.470711388043519 2002-07-16,10.68430168258815,40.29622613365533,-11.439005518755927,-7.71783690846085 2002-07-17,10.706703845464045,38.53806694851405,-11.402237304992,-7.536038708320455 2002-07-18,9.96884792397063,39.05941545371626,-11.007715572290168,-6.315572357670579 2002-07-19,8.384497308643468,39.00410333276353,-10.176254949525807,-5.7655179473328 2002-07-20,7.635155879746959,39.62203958055446,-10.68203645743873,-4.876403143824458 2002-07-21,7.044269548901373,39.96745559908217,-8.963261556387462,-4.478585405175618 2002-07-22,5.440403198597859,40.069312273033475,-10.036552412097038,-3.16749870932824 2002-07-23,5.193792480028816,39.95123832700727,-10.722226938863702,-3.680682875052285 2002-07-24,5.391805554509913,37.93326763965943,-9.31206942834531,-4.557036028904821 2002-07-25,7.244183136450595,37.12345447970758,-9.948271031493793,-5.136550820981748 2002-07-26,5.941221425721547,38.684472357238796,-10.516456230551142,-5.089875757621646 2002-07-27,5.8035612437885575,38.94759170332479,-8.67355211861242,-5.463898339311037 2002-07-28,4.9353128486824245,36.99514283267967,-7.841840631121893,-4.408786658940581 2002-07-29,4.599145290593492,36.58009194946813,-6.940737815128477,-5.265388256832939 2002-07-30,5.684265210536131,34.81401280297974,-8.222975084630166,-7.241342526825129 2002-07-31,5.389854996638964,34.298514497964746,-8.289803572648644,-8.023878560476035 2002-08-01,4.871408685419849,33.873230354809365,-9.019943474828336,-7.309372805572734 2002-08-02,5.254181242622788,33.840439651698084,-9.771536727530998,-9.969860945616436 2002-08-03,5.0208448821851075,32.03754717423421,-9.95092594002853,-11.500686608265262 2002-08-04,5.2477397478492485,32.29465959939723,-11.113548548063944,-12.0042349821777 2002-08-05,5.084995696067859,32.0989393499066,-11.902875858983554,-12.527471183479735 2002-08-06,4.134466073803749,33.398995443972,-12.844725306114908,-13.383119021601267 2002-08-07,4.63098141739135,33.26886228410422,-12.426265239652592,-13.38947138879173 2002-08-08,2.3544527703361977,31.621973933840373,-9.8501665104472,-15.712814865728404 2002-08-09,2.476136066452763,32.313506728658155,-9.575573848569352,-14.521308894683987 2002-08-10,1.7470208954616067,32.668219013673855,-11.881517129199898,-13.195898740655345 2002-08-11,1.3473246134147396,32.88235099581321,-11.527136903935741,-14.105424632145395 2002-08-12,0.004038859167979636,35.3839008492724,-11.019736568821536,-13.490448530602986 2002-08-13,-0.4084972188642606,35.80448149977188,-11.807074838962235,-12.529605787188325 2002-08-14,-0.12495307239637626,34.56515273419395,-10.906779639212761,-13.128378116950811 2002-08-15,1.4270408684702627,33.91257708697841,-11.070600344121555,-13.848145953447434 2002-08-16,1.7791910323769193,34.1682116063228,-11.55247804265041,-13.207706136825347 2002-08-17,0.09685105547829087,33.8090157031248,-13.019434572084243,-15.456041387996406 2002-08-18,-1.2548498624655975,34.24354958946149,-14.092918128778546,-17.279872289329404 2002-08-19,-0.8667997509007747,34.639961269684555,-14.693659389322494,-18.300650940157627 2002-08-20,-1.3434442613325408,32.937457087137126,-12.04321308923043,-17.708716432121605 2002-08-21,-1.4509145701782944,32.984399004390696,-10.6651070625981,-17.338146904815464 2002-08-22,0.458424839281409,33.960720664272664,-9.823459519546983,-16.381091156013298 2002-08-23,1.6623004794220022,34.01403177853265,-7.446201009346926,-16.649441324138223 2002-08-24,0.6687199234313426,36.782634355362035,-7.542978857839898,-16.542588144529336 2002-08-25,-0.22122413162609134,38.08426440598867,-7.353930412505883,-16.905011699272308 2002-08-26,-0.4681551821706163,38.9088771380681,-7.691241647884874,-15.623527893672527 2002-08-27,-0.489397502423242,38.78446666250478,-7.357399166665481,-14.543498111227883 2002-08-28,0.46675556076997904,38.7807855963795,-6.743119660586832,-15.206051298049971 2002-08-29,1.9031991218099655,36.687258179808,-5.720742148862145,-14.335688622183373 2002-08-30,1.4328010474168904,37.18606471242063,-6.27487680108552,-14.879621255581322 2002-08-31,2.2180208837685647,36.20039467390441,-5.63817829284806,-15.62538893161285 2002-09-01,3.4053176475969504,36.98736461672818,-4.441911743584758,-14.162031077685075 2002-09-02,3.8542524162219887,38.283544752453494,-4.845949106416309,-15.4493020795598 2002-09-03,4.328033158762817,37.12380353842243,-6.006343902592015,-14.158929174577716 2002-09-04,5.2191031716508425,37.20348620991238,-6.035182340000086,-14.4613889427918 2002-09-05,4.8845468509151155,38.19283597715084,-6.447570207705912,-13.54120424399233 2002-09-06,5.81743464162358,37.66999842176996,-5.983732164175501,-12.238303380307187 2002-09-07,7.953334388201149,37.503575896087554,-4.7836587918877145,-12.092902499439742 2002-09-08,8.575180907400478,37.37762203416459,-3.1542398520143102,-12.895207580556056 2002-09-09,8.24224022995892,38.15549965099275,-3.2851322804937793,-13.483775480729937 2002-09-10,9.699693062523206,37.421024341551174,-1.7631051506763755,-13.397275957099017 2002-09-11,7.228026542775897,38.07056283595789,-1.2501513945311247,-14.455653926436211 2002-09-12,7.276335645108946,38.5030573135807,-1.1100472529767071,-15.362900320893575 2002-09-13,6.955453039028913,37.03861332956329,-0.5719424712179676,-14.527590060588107 2002-09-14,6.232799896953183,37.254276267561934,-1.8930498650077556,-14.385401161163287 2002-09-15,5.3318017762543874,36.671503947824135,-1.78228172609876,-13.645304881042035 2002-09-16,5.825637585926799,36.92073265723552,-2.7181372166004576,-13.875984224300861 2002-09-17,5.972137341600076,36.785577111714744,-3.92376306884486,-13.281417679849099 2002-09-18,5.154684958122226,34.78985759081997,-4.426825410894858,-13.805227134602035 2002-09-19,4.228035193769872,34.40034961479363,-4.431979923206513,-14.5204231636696 2002-09-20,3.047639648273046,36.244469117001294,-5.093583882000251,-15.106411641767655 2002-09-21,2.984360546700751,38.09534886971238,-5.560222337696929,-16.58421622164466 2002-09-22,3.1870980335787036,37.16974169460996,-6.13224951982493,-14.910771026955588 2002-09-23,1.7724699661446806,36.39948824425265,-6.25759958937042,-13.668260646294812 2002-09-24,1.886271767383478,34.54330693974665,-6.6449145870510264,-15.213738811598251 2002-09-25,2.9184384404811228,33.722114167520076,-5.736130352472307,-14.91971126031068 2002-09-26,2.608268140109477,33.47308684630478,-5.111580637462243,-15.969799563712865 ================================================ FILE: 3.pandas/2.Pandas_Exercises/README.md ================================================ # Pandas Exercises(Pandas 练习题) 网上可以搜到大量的pandas教程和官方文档,但没有简单的方法来练习。教程是很好的资源,但要付诸实践。 只有实践,才能更好的加深学习。 我从github搜索到了一些pandas的练习题,含完整数据集,并进行整理: 原代码作者:Guilherme Samora **本练习代码可以在百度云下载:** 链接:https://pan.baidu.com/s/1qzIZAsirJSZLyVm5okcicA 提取码:umgg **Pandas练习题目录** 1.Getting and knowing - Chipotle - Occupation - World Food Facts 2.Filtering and Sorting - Chipotle - Euro12 - Fictional Army 3.Grouping - Alcohol Consumption - Occupation - Regiment 4.Apply - Students - Alcohol Consumption - US_Crime_Rates 5.Merge - Auto_MPG - Fictitious Names - House Market 6.Stats - US_Baby_Names - Wind_Stats 7.Visualization - Chipotle - Titanic Disaster - Scores - Online Retail - Tips 8.Creating Series and DataFrames - Pokemon 9.Time Series - Apple_Stock - Getting_Financial_Data - Investor_Flow_of_Funds_US 10.Deleting - Iris - Wine **使用方法** 每个练习文件夹有三个不同类型的文件: 1.Exercises.ipynb 没有答案代码的文件,这个是你做的练习 2.Solutions.ipynb 运行代码后的结果(不要改动) 3.Exercise_with_Solutions.ipynb 有答案代码和注释的文件 你可以在Exercises.ipynb里输入代码,看看运行结果是否和Solutions.ipynb里面的内容一致,如果真的完成不了再看下Exercise_with_Solutions.ipynb的答案。 ================================================ FILE: 3.pandas/3.pandas_beginner/README.md ================================================ # 《pandas入门教程-2天学会pandas》 **pandas_beginner** - ## 目录 ### 0.导语 ### 1.Series ### 2.DataFrame #### 2.1 DataFrame的简单运用 ### 3.pandas选择数据 #### 3.1 实战筛选 #### 3.2 筛选总结 ### 4.Pandas设置值 #### 4.1 创建数据 #### 4.2 根据位置设置loc和iloc #### 4.3 根据条件设置 #### 4.4 按行或列设置 #### 4.5 添加Series序列(长度必须对齐) #### 4.6 设定某行某列为特定值 #### 4.7 修改一整行数据 ### 5.Pandas处理丢失数据 #### 5.1 创建含NaN的矩阵 #### 5.2 删除掉有NaN的行或列 #### 5.3 替换NaN值为0或者其他 #### 5.4 是否有缺失数据NaN ### 6.Pandas导入导出 #### 6.1 导入数据 #### 6.2 导出数据 ### 7.Pandas合并操作 #### 7.1 Pandas合并concat #### 7.2.Pandas 合并 merge ##### 7.2.1 定义资料集并打印出 ##### 7.2.2 依据key column合并,并打印 ##### 7.2.3 两列合并 ##### 7.2.4 Indicator设置合并列名称 ##### 7.2.5 依据index合并 ##### 7.2.6 解决overlapping的问题 ### 8.Pandas plot出图 ### 9.学习来源 ================================================ FILE: 3.pandas/3.pandas_beginner/pandas_beginner.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 2天学会Pandas" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 目录\n", "## 0.导语\n", "## 1.Series\n", "## 2.DataFrame\n", "### 2.1 DataFrame的简单运用\n", "\n", "## 3.pandas选择数据\n", "### 3.1 实战筛选\n", "### 3.2 筛选总结\n", "\n", "## 4.Pandas设置值\n", "### 4.1 创建数据\n", "### 4.2 根据位置设置loc和iloc\n", "### 4.3 根据条件设置\n", "### 4.4 按行或列设置\n", "### 4.5 添加Series序列(长度必须对齐)\n", "### 4.6 设定某行某列为特定值\n", "### 4.7 修改一整行数据\n", "\n", "## 5.Pandas处理丢失数据\n", "### 5.1 创建含NaN的矩阵\n", "### 5.2 删除掉有NaN的行或列\n", "### 5.3 替换NaN值为0或者其他\n", "### 5.4 是否有缺失数据NaN\n", "\n", "## 6.Pandas导入导出\n", "### 6.1 导入数据\n", "### 6.2 导出数据\n", "\n", "## 7.Pandas合并操作\n", "### 7.1 Pandas合并concat\n", "### 7.2.Pandas 合并 merge\n", " * 7.2.1 定义资料集并打印出\n", " * 7.2.2 依据key column合并,并打印\n", " * 7.2.3 两列合并\n", " * 7.2.4 Indicator设置合并列名称\n", " * 7.2.5 依据index合并\n", " * 7.2.6 解决overlapping的问题\n", "\n", "## 8.Pandas plot出图\n", "\n", "## 9.学习来源" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 0.导语" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Pandas是基于Numpy构建的,让Numpy为中心的应用变得更加简单。\n", "\n", "本文作者:光城" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1.Series" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0 1.0\n", "1 3.0\n", "2 6.0\n", "3 NaN\n", "4 44.0\n", "5 1.0\n", "dtype: float64\n" ] } ], "source": [ "import pandas as pd\n", "import numpy as np\n", "\n", "# Series\n", "s = pd.Series([1,3,6,np.nan,44,1])\n", "print(s)\n", "# 默认index从0开始,如果想要按照自己的索引设置,则修改index参数,如:index=[3,4,3,7,8,9]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2.DataFrame" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2.1 DataFrame的简单运用" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " a b c d\n", "2018-08-19 -0.493739 -1.308738 0.261489 1.322140\n", "2018-08-20 -1.738107 0.699740 1.483715 1.103715\n", "2018-08-21 1.843806 0.636613 -0.605184 -0.809692\n", "2018-08-22 -0.044920 0.275286 1.536055 1.219944\n", "2018-08-23 0.688810 -0.870828 -0.424904 -1.369430\n", "2018-08-24 -0.670488 0.175906 0.214264 -1.099845\n" ] } ], "source": [ "# DataFrame\n", "dates = pd.date_range('2018-08-19',periods=6)\n", "# dates = pd.date_range('2018-08-19','2018-08-24') # 起始、结束 与上述等价\n", "'''\n", "numpy.random.randn(d0, d1, …, dn)是从标准正态分布中返回一个或多个样本值。\n", "numpy.random.rand(d0, d1, …, dn)的随机样本位于[0, 1)中。\n", "(6,4)表示6行4列数据\n", "'''\n", "df = pd.DataFrame(np.random.randn(6,4),index=dates,columns=['a','b','c','d'])\n", "print(df)\n", "# DataFrame既有行索引也有列索引, 它可以被看做由Series组成的大字典。" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2018-08-19 -1.308738\n", "2018-08-20 0.699740\n", "2018-08-21 0.636613\n", "2018-08-22 0.275286\n", "2018-08-23 -0.870828\n", "2018-08-24 0.175906\n", "Freq: D, Name: b, dtype: float64\n" ] } ], "source": [ "print(df['b'])" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " 0 1 2 3\n", "0 0 1 2 3\n", "1 4 5 6 7\n", "2 8 9 10 11\n" ] } ], "source": [ "# 未指定行标签和列标签的数据\n", "df1 = pd.DataFrame(np.arange(12).reshape(3,4))\n", "print(df1)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " A B C D E F\n", "0 1 2018-08-19 1.0 3 test foo\n", "1 2 2018-08-19 6.0 3 train foo\n", "2 3 2018-08-19 9.0 3 test foo\n", "3 4 2018-08-19 10.0 3 train foo\n" ] } ], "source": [ "# 另一种方式\n", "df2 = pd.DataFrame({\n", " 'A': [1,2,3,4],\n", " 'B': pd.Timestamp('20180819'),\n", " 'C': pd.Series([1,6,9,10],dtype='float32'),\n", " 'D': np.array([3] * 4,dtype='int32'),\n", " 'E': pd.Categorical(['test','train','test','train']),\n", " 'F': 'foo'\n", "})\n", "print(df2)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "RangeIndex(start=0, stop=4, step=1)\n" ] } ], "source": [ "print(df2.index)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Index(['A', 'B', 'C', 'D', 'E', 'F'], dtype='object')\n" ] } ], "source": [ "print(df2.columns)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[1 Timestamp('2018-08-19 00:00:00') 1.0 3 'test' 'foo']\n", " [2 Timestamp('2018-08-19 00:00:00') 6.0 3 'train' 'foo']\n", " [3 Timestamp('2018-08-19 00:00:00') 9.0 3 'test' 'foo']\n", " [4 Timestamp('2018-08-19 00:00:00') 10.0 3 'train' 'foo']]\n" ] } ], "source": [ "print(df2.values)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " A C D\n", "count 4.000000 4.000000 4.0\n", "mean 2.500000 6.500000 3.0\n", "std 1.290994 4.041452 0.0\n", "min 1.000000 1.000000 3.0\n", "25% 1.750000 4.750000 3.0\n", "50% 2.500000 7.500000 3.0\n", "75% 3.250000 9.250000 3.0\n", "max 4.000000 10.000000 3.0\n" ] } ], "source": [ "# 数据总结\n", "print(df2.describe())" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " 0 1 2 \\\n", "A 1 2 3 \n", "B 2018-08-19 00:00:00 2018-08-19 00:00:00 2018-08-19 00:00:00 \n", "C 1 6 9 \n", "D 3 3 3 \n", "E test train test \n", "F foo foo foo \n", "\n", " 3 \n", "A 4 \n", "B 2018-08-19 00:00:00 \n", "C 10 \n", "D 3 \n", "E train \n", "F foo \n" ] } ], "source": [ "# 翻转数据\n", "print(df2.T)\n", "# print(np.transpose(df2))等价于上述操作" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " A B C D E F\n", "0 1 2018-08-19 1.0 3 test foo\n", "1 2 2018-08-19 6.0 3 train foo\n", "2 3 2018-08-19 9.0 3 test foo\n", "3 4 2018-08-19 10.0 3 train foo\n" ] } ], "source": [ "'''\n", "axis=1表示行\n", "axis=0表示列\n", "默认ascending(升序)为True\n", "ascending=True表示升序,ascending=False表示降序\n", "下面两行分别表示按行升序与按行降序\n", "'''\n", "print(df2.sort_index(axis=1,ascending=True))" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " F E D C B A\n", "0 foo test 3 1.0 2018-08-19 1\n", "1 foo train 3 6.0 2018-08-19 2\n", "2 foo test 3 9.0 2018-08-19 3\n", "3 foo train 3 10.0 2018-08-19 4\n" ] } ], "source": [ "print(df2.sort_index(axis=1,ascending=False))" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " A B C D E F\n", "3 4 2018-08-19 10.0 3 train foo\n", "2 3 2018-08-19 9.0 3 test foo\n", "1 2 2018-08-19 6.0 3 train foo\n", "0 1 2018-08-19 1.0 3 test foo\n" ] } ], "source": [ "# 表示按列降序与按列升序\n", "print(df2.sort_index(axis=0,ascending=False))" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " A B C D E F\n", "0 1 2018-08-19 1.0 3 test foo\n", "1 2 2018-08-19 6.0 3 train foo\n", "2 3 2018-08-19 9.0 3 test foo\n", "3 4 2018-08-19 10.0 3 train foo\n" ] } ], "source": [ "print(df2.sort_index(axis=0,ascending=True))" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " A B C D E F\n", "3 4 2018-08-19 10.0 3 train foo\n", "2 3 2018-08-19 9.0 3 test foo\n", "1 2 2018-08-19 6.0 3 train foo\n", "0 1 2018-08-19 1.0 3 test foo\n" ] } ], "source": [ "# 对特定列数值排列\n", "# 表示对C列降序排列\n", "print(df2.sort_values(by='C',ascending=False))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 3.pandas选择数据" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3.1 实战筛选" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " A B C D\n", "2018-08-19 0 1 2 3\n", "2018-08-20 4 5 6 7\n", "2018-08-21 8 9 10 11\n", "2018-08-22 12 13 14 15\n", "2018-08-23 16 17 18 19\n", "2018-08-24 20 21 22 23\n" ] } ], "source": [ "import pandas as pd\n", "import numpy as np\n", "dates = pd.date_range('20180819', periods=6)\n", "df = pd.DataFrame(np.arange(24).reshape((6,4)),index=dates, columns=['A','B','C','D'])\n", "print(df)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2018-08-19 0\n", "2018-08-20 4\n", "2018-08-21 8\n", "2018-08-22 12\n", "2018-08-23 16\n", "2018-08-24 20\n", "Freq: D, Name: A, dtype: int32\n" ] } ], "source": [ "# 检索A列\n", "print(df['A'])" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2018-08-19 0\n", "2018-08-20 4\n", "2018-08-21 8\n", "2018-08-22 12\n", "2018-08-23 16\n", "2018-08-24 20\n", "Freq: D, Name: A, dtype: int32\n" ] } ], "source": [ "print(df.A)" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " A B C D\n", "2018-08-19 0 1 2 3\n", "2018-08-20 4 5 6 7\n", "2018-08-21 8 9 10 11\n" ] } ], "source": [ "# 选择跨越多行或多列\n", "# 选取前3行\n", "print(df[0:3])" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " A B C D\n", "2018-08-19 0 1 2 3\n", "2018-08-20 4 5 6 7\n", "2018-08-21 8 9 10 11\n" ] } ], "source": [ "print(df['2018-08-19':'2018-08-21'])" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "A 0\n", "B 1\n", "C 2\n", "D 3\n", "Name: 2018-08-19 00:00:00, dtype: int32\n" ] } ], "source": [ "# 根据标签选择数据\n", "# 获取特定行或列\n", "# 指定行数据\n", "print(df.loc['20180819'])" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " A B\n", "2018-08-19 0 1\n", "2018-08-20 4 5\n", "2018-08-21 8 9\n", "2018-08-22 12 13\n", "2018-08-23 16 17\n", "2018-08-24 20 21\n" ] } ], "source": [ "# 指定列\n", "# 两种方式\n", "print(df.loc[:,'A':'B'])" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " A B\n", "2018-08-19 0 1\n", "2018-08-20 4 5\n", "2018-08-21 8 9\n", "2018-08-22 12 13\n", "2018-08-23 16 17\n", "2018-08-24 20 21\n" ] } ], "source": [ "print(df.loc[:,['A','B']])" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "A 0\n", "B 1\n", "Name: 2018-08-19 00:00:00, dtype: int32\n" ] } ], "source": [ "# 行与列同时检索\n", "print(df.loc['20180819',['A','B']])" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "13\n" ] } ], "source": [ "# 根据序列iloc\n", "# 获取特定位置的值\n", "print(df.iloc[3,1])" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " B C\n", "2018-08-22 13 14\n", "2018-08-23 17 18\n" ] } ], "source": [ "print(df.iloc[3:5,1:3]) # 不包含末尾5或3,同列表切片" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " B C\n", "2018-08-20 5 6\n", "2018-08-22 13 14\n", "2018-08-24 21 22\n" ] } ], "source": [ "# 跨行操作\n", "print(df.iloc[[1,3,5],1:3])" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " A C\n", "2018-08-19 0 2\n", "2018-08-20 4 6\n", "2018-08-21 8 10\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\ipykernel_launcher.py:2: DeprecationWarning: \n", ".ix is deprecated. Please use\n", ".loc for label based indexing or\n", ".iloc for positional indexing\n", "\n", "See the documentation here:\n", "http://pandas.pydata.org/pandas-docs/stable/indexing.html#ix-indexer-is-deprecated\n", " \n" ] } ], "source": [ "# 混合选择\n", "print(df.ix[:3,['A','C']])" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " A C\n", "2018-08-19 0 2\n", "2018-08-20 4 6\n", "2018-08-21 8 10\n" ] } ], "source": [ "print(df.iloc[:3,[0,2]]) # 结果同上" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " A B C D\n", "2018-08-22 12 13 14 15\n", "2018-08-23 16 17 18 19\n", "2018-08-24 20 21 22 23\n" ] } ], "source": [ "# 通过判断的筛选\n", "print(df[df.A>8])" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " A B C D\n", "2018-08-22 12 13 14 15\n", "2018-08-23 16 17 18 19\n", "2018-08-24 20 21 22 23\n" ] } ], "source": [ "# 通过判断的筛选\n", "print(df.loc[df.A>8])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "* 3.2 筛选总结" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "1.iloc与ix区别\n", " > 总结:相同点:iloc可以取相应的值,操作方便,与ix操作类似。\n", " \n", " > 不同点:ix可以混合选择,可以填入column对应的字符选择,而iloc只能采用index索引,对于列数较多情况下,ix要方便操作许多。\n", " \n", "2.loc与iloc区别\n", " > 总结:相同点:都可以索引处块数据\n", " \n", " > 不同点:iloc可以检索对应值,两者操作不同。\n", " \n", "3.ix与loc、iloc三者的区别\n", " > n总结:ix是混合loc与iloc操作\n", " \n", "如下:对比三者操作,输出结果相同" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "A 0\n", "B 1\n", "Name: 2018-08-19 00:00:00, dtype: int32\n", "A 0\n", "B 1\n", "Name: 2018-08-19 00:00:00, dtype: int32\n", "A 0\n", "B 1\n", "Name: 2018-08-19 00:00:00, dtype: int32\n" ] } ], "source": [ "print(df.loc['20180819','A':'B'])\n", "print(df.iloc[0,0:2])\n", "print(df.ix[0,'A':'B'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 4.Pandas设置值" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4.1 创建数据" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " A B C D\n", "2018-08-20 0 1 2 3\n", "2018-08-21 4 5 6 7\n", "2018-08-22 8 9 10 11\n", "2018-08-23 12 13 14 15\n", "2018-08-24 16 17 18 19\n", "2018-08-25 20 21 22 23\n" ] } ], "source": [ "import pandas as pd\n", "import numpy as np\n", "# 创建数据\n", "dates = pd.date_range('20180820',periods=6)\n", "df = pd.DataFrame(np.arange(24).reshape(6,4), index=dates, columns=['A','B','C','D'])\n", "print(df)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4.2 根据位置设置loc和iloc" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " A B C D\n", "2018-08-20 0 2222 2 3\n", "2018-08-21 4 5 6 7\n", "2018-08-22 8 9 111 11\n", "2018-08-23 12 13 14 15\n", "2018-08-24 16 17 18 19\n", "2018-08-25 20 21 22 23\n" ] } ], "source": [ "# 根据位置设置loc和iloc\n", "df.iloc[2,2] = 111\n", "df.loc['20180820','B'] = 2222\n", "print(df)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4.3 根据条件设置" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " A B C D\n", "2018-08-20 0 2222 2 3\n", "2018-08-21 4 5 6 7\n", "2018-08-22 8 0 111 11\n", "2018-08-23 12 0 14 15\n", "2018-08-24 16 0 18 19\n", "2018-08-25 20 0 22 23\n" ] } ], "source": [ "# 根据条件设置\n", "# 更改B中的数,而更改的位置取决于4的位置,并设相应位置的数为0\n", "df.B[df.A>4] = 0\n", "print(df)" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " A B C D\n", "2018-08-20 0 2222 2 3\n", "2018-08-21 4 5 6 7\n", "2018-08-22 8 0 111 11\n", "2018-08-23 12 0 14 15\n", "2018-08-24 16 0 18 19\n", "2018-08-25 20 0 22 23\n" ] } ], "source": [ "df.B.loc[df.A>4] = 0\n", "print(df)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4.4 按行或列设置" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " A B C D F\n", "2018-08-20 0 2222 2 3 NaN\n", "2018-08-21 4 5 6 7 NaN\n", "2018-08-22 8 0 111 11 NaN\n", "2018-08-23 12 0 14 15 NaN\n", "2018-08-24 16 0 18 19 NaN\n", "2018-08-25 20 0 22 23 NaN\n" ] } ], "source": [ "# 按行或列设置\n", "# 列批处理,F列全改为NaN\n", "df['F'] = np.nan\n", "print(df)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4.5 添加Series序列(长度必须对齐)" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " A B C D F E\n", "2018-08-20 0 2222 2 3 NaN 1\n", "2018-08-21 4 5 6 7 NaN 2\n", "2018-08-22 8 0 111 11 NaN 3\n", "2018-08-23 12 0 14 15 NaN 4\n", "2018-08-24 16 0 18 19 NaN 5\n", "2018-08-25 20 0 22 23 NaN 6\n" ] } ], "source": [ "df['E'] = pd.Series([1,2,3,4,5,6], index=pd.date_range('20180820',periods=6))\n", "print(df)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4.6 设定某行某列为特定值" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " A B C D F E\n", "2018-08-20 56 2222 2 3 NaN 1\n", "2018-08-21 4 5 6 7 NaN 2\n", "2018-08-22 8 0 111 11 NaN 3\n", "2018-08-23 12 0 14 15 NaN 4\n", "2018-08-24 16 0 18 19 NaN 5\n", "2018-08-25 20 0 22 23 NaN 6\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\ipykernel_launcher.py:2: DeprecationWarning: \n", ".ix is deprecated. Please use\n", ".loc for label based indexing or\n", ".iloc for positional indexing\n", "\n", "See the documentation here:\n", "http://pandas.pydata.org/pandas-docs/stable/indexing.html#ix-indexer-is-deprecated\n", " \n" ] } ], "source": [ "# 设定某行某列为特定值\n", "df.ix['20180820','A'] = 56\n", "print(df)\n", "#ix 以后要剥离了,尽量不要用了" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " A B C D F E\n", "2018-08-20 67 2222 2 3 NaN 1\n", "2018-08-21 4 5 6 7 NaN 2\n", "2018-08-22 8 0 111 11 NaN 3\n", "2018-08-23 12 0 14 15 NaN 4\n", "2018-08-24 16 0 18 19 NaN 5\n", "2018-08-25 20 0 22 23 NaN 6\n" ] } ], "source": [ "df.loc['20180820','A'] = 67\n", "print(df)" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " A B C D F E\n", "2018-08-20 76 2222 2 3 NaN 1\n", "2018-08-21 4 5 6 7 NaN 2\n", "2018-08-22 8 0 111 11 NaN 3\n", "2018-08-23 12 0 14 15 NaN 4\n", "2018-08-24 16 0 18 19 NaN 5\n", "2018-08-25 20 0 22 23 NaN 6\n" ] } ], "source": [ "df.iloc[0,0] = 76\n", "print(df)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4.7 修改一整行数据" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " A B C D F E\n", "2018-08-20 76.0 2222.0 2.0 3.0 NaN 1.0\n", "2018-08-21 NaN NaN NaN NaN NaN NaN\n", "2018-08-22 8.0 0.0 111.0 11.0 NaN 3.0\n", "2018-08-23 12.0 0.0 14.0 15.0 NaN 4.0\n", "2018-08-24 16.0 0.0 18.0 19.0 NaN 5.0\n", "2018-08-25 20.0 0.0 22.0 23.0 NaN 6.0\n" ] } ], "source": [ "# 修改一整行数据\n", "df.iloc[1] = np.nan # df.iloc[1,:]=np.nan\n", "print(df)" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " A B C D F E\n", "2018-08-20 NaN NaN NaN NaN NaN NaN\n", "2018-08-21 NaN NaN NaN NaN NaN NaN\n", "2018-08-22 8.0 0.0 111.0 11.0 NaN 3.0\n", "2018-08-23 12.0 0.0 14.0 15.0 NaN 4.0\n", "2018-08-24 16.0 0.0 18.0 19.0 NaN 5.0\n", "2018-08-25 20.0 0.0 22.0 23.0 NaN 6.0\n" ] } ], "source": [ "df.loc['20180820'] = np.nan # df.loc['20180820,:']=np.nan\n", "print(df)" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " A B C D F E\n", "2018-08-20 NaN NaN NaN NaN NaN NaN\n", "2018-08-21 NaN NaN NaN NaN NaN NaN\n", "2018-08-22 NaN NaN NaN NaN NaN NaN\n", "2018-08-23 12.0 0.0 14.0 15.0 NaN 4.0\n", "2018-08-24 16.0 0.0 18.0 19.0 NaN 5.0\n", "2018-08-25 20.0 0.0 22.0 23.0 NaN 6.0\n" ] } ], "source": [ "df.ix[2] = np.nan # df.ix[2,:]=np.nan\n", "print(df)" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " A B C D F E\n", "2018-08-20 NaN NaN NaN NaN NaN NaN\n", "2018-08-21 NaN NaN NaN NaN NaN NaN\n", "2018-08-22 NaN NaN NaN NaN NaN NaN\n", "2018-08-23 NaN NaN NaN NaN NaN NaN\n", "2018-08-24 16.0 0.0 18.0 19.0 NaN 5.0\n", "2018-08-25 20.0 0.0 22.0 23.0 NaN 6.0\n" ] } ], "source": [ "df.ix['20180823'] = np.nan\n", "print(df)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 5.Pandas处理丢失数据" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 5.1 创建含NaN的矩阵" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " A B C D\n", "2018-08-20 0 1 2 3\n", "2018-08-21 4 5 6 7\n", "2018-08-22 8 9 10 11\n", "2018-08-23 12 13 14 15\n", "2018-08-24 16 17 18 19\n", "2018-08-25 20 21 22 23\n" ] } ], "source": [ "# Pandas处理丢失数据\n", "import pandas as pd\n", "import numpy as np\n", "# 创建含NaN的矩阵\n", "# 如何填充和删除NaN数据?\n", "dates = pd.date_range('20180820',periods=6)\n", "df = pd.DataFrame(np.arange(24).reshape((6,4)),index=dates,columns=['A','B','C','D']) \n", "print(df)" ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " A B C D\n", "2018-08-20 0 NaN 2.0 3\n", "2018-08-21 4 5.0 NaN 7\n", "2018-08-22 8 9.0 10.0 11\n", "2018-08-23 12 13.0 14.0 15\n", "2018-08-24 16 17.0 18.0 19\n", "2018-08-25 20 21.0 22.0 23\n" ] } ], "source": [ "# a.reshape(6,4)等价于a.reshape((6,4))\n", "df.iloc[0,1] = np.nan\n", "df.iloc[1,2] = np.nan\n", "print(df)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 5.2 删除掉有NaN的行或列" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " A B C D\n", "2018-08-22 8 9.0 10.0 11\n", "2018-08-23 12 13.0 14.0 15\n", "2018-08-24 16 17.0 18.0 19\n", "2018-08-25 20 21.0 22.0 23\n" ] } ], "source": [ "# 删除掉有NaN的行或列\n", "print(df.dropna()) # 默认是删除掉含有NaN的行" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " A B C D\n", "2018-08-22 8 9.0 10.0 11\n", "2018-08-23 12 13.0 14.0 15\n", "2018-08-24 16 17.0 18.0 19\n", "2018-08-25 20 21.0 22.0 23\n" ] } ], "source": [ "print(df.dropna(\n", " axis=0, # 0对行进行操作;1对列进行操作\n", " how='any' # 'any':只要存在NaN就drop掉;'all':必须全部是NaN才drop\n", "))" ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " A D\n", "2018-08-20 0 3\n", "2018-08-21 4 7\n", "2018-08-22 8 11\n", "2018-08-23 12 15\n", "2018-08-24 16 19\n", "2018-08-25 20 23\n" ] } ], "source": [ "# 删除掉所有含有NaN的列\n", "print(df.dropna(\n", " axis=1,\n", " how='any'\n", "))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 5.3 替换NaN值为0或者其他" ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " A B C D\n", "2018-08-20 0 0.0 2.0 3\n", "2018-08-21 4 5.0 0.0 7\n", "2018-08-22 8 9.0 10.0 11\n", "2018-08-23 12 13.0 14.0 15\n", "2018-08-24 16 17.0 18.0 19\n", "2018-08-25 20 21.0 22.0 23\n" ] } ], "source": [ "# 替换NaN值为0或者其他\n", "print(df.fillna(value=0))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 5.4 是否有缺失数据NaN" ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " A B C D\n", "2018-08-20 False True False False\n", "2018-08-21 False False True False\n", "2018-08-22 False False False False\n", "2018-08-23 False False False False\n", "2018-08-24 False False False False\n", "2018-08-25 False False False False\n" ] } ], "source": [ "# 是否有缺失数据NaN\n", "# 是否为空\n", "print(df.isnull())" ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " A B C D\n", "2018-08-20 False True False False\n", "2018-08-21 False False True False\n", "2018-08-22 False False False False\n", "2018-08-23 False False False False\n", "2018-08-24 False False False False\n", "2018-08-25 False False False False\n" ] } ], "source": [ "# 是否为NaN\n", "print(df.isna())" ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "A False\n", "B True\n", "C True\n", "D False\n", "dtype: bool\n" ] } ], "source": [ "# 检测某列是否有缺失数据NaN\n", "print(df.isnull().any())" ] }, { "cell_type": "code", "execution_count": 55, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "True\n" ] } ], "source": [ "# 检测数据中是否存在NaN,如果存在就返回True\n", "print(np.any(df.isnull())==True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 6.Pandas导入导出" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 6.1 导入数据" ] }, { "cell_type": "code", "execution_count": 56, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " Student ID name age gender\n", "0 1100 Kelly 22 Female\n", "1 1101 Clo 21 Female\n", "2 1102 Tilly 22 Female\n", "3 1103 Tony 24 Male\n", "4 1104 David 20 Male\n", "5 1105 Catty 22 Female\n", "6 1106 M 3 Female\n", "7 1107 N 43 Male\n", "8 1108 A 13 Male\n", "9 1109 S 12 Male\n", "10 1110 David 33 Male\n", "11 1111 Dw 3 Female\n", "12 1112 Q 23 Male\n", "13 1113 W 21 Female\n" ] } ], "source": [ "import pandas as pd # 加载模块\n", "# 读取csv\n", "data = pd.read_csv('student.csv')\n", "# 打印出data\n", "print(data)" ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " Student ID name age gender\n", "0 1100 Kelly 22 Female\n", "1 1101 Clo 21 Female\n", "2 1102 Tilly 22 Female\n" ] } ], "source": [ "# 前三行\n", "print(data.head(3))" ] }, { "cell_type": "code", "execution_count": 58, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " Student ID name age gender\n", "11 1111 Dw 3 Female\n", "12 1112 Q 23 Male\n", "13 1113 W 21 Female\n" ] } ], "source": [ "# 后三行\n", "print(data.tail(3))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 6.2 导出数据" ] }, { "cell_type": "code", "execution_count": 59, "metadata": {}, "outputs": [], "source": [ "# 将资料存取成pickle\n", "data.to_pickle('student.pickle')" ] }, { "cell_type": "code", "execution_count": 60, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " Student ID name age gender\n", "0 1100 Kelly 22 Female\n", "1 1101 Clo 21 Female\n", "2 1102 Tilly 22 Female\n", "3 1103 Tony 24 Male\n", "4 1104 David 20 Male\n", "5 1105 Catty 22 Female\n", "6 1106 M 3 Female\n", "7 1107 N 43 Male\n", "8 1108 A 13 Male\n", "9 1109 S 12 Male\n", "10 1110 David 33 Male\n", "11 1111 Dw 3 Female\n", "12 1112 Q 23 Male\n", "13 1113 W 21 Female\n" ] } ], "source": [ "# 读取pickle文件并打印\n", "print(pd.read_pickle('student.pickle'))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 7.Pandas合并操作" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 7.1 Pandas合并concat" ] }, { "cell_type": "code", "execution_count": 61, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " a b c d\n", "0 0.0 0.0 0.0 0.0\n", "1 0.0 0.0 0.0 0.0\n", "2 0.0 0.0 0.0 0.0\n" ] } ], "source": [ "import pandas as pd\n", "import numpy as np\n", "\n", "# 定义资料集\n", "df1 = pd.DataFrame(np.ones((3,4))*0, columns=['a','b','c','d'])\n", "df2 = pd.DataFrame(np.ones((3,4))*1, columns=['a','b','c','d'])\n", "df3 = pd.DataFrame(np.ones((3,4))*2, columns=['a','b','c','d'])\n", "print(df1)" ] }, { "cell_type": "code", "execution_count": 62, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " a b c d\n", "0 1.0 1.0 1.0 1.0\n", "1 1.0 1.0 1.0 1.0\n", "2 1.0 1.0 1.0 1.0\n" ] } ], "source": [ "print(df2)" ] }, { "cell_type": "code", "execution_count": 63, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " a b c d\n", "0 2.0 2.0 2.0 2.0\n", "1 2.0 2.0 2.0 2.0\n", "2 2.0 2.0 2.0 2.0\n" ] } ], "source": [ "print(df3)" ] }, { "cell_type": "code", "execution_count": 64, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " a b c d\n", "0 0.0 0.0 0.0 0.0\n", "1 0.0 0.0 0.0 0.0\n", "2 0.0 0.0 0.0 0.0\n", "0 1.0 1.0 1.0 1.0\n", "1 1.0 1.0 1.0 1.0\n", "2 1.0 1.0 1.0 1.0\n", "0 2.0 2.0 2.0 2.0\n", "1 2.0 2.0 2.0 2.0\n", "2 2.0 2.0 2.0 2.0\n" ] } ], "source": [ "# concat纵向合并\n", "res = pd.concat([df1,df2,df3],axis=0)\n", "\n", "# 打印结果\n", "print(res)" ] }, { "cell_type": "code", "execution_count": 65, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " a b c d\n", "0 0.0 0.0 0.0 0.0\n", "1 0.0 0.0 0.0 0.0\n", "2 0.0 0.0 0.0 0.0\n", "3 1.0 1.0 1.0 1.0\n", "4 1.0 1.0 1.0 1.0\n", "5 1.0 1.0 1.0 1.0\n", "6 2.0 2.0 2.0 2.0\n", "7 2.0 2.0 2.0 2.0\n", "8 2.0 2.0 2.0 2.0\n" ] } ], "source": [ "# 上述合并过程中,index重复,下面给出重置index方法\n", "# 只需要将index_ignore设定为True即可\n", "res = pd.concat([df1,df2,df3],axis=0,ignore_index=True)\n", "\n", "# 打印结果\n", "print(res)" ] }, { "cell_type": "code", "execution_count": 66, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " a b c d\n", "1 0.0 0.0 0.0 0.0\n", "2 0.0 0.0 0.0 0.0\n", "3 0.0 0.0 0.0 0.0\n" ] } ], "source": [ "# join 合并方式\n", "#定义资料集\n", "df1 = pd.DataFrame(np.ones((3,4))*0, columns=['a','b','c','d'], index=[1,2,3])\n", "df2 = pd.DataFrame(np.ones((3,4))*1, columns=['b','c','d','e'], index=[2,3,4])\n", "print(df1)" ] }, { "cell_type": "code", "execution_count": 67, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " b c d e\n", "2 1.0 1.0 1.0 1.0\n", "3 1.0 1.0 1.0 1.0\n", "4 1.0 1.0 1.0 1.0\n" ] } ], "source": [ "print(df2)" ] }, { "cell_type": "code", "execution_count": 68, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " a b c d e\n", "1 0.0 0.0 0.0 0.0 NaN\n", "2 0.0 0.0 0.0 0.0 NaN\n", "3 0.0 0.0 0.0 0.0 NaN\n", "2 NaN 1.0 1.0 1.0 1.0\n", "3 NaN 1.0 1.0 1.0 1.0\n", "4 NaN 1.0 1.0 1.0 1.0\n" ] } ], "source": [ "'''\n", "join='outer',函数默认为join='outer'。此方法是依照column来做纵向合并,有相同的column上下合并在一起,\n", "其他独自的column各自成列,原来没有值的位置皆为NaN填充。\n", "'''\n", "# 纵向\"外\"合并df1与df2\n", "res = pd.concat([df1,df2],axis=0,join='outer')\n", "\n", "print(res)" ] }, { "cell_type": "code", "execution_count": 69, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " a b c d e\n", "0 0.0 0.0 0.0 0.0 NaN\n", "1 0.0 0.0 0.0 0.0 NaN\n", "2 0.0 0.0 0.0 0.0 NaN\n", "3 NaN 1.0 1.0 1.0 1.0\n", "4 NaN 1.0 1.0 1.0 1.0\n", "5 NaN 1.0 1.0 1.0 1.0\n" ] } ], "source": [ "# 修改index\n", "res = pd.concat([df1,df2],axis=0,join='outer',ignore_index=True)\n", "\n", "print(res)" ] }, { "cell_type": "code", "execution_count": 70, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " b c d\n", "1 0.0 0.0 0.0\n", "2 0.0 0.0 0.0\n", "3 0.0 0.0 0.0\n", "2 1.0 1.0 1.0\n", "3 1.0 1.0 1.0\n", "4 1.0 1.0 1.0\n" ] } ], "source": [ "# join='inner'合并相同的字段\n", "# 纵向\"内\"合并df1与df2\n", "res = pd.concat([df1,df2],axis=0,join='inner')\n", "# 打印结果\n", "print(res)" ] }, { "cell_type": "code", "execution_count": 71, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " a b c d\n", "1 0.0 0.0 0.0 0.0\n", "2 0.0 0.0 0.0 0.0\n", "3 0.0 0.0 0.0 0.0\n" ] } ], "source": [ "# join_axes(依照axes合并)\n", "#定义资料集\n", "df1 = pd.DataFrame(np.ones((3,4))*0, columns=['a','b','c','d'], index=[1,2,3])\n", "df2 = pd.DataFrame(np.ones((3,4))*1, columns=['b','c','d','e'], index=[2,3,4])\n", "print(df1)" ] }, { "cell_type": "code", "execution_count": 72, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " b c d e\n", "2 1.0 1.0 1.0 1.0\n", "3 1.0 1.0 1.0 1.0\n", "4 1.0 1.0 1.0 1.0\n" ] } ], "source": [ "print(df2)" ] }, { "cell_type": "code", "execution_count": 73, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " a b c d b c d e\n", "1 0.0 0.0 0.0 0.0 NaN NaN NaN NaN\n", "2 0.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0\n", "3 0.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0\n" ] } ], "source": [ "# 依照df1.index进行横向合并\n", "res = pd.concat([df1,df2],axis=1,join_axes=[df1.index])\n", "print(res)" ] }, { "cell_type": "code", "execution_count": 74, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " a b c d b c d e\n", "1 0.0 0.0 0.0 0.0 NaN NaN NaN NaN\n", "2 0.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0\n", "3 0.0 0.0 0.0 0.0 1.0 1.0 1.0 1.0\n", "4 NaN NaN NaN NaN 1.0 1.0 1.0 1.0\n" ] } ], "source": [ "# 移除join_axes参数,打印结果\n", "res = pd.concat([df1,df2],axis=1)\n", "print(res)" ] }, { "cell_type": "code", "execution_count": 75, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " a b c d\n", "0 0.0 0.0 0.0 0.0\n", "1 0.0 0.0 0.0 0.0\n", "2 0.0 0.0 0.0 0.0\n", "3 1.0 1.0 1.0 1.0\n", "4 1.0 1.0 1.0 1.0\n", "5 1.0 1.0 1.0 1.0\n" ] } ], "source": [ "# append(添加数据)\n", "# append只有纵向合并,没有横向合并\n", "#定义资料集\n", "df1 = pd.DataFrame(np.ones((3,4))*0, columns=['a','b','c','d'])\n", "df2 = pd.DataFrame(np.ones((3,4))*1, columns=['a','b','c','d'])\n", "df3 = pd.DataFrame(np.ones((3,4))*2, columns=['a','b','c','d'])\n", "s1 = pd.Series([1,2,3,4], index=['a','b','c','d'])\n", "# 将df2合并到df1下面,以及重置index,并打印出结果\n", "res = df1.append(df2,ignore_index=True)\n", "print(res)" ] }, { "cell_type": "code", "execution_count": 76, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " a b c d\n", "0 0.0 0.0 0.0 0.0\n", "1 0.0 0.0 0.0 0.0\n", "2 0.0 0.0 0.0 0.0\n", "3 1.0 1.0 1.0 1.0\n", "4 1.0 1.0 1.0 1.0\n", "5 1.0 1.0 1.0 1.0\n", "6 2.0 2.0 2.0 2.0\n", "7 2.0 2.0 2.0 2.0\n", "8 2.0 2.0 2.0 2.0\n" ] } ], "source": [ "# 合并多个df,将df2与df3合并至df1的下面,以及重置index,并打印出结果\n", "res = df1.append([df2,df3], ignore_index=True)\n", "print(res)" ] }, { "cell_type": "code", "execution_count": 77, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " a b c d\n", "0 0.0 0.0 0.0 0.0\n", "1 0.0 0.0 0.0 0.0\n", "2 0.0 0.0 0.0 0.0\n", "3 1.0 2.0 3.0 4.0\n" ] } ], "source": [ "# 合并series,将s1合并至df1,以及重置index,并打印结果\n", "res = df1.append(s1,ignore_index=True)\n", "print(res)" ] }, { "cell_type": "code", "execution_count": 78, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " a b c d\n", "0 0.0 0.0 0.0 0.0\n", "1 0.0 0.0 0.0 0.0\n", "2 0.0 0.0 0.0 0.0\n", "3 1.0 1.0 1.0 1.0\n", "4 1.0 1.0 1.0 1.0\n", "5 1.0 1.0 1.0 1.0\n", "6 2.0 2.0 2.0 2.0\n", "7 2.0 2.0 2.0 2.0\n", "8 2.0 2.0 2.0 2.0\n", " a b c d\n", "0 0.0 0.0 0.0 0.0\n", "1 0.0 0.0 0.0 0.0\n", "2 0.0 0.0 0.0 0.0\n", "3 1.0 1.0 1.0 1.0\n", "4 1.0 1.0 1.0 1.0\n", "5 1.0 1.0 1.0 1.0\n", "6 2.0 2.0 2.0 2.0\n", "7 2.0 2.0 2.0 2.0\n", "8 2.0 2.0 2.0 2.0\n" ] } ], "source": [ "# 总结:两种常用合并方式\n", "res = pd.concat([df1, df2, df3], axis=0, ignore_index=True)\n", "res1 = df1.append([df2, df3], ignore_index=True)\n", "print(res)\n", "print(res1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 7.2.Pandas 合并 merge" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 7.2.1 定义资料集并打印出" ] }, { "cell_type": "code", "execution_count": 79, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " A B key\n", "0 A0 B0 K0\n", "1 A1 B1 K1\n", "2 A2 B2 K2\n", "3 A3 B3 K3\n" ] } ], "source": [ "import pandas as pd\n", "# 依据一组key合并\n", "# 定义资料集并打印出\n", "left = pd.DataFrame({'key' : ['K0','K1','K2','K3'],\n", " 'A' : ['A0','A1','A2','A3'],\n", " 'B' : ['B0','B1','B2','B3']})\n", "\n", "right = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],\n", " 'C' : ['C0', 'C1', 'C2', 'C3'],\n", " 'D' : ['D0', 'D1', 'D2', 'D3']})\n", "print(left)" ] }, { "cell_type": "code", "execution_count": 80, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " C D key\n", "0 C0 D0 K0\n", "1 C1 D1 K1\n", "2 C2 D2 K2\n", "3 C3 D3 K3\n" ] } ], "source": [ "print(right)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 7.2.2 依据key column合并,并打印" ] }, { "cell_type": "code", "execution_count": 81, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " A B key C D\n", "0 A0 B0 K0 C0 D0\n", "1 A1 B1 K1 C1 D1\n", "2 A2 B2 K2 C2 D2\n", "3 A3 B3 K3 C3 D3\n" ] } ], "source": [ "# 依据key column合并,并打印\n", "res = pd.merge(left,right,on='key')\n", "print(res)" ] }, { "cell_type": "code", "execution_count": 82, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " A B key1 key2\n", "0 A0 B0 K0 K0\n", "1 A1 B1 K0 K1\n", "2 A2 B2 K1 K0\n", "3 A3 B3 K2 K1\n" ] } ], "source": [ "# 依据两组key合并\n", "#定义资料集并打印出\n", "left = pd.DataFrame({'key1': ['K0', 'K0', 'K1', 'K2'],\n", " 'key2': ['K0', 'K1', 'K0', 'K1'],\n", " 'A': ['A0', 'A1', 'A2', 'A3'],\n", " 'B': ['B0', 'B1', 'B2', 'B3']})\n", "right = pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'],\n", " 'key2': ['K0', 'K0', 'K0', 'K0'],\n", " 'C': ['C0', 'C1', 'C2', 'C3'],\n", " 'D': ['D0', 'D1', 'D2', 'D3']})\n", "print(left)" ] }, { "cell_type": "code", "execution_count": 83, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " C D key1 key2\n", "0 C0 D0 K0 K0\n", "1 C1 D1 K1 K0\n", "2 C2 D2 K1 K0\n", "3 C3 D3 K2 K0\n" ] } ], "source": [ "print(right)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 7.2.3 两列合并" ] }, { "cell_type": "code", "execution_count": 84, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " A B key1 key2 C D\n", "0 A0 B0 K0 K0 C0 D0\n", "1 A2 B2 K1 K0 C1 D1\n", "2 A2 B2 K1 K0 C2 D2\n" ] } ], "source": [ "# 依据key1与key2 columns进行合并,并打印出四种结果['left', 'right', 'outer', 'inner']\n", "res = pd.merge(left, right, on=['key1', 'key2'], how='inner')\n", "print(res)" ] }, { "cell_type": "code", "execution_count": 85, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " A B key1 key2 C D\n", "0 A0 B0 K0 K0 C0 D0\n", "1 A1 B1 K0 K1 NaN NaN\n", "2 A2 B2 K1 K0 C1 D1\n", "3 A2 B2 K1 K0 C2 D2\n", "4 A3 B3 K2 K1 NaN NaN\n", "5 NaN NaN K2 K0 C3 D3\n" ] } ], "source": [ "res = pd.merge(left, right, on=['key1', 'key2'], how='outer')\n", "print(res)" ] }, { "cell_type": "code", "execution_count": 86, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " A B key1 key2 C D\n", "0 A0 B0 K0 K0 C0 D0\n", "1 A1 B1 K0 K1 NaN NaN\n", "2 A2 B2 K1 K0 C1 D1\n", "3 A2 B2 K1 K0 C2 D2\n", "4 A3 B3 K2 K1 NaN NaN\n" ] } ], "source": [ "res = pd.merge(left, right, on=['key1', 'key2'], how='left')\n", "print(res)" ] }, { "cell_type": "code", "execution_count": 87, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " A B key1 key2 C D\n", "0 A0 B0 K0 K0 C0 D0\n", "1 A2 B2 K1 K0 C1 D1\n", "2 A2 B2 K1 K0 C2 D2\n", "3 NaN NaN K2 K0 C3 D3\n" ] } ], "source": [ "res = pd.merge(left, right, on=['key1', 'key2'], how='right')\n", "print(res)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 7.2.4 Indicator设置合并列名称" ] }, { "cell_type": "code", "execution_count": 88, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " col1 col_left\n", "0 0 a\n", "1 1 b\n" ] } ], "source": [ "# Indicator\n", "df1 = pd.DataFrame({'col1':[0,1],'col_left':['a','b']})\n", "df2 = pd.DataFrame({'col1':[1,2,2],'col_right':[2,2,2]})\n", "print(df1)" ] }, { "cell_type": "code", "execution_count": 89, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " col1 col_right\n", "0 1 2\n", "1 2 2\n", "2 2 2\n" ] } ], "source": [ "print(df2)" ] }, { "cell_type": "code", "execution_count": 90, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " col1 col_left col_right _merge\n", "0 0 a NaN left_only\n", "1 1 b 2.0 both\n", "2 2 NaN 2.0 right_only\n", "3 2 NaN 2.0 right_only\n" ] } ], "source": [ "# 依据col1进行合并,并启用indicator=True,最后打印\n", "res = pd.merge(df1,df2,on='col1',how='outer',indicator=True)\n", "print(res)" ] }, { "cell_type": "code", "execution_count": 91, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " col1 col_left col_right indicator_column\n", "0 0 a NaN left_only\n", "1 1 b 2.0 both\n", "2 2 NaN 2.0 right_only\n", "3 2 NaN 2.0 right_only\n" ] } ], "source": [ "# 自定义indicator column的名称,并打印出\n", "res = pd.merge(df1,df2,on='col1',how='outer',indicator='indicator_column')\n", "print(res)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 7.2.5 依据index合并" ] }, { "cell_type": "code", "execution_count": 92, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " A B\n", "K0 A0 B0\n", "K1 A1 B1\n", "K2 A2 B2\n" ] } ], "source": [ "# 依据index合并\n", "#定义资料集并打印出\n", "left = pd.DataFrame({'A': ['A0', 'A1', 'A2'],\n", " 'B': ['B0', 'B1', 'B2']},\n", " index=['K0', 'K1', 'K2'])\n", "right = pd.DataFrame({'C': ['C0', 'C2', 'C3'],\n", " 'D': ['D0', 'D2', 'D3']},\n", " index=['K0', 'K2', 'K3'])\n", "print(left)" ] }, { "cell_type": "code", "execution_count": 93, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " C D\n", "K0 C0 D0\n", "K2 C2 D2\n", "K3 C3 D3\n" ] } ], "source": [ "print(right)" ] }, { "cell_type": "code", "execution_count": 94, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " A B C D\n", "K0 A0 B0 C0 D0\n", "K1 A1 B1 NaN NaN\n", "K2 A2 B2 C2 D2\n", "K3 NaN NaN C3 D3\n" ] } ], "source": [ "# 依据左右资料集的index进行合并,how='outer',并打印\n", "res = pd.merge(left,right,left_index=True,right_index=True,how='outer')\n", "print(res)" ] }, { "cell_type": "code", "execution_count": 95, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " A B C D\n", "K0 A0 B0 C0 D0\n", "K2 A2 B2 C2 D2\n" ] } ], "source": [ "# 依据左右资料集的index进行合并,how='inner',并打印\n", "res = pd.merge(left,right,left_index=True,right_index=True,how='inner')\n", "print(res)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 7.2.6 解决overlapping的问题" ] }, { "cell_type": "code", "execution_count": 96, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " age k\n", "0 1 K0\n", "1 2 K1\n", "2 3 K2\n" ] } ], "source": [ "# 解决overlapping的问题\n", "#定义资料集\n", "boys = pd.DataFrame({'k': ['K0', 'K1', 'K2'], 'age': [1, 2, 3]})\n", "girls = pd.DataFrame({'k': ['K0', 'K0', 'K3'], 'age': [4, 5, 6]})\n", "print(boys)" ] }, { "cell_type": "code", "execution_count": 97, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " age k\n", "0 4 K0\n", "1 5 K0\n", "2 6 K3\n" ] } ], "source": [ "print(girls)" ] }, { "cell_type": "code", "execution_count": 98, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " age_boy k age_girl\n", "0 1 K0 4\n", "1 1 K0 5\n" ] } ], "source": [ "# 使用suffixes解决overlapping的问题\n", "# 比如将上面两个合并时,age重复了,则可通过suffixes设置,以此保证不重复,不同名\n", "res = pd.merge(boys,girls,on='k',suffixes=['_boy','_girl'],how='inner')\n", "print(res)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 8.Pandas plot出图" ] }, { "cell_type": "code", "execution_count": 99, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0 0.143408\n", "1 -1.936116\n", "2 -1.488609\n", "3 1.372508\n", "4 -0.907693\n", "5 0.665021\n", "6 -0.629525\n", "7 -0.470715\n", "8 -1.059255\n", "9 -1.688154\n", "10 -0.254145\n", "11 -0.070213\n", "12 0.057894\n", "13 -0.805895\n", "14 1.688675\n", "15 0.241852\n", "16 -0.967129\n", "17 -1.422592\n", "18 0.873210\n", "19 1.629350\n", "20 -0.248667\n", "21 -0.871348\n", "22 0.088175\n", "23 0.796791\n", "24 -0.457708\n", "25 -1.453474\n", "26 1.997726\n", "27 -1.877039\n", "28 -0.601735\n", "29 -0.659616\n", " ... \n", "970 -1.093692\n", "971 0.059065\n", "972 -0.657221\n", "973 0.452148\n", "974 -0.487552\n", "975 0.375511\n", "976 0.287918\n", "977 1.351101\n", "978 1.799478\n", "979 -0.372078\n", "980 -1.320401\n", "981 -2.115900\n", "982 -1.617493\n", "983 -2.343383\n", "984 2.155813\n", "985 0.031667\n", "986 -1.021759\n", "987 0.948910\n", "988 1.464946\n", "989 -0.296323\n", "990 0.071010\n", "991 -0.087358\n", "992 -0.580351\n", "993 -1.497217\n", "994 -0.459714\n", "995 0.125293\n", "996 0.803825\n", "997 0.327007\n", "998 -1.617468\n", "999 -0.115447\n", "Length: 1000, dtype: float64\n" ] } ], "source": [ "import pandas as pd\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "data = pd.Series(np.random.randn(1000), index=np.arange(1000))\n", "print(data)" ] }, { "cell_type": "code", "execution_count": 100, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0 0.143408\n", "1 -1.792708\n", "2 -3.281317\n", "3 -1.908809\n", "4 -2.816503\n", "5 -2.151481\n", "6 -2.781007\n", "7 -3.251721\n", "8 -4.310977\n", "9 -5.999131\n", "10 -6.253275\n", "11 -6.323489\n", "12 -6.265594\n", "13 -7.071490\n", "14 -5.382814\n", "15 -5.140962\n", "16 -6.108091\n", "17 -7.530683\n", "18 -6.657472\n", "19 -5.028122\n", "20 -5.276789\n", "21 -6.148137\n", "22 -6.059962\n", "23 -5.263171\n", "24 -5.720880\n", "25 -7.174354\n", "26 -5.176628\n", "27 -7.053667\n", "28 -7.655402\n", "29 -8.315018\n", " ... \n", "970 22.363987\n", "971 22.423053\n", "972 21.765832\n", "973 22.217979\n", "974 21.730427\n", "975 22.105938\n", "976 22.393856\n", "977 23.744957\n", "978 25.544435\n", "979 25.172357\n", "980 23.851955\n", "981 21.736056\n", "982 20.118563\n", "983 17.775180\n", "984 19.930993\n", "985 19.962660\n", "986 18.940901\n", "987 19.889810\n", "988 21.354757\n", "989 21.058433\n", "990 21.129443\n", "991 21.042085\n", "992 20.461734\n", "993 18.964517\n", "994 18.504803\n", "995 18.630096\n", "996 19.433921\n", "997 19.760929\n", "998 18.143460\n", "999 18.028013\n", "Length: 1000, dtype: float64\n" ] } ], "source": [ "print(data.cumsum())" ] }, { "cell_type": "code", "execution_count": 101, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXYAAAD8CAYAAABjAo9vAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJztnXmYHUXV/7/n3pnJvpCVhOwhJIQtgSFhVZYIgYAoIIqKKGheRRRf8YcgmwsI6Csg4hYFEURxAQEJEAlb2AJMWLORhJBlyDYJ2bdZbv3+uN33VndXVVd3V9879059nidP7nRXV1V3VZ8+derUKWKMwWKxWCzVQ6bcFbBYLBaLWaxgt1gslirDCnaLxWKpMqxgt1gslirDCnaLxWKpMqxgt1gslirDCnaLxWKpMowJdiLKEtGbRPSYqTwtFovFEh2TGvtlABYZzM9isVgsMagxkQkRDQEwDcCNAL4blr5fv35sxIgRJoq2WCyWDsO8efM2Msb6h6UzItgB3A7gCgA9dBKPGDECDQ0Nhoq2WCyWjgERrdRJl9gUQ0RnANjAGJsXkm46ETUQUUNTU1PSYi0Wi8UiwYSN/VgAnySiFQAeAHASEf3Fn4gxNoMxVs8Yq+/fP3QkYbFYLJaYJBbsjLGrGGNDGGMjAHwOwDOMsS8mrpnFYrFYYmH92C0Wi6XKMDV5CgBgjD0H4DmTeVosFoslGlZjt1gslirDCnaLxWKpMqxgt1gsVc2z721A4+Zd5a5GSbGC3WKxVDVf+dPrOPW2OeWuRkmxgt1isVQ9O5vbyl2FkmIFu8VisVQZVrBbLBZLlWEFu8VisVQZVrBbLBZLlWEFu8VisVQZVrBbLBZLlWEFu8VisVQZVrBbLBZLlWEFu8VisVQZVrBbLBZLlWEFu8VisVQZVrBbLJaqhTFW7iqUBSvYLSWjpS2Hpu17y10NSweig8p1K9gtpeOaf8/HkTfOxp6WjhVpz1I+Oqhct4LdUjqemL8WALC3JVfmmlgs1Y0V7BaLpWqxNvaYEFFnInqNiN4mogVE9CMTFbNYLJakdEyxDtQYyGMvgJMYYzuIqBbAi0T0BGNsroG8LRaLJTYdVGFPLthZfqyzw/mz1vnXQR+nRQdmu4elRHTUvmbExk5EWSJ6C8AGAE8xxl4VpJlORA1E1NDU1GSiWEuFQUTSc7uaW3H+jLl4v2mHNI3FEpWOqrEbEeyMsTbG2AQAQwBMIqKDBWlmMMbqGWP1/fv3N1GspYp4celGvLJ8E256fHG5q2KxVDxGvWIYY1sAPAdgqsl8LRaLJQ5WY48JEfUnot7O7y4ApgCwapfFYik71sYen0EAniWidwC8jryN/TED+VqqFJEW1TFfv/bHvJWbcdiP/ostu5rLXRUjdFSN3YRXzDsAJhqoi6WDoHrXFPOrlhJw5zNLsXV3C+at3IyTDxxY7uokpoPKdbvy1FJ6OupqwEpA5blUiXTUvmYFu6XkdMxXzVIOOmpfs4LdUnKENvaO+gZaUqWj9qsOLdi/dm8Dvvv3t8pdjQ6HylOhugwBlrJjBXvH46mF6/HQmx+Wuxodjw76sllKj3V3tFhKhPhV65gvYHulWkwY1XIfUbGC3VIyXIcL1ctWZU4ZFUe1Pf4OKtetYAfyJpmO6hZVDjrq8NhSejrqe20FO/KTqP9saCx3NToMHfRds5SBjtrVrGB3WLdtT7mr0GHoqC+bpfR0VCXCCnbD7G1twzf/+gZWf7TLeN6rP9qFbXtajOdbajrq8LiSqJYW6qhmPyvYHUxNGr2wZCNmvrMW1z+6wFCORY7/2bM4444XE+ezt7UNbbnydXgr1y2WdLGC3TBpe3WsMjASGHvNk/if++YZqI05rLBvHxQ9l9JrkF3NrXj83bWp5e+hg/YrK9hTor2bG2YvWl+2spXujlXncFdppP/8r314AS65/w2827g19bLa91uYHlawG6ag8ZS3Gu2ajmr3LDXNrbl2qWC480+7mltTL6sd3n5JsILdwZQJxWqc4bgv28vvb8SelrbyVqZK2b6nBQdc8wR++fTSclclQM7pAJ+dMTd1rb2jKhFWsKdER9UUdGAAlq7fjs//4VX80Jlkto/LLFt25b2n/jUv3vqMNNujjXs5fvn0khRL6rjvoRXspkloimncbN5Nsr3gjmUYY9i6Oy94lm7Y4U1jBzxlpRTPP1dCj6wOKtetYDcNL7yi8tKyjTjulmfxyFvVHXGy0l+2Xc2t1oSUAF6up61Rl3OO4Zezl+LuFz8oS9lWsDuY2hIsST6L1m4DALy9On1vgXLCWFC4V9KQefx1s3DcLc+UuxoVS45r7LSbvZz96rbZS/DjxxaWpezEgp2IhhLRs0S0iIgWENFlJirWEXE7YfWbI4pvm/9WK+XeN+5oxq7m1nY5ulq5aSfmLG0qdzWkeDX2CvqiVxA1BvJoBXA5Y+wNIuoBYB4RPcUYK8+nqswUTTHJ86hWquVdvvbhBXjwjUYM69MVE4ftU+7qFPj4z58rdxWU8Db2atbYy0lijZ0xtpYx9obzezuARQD2S5pvHPa0tGHHXrlv7B/mLMeqTelOThb92KP3qHK5ZjHGsHlnc+nKU9alZNVIzNqtuwEAO/dWn73dRDt8tLMZh1w/C2+u2lw4tqelDe+t3260HBXW3dEARDQCwEQArwrOTSeiBiJqaGpKZ5g45dbncfD1s4TnNu3YixsfX4QL7g5UzSgm/NhLbY645+UVmPiTp7Bi486SlFdJwltFxmko08Ljb6+twpotu43mqUuSrpfLMY9i9eryTdi+txW/f3554divnimtX3219LWoGBPsRNQdwIMAvsMY2+Y/zxibwRirZ4zV9+/f31SxHho3y18Gd/S30+l4za25VOrgEqdDpd0J5y7fhNdXfBQ4/sziDQCAlSlEpBSh3Mw64Uft6Juexhm/eiFZJpro7AgVlS27mnHVQ+/igruiKyBL12/H9//1jrnKROT22Utw8PWzsNXxoRc9Fv/oJnVTTIxr3mncgvkfVrYDgwkbO4ioFnmhfj9j7CETeabNAdc8kUq+SV529xJTHjp+Pjdjbir5RoWx9CaK127dg7VbSxtb36RwchWQj2KYxr5x/xtY5lsX4LKnpQ0X3PUqrp42HhOG9k5SRSmPvr0GAPDRrmb06lqr1cZpT57Gyf+Td74EAFhx8zTT1SkZJrxiCMBdABYxxm5NXqX0SbMzFSZPE7zu5Zo8LZWHQl6w58tyTVei58UYwyvvb+qQnhNx7lj1nBav247XV2zGdY/Mj1+pCqTj9Zw8JkwxxwK4AMBJRPSW8+90A/mmhmjhmzHNMaLG/tHOZvxl7sqyxkdPa4TgR+cOd+5tw8YdewEA981difP/MBezFpQvEqUOYR+eKHMXSVpC5/nq5x9n8t//t/Px5gr1d7X0Fyilm397JbEphjH2IirAQ4/XCHMGWntPSxu27W7BgJ6dPcejTJ4uXLMNp99RtAd3lE7o1853N7fhqYV54f38kibU3zAbK26ehuVNeYHoep+0N6gweSrn+SVNuPDu1/DLz03AWRPCncXcvGL1BQP9J415A/6d8L8f6XutlP6lWrd1Dzbt3Fvycnk65MpTkWCP6s3ytXsbMOmnT0vPy7pTW47hvldWoLk1V1hpCgBbd7cUO3k7+0zuam7FG6s2Y9WmXfjUr18qTI5FRebjf/2j8/HIW2sC6d1RTDbTzh6IQ6FWCtmx1HHt011N7Gr/YaOA/y5YhyWc26CsGm42uuYsnfdg3dY9qL9hNt5v8sX5CbmuaXvphZ3JD9Q/GlYH7lnEUTc9jWkGdjpLQocR7HyHNdHYLyzdCCDoXUNFI7uQv7++Gtc+sgB/eGG5OAHMhf7dvLMZI66ciYffVK+ODKkyvvv3t3H2b17Gjx9bgLdWb8GsBesS140va6VkbYEbBTATw1T0k8cWeuK5MMZwy5OLje5Fq7Nmwa277ihR1yI3/b55OOW2OZ5jWsLbgNnt8XfXYuOOvbjvlZXKdHx1PtyyG0feOBt3vxQeO2XJ+u2FD2JSTOrrV/zrHXzyV+UV2LpUvGCPs7mzCcFem82/IG6UQn/espd9u1PfvIbOX8eMm2KWO7bde15eoUwX9jGavyavbe52BGXS4bPnPhVyxl2hGEew3/XiB577XrZhB3773Ps4/mfPRs5Lhk6t3MGGrmAvaOwx6qNc+BUjP2MQsFbily96LKfcNgef8H204mLqnXJHjzubK2MxWkUL9off/BCH/vC/WLgm4DavxISNvUfnWgACwR7yCvmFefF38XgSpWpPS1tB2wnL5+VlG7XyLCzEceqYdJ7X/4xUZisAyMbspa1txdEUX+editXJAPDHF5bjjggbVKi6k2tG0p0cT/JsRfXw28xLadRikt+eNBHut7k1h/obngrdL3Xhmm0Ye80TWLd1jzEbfktbuuteTFPRgv35JfkVrA+/9SGWS2xfTy1cj7N/85JHmAtt7AT8/vn3MeqqmVpl9+ycn3feutvrb1y0aaqvJ+h1/Kh854G38Inb5oQKLwD4/B/zi2BcLxQZfhN30g9j4HJJdklMMcJy1MUVuGHmItz6VPgGEOT74InIZKKaYgpDvsjoCDHdR6nKSZYHf83shevxz4bV+fTKcvRvdNPOvdi4oxk/+s8CZbo/v7wCe1tzePa9Ddp5h7HXMbm20+meAEYWKJUL9xnPmLMcM+aIbdaX/vUN7G3NeeytIq3o5icWRyq7U00WALC72fslj/teen274zP3g00AvLZ/VV2enL8W8z9Uj3j8gjW5xu7/W5xhLuHkqayahj1bpeXc/eIH2LIr/+HPaSp8uSSmGINeMUnL+eq9DVrlRalzcdShrmTBzTJi/ipcjb0m7vCxxFS0YNd5Q6lg4yweC5tkYoyF+na7p9t8ebmdSlaGXItkcG8oiSnGY9IJKxRAw4pigCaZgA24wCXW2KOZJXQE+5L129GveydfOZGrFglVO23YtscTi9vfT2SkV+fkSkMYaSuz7qMJez/4Fa+y5/nb595Hp5oMLjpupFbZBcFeISp7RQv2KN4jvDAJ0zhzDMiGZO0Kfv82X5FeTC5tjkW7ds6SJjy/pAnXnjFeUr8I9QghDY2deT604nSuMNRZQHXKbXMwoIdPsEs+VKZk5+xF+aG+6EPV6ntIYdvBrdi4Eyf833O4+vQDpXmGobqkKOxKH6SOiGKbxTxpNUe0hQ8ASNoHbnkyP0LXFezuCLi9ut76qYxxhYQoHYxv3jB7p4491C3aPykWxf7s6XSMeTpkGF+6+zXcpdh2y6Tm5xfsMqEze+F6rN8WHqfFP6qQTp625c88vUhv5ekGn5+0VJgYVot1cgvT2N9u3AKgGG8lnikm5SFKgvKkaeOYYnRffIXGrsu6rXvwu+ffLwj2StHYK1uwR0jrdqyNO5pRf8NsZdq2HMMPH12gXIwgN8V4/w/Ug1uE5NFafXkvXLMNe1u9fthR0VkZqZOr319bpnx+9d4GnPPblzVyjDaR+Mhba/D26i1a13hKkZnDIucUVk54Gn2vGNeUF6Me0S+Jhey9izOnoZo8veelD4yPXKLyzb++gZufWIyFzmJC3sa+ccdeLW+Zf7y+2lyFNKlswa5jY4frlaCf7/Kmnbjn5RX46p/zE0ANKz7CZ373smdCsmC792fsTp6GlOfXyn/1zLLCNR9u2Y3T73gBP+FstHE6K7/SU8dLhl+l+McXlmPD9rz2HdDYhdfmj6pCJ/vL8V/rhx/97GwOr78uzLjnWnjjhI3kCqY9J9nuljZ8629vCtPKQk4rTTGhNTSXVzSFS37uh/9ZiNe5OaBC/mE2doOTp+57s8vxX3c19ta2HOpvmK0VJvmKB0sfSrmyBbukC724NOifHcVEUtSa8v9f+dC7eH3FZqzcVAzm5Jbdxhjmf7i1oN27nWrjjr2hy49lNVrnhJ1dwPnn69berbP/fq99WD+q35L1O3DDzEX41l/zgiXj6yVxh/yiEcTKTbtC/dgBIBvDNsw8v5nwd1TCbOUy/Br7rAXrhKF5+Wf7n7eDYRYA4Ft/e0N4XHVfun7sUR7zn19ZKdyxLOY0k5DdntXD+f9D68iZbJL6sbs2dderriZLeL9pB9Zsyb+jj72j9qkvFxUn2H/0nwWhmxB88a5XsXHHXpz3+1cKHUPX3QwIuiyK3NoKppgcwxm/ehEn/+J5z7WNm3fj5F88H1jApIO7uq17pxrkciwQE0QHf3dep2H7dml1Hta2PfmX1v8BFX0k47itufV6c5XYzNLGpasJm80OKUdnslaHsHufvXA9Xnl/UyANP2LfvLMZ/3PfPEwXuATqKCCyaJcliijg6Q2izbz9H36i+GYizyK+giYe5u7olIvkGrs7Wt3T4trYMzj5F8/jYz9/1lOn9kbFCfY/vbSiEKdF1Ul3N7fhtQ+KuwXFWVTjv0bkShicPPXmcfE9r0vzCJgknE6yy9GCutZl8dvn38cpt82R7uiiMmPE3X/Vn6U7X7Tb+eCIioykpTGmVSf+3rL+YYNOObyWLpnPiIpoEpQ/8tV7G3D+H+YKwtMWUzU7Ul60Y5XIFv/vNxsT70mb1sQqX1/3lqMMasJdj8W/XU78v+fwmd9553UK3jMJPigubt9357v8XjElnq/WpuIEO496Zxb13yoKZhXnGtHelq5Z4Rf/9a5Q9HfUdyQCOd/pxB8O157XrVNNYSPgs379kjAf6X2x5MHE3Kvde327MX8vcawR2/a0FEwPupcnNsV4hHnxjyQrZ4UfNZ3JU0EiEvz2J1u1aRf+9+9v41KJ+cVTj/BqGAsw59LaJipV//mGpeTbqrgSuXj+g407A3b4gsZOeh+0N1Zt9iiBPJmQkBAmwpOkQUULdpXF0P/AdReIAMB3/v4WgKBNjzfnuMc+9AU3CpQSo913NRc19jBk9+Xvh0lWFPo9vGS7HanYsK3oiqjTFIwxz8ukeoH+Na9RnIcnv+LvthzD1NvnFGLAR0FoitFoZP5eVPfvz3+Poymu3xYe8lbWBh/tbMb1j6qX4Qfy0uy4nvty/t/gq6vup+TWp5bg0r96P2Bejd3VxPVyzPuxh3P2b17Geb9/RXjOVSjcdQn+Z9w+xXqFC3ZV+wYEeww109+Ip9/xQsHtTha/RGZe0Uubx61rTSYTKgRlAk9mhlDhT+b+HfRjD79WlaI1l8Pn/6CeJ2FMrK2J+N4/3xYel8UH2rq7BYvXbZdep0LUj3Ser6guoi7kzz7SughJ0htmLsTidcF5mlWbduEJX0CtqF5k/oVYAAJxdpQLlJzja7bsxh1PLw1MRnr6QM6tY5BcjhUmtk3NpwBBjT3wjrRTyV7Zgl1xLuCFGMcf1i2HewMfeF0d2CjwRY9mfPaU95+31+CNVUF3Lx7ZpHCO6e2GIzrnFzi6C5R02aUR+vSOZ5Z6hti5HMMLS5vwJ4143gW4auYMvewigaczmcy3k0rJ8OeVUwgzXTyePFxGp/1yDr5xv8/EU+gz8jry70OboAM2rPT2WbUfe37Ue8zNzwjP5zxt6A6hg+nO+d3LGPWDxyUlyAlT+FyNveCv3k4FuZ/KFuxKG7vvBYnRIEUbe/GY+1snwl1o/iHnN+1sxuaQ3YoCE7zucc0bbm4LF7L+exVlzVdjT0sbNvkiRn60M5p30O2zvWFz23IMF9z1Gn70n4We46r75M/oaswqmltzBTOZpw4aX4o2j+bJCv//+tll3gB1kpXMWqY0yXFeEPPZmIgt3uLY2B94bZV0w5QwNip3VhKPus6680XMmPN+4W/es8prY1eXHbbAKGrY5fZCRQt2VTjXJENa/zWizXhlk1Ay80rxvJOnIHGcrjPHCV2sUxcRf5m7KlA3P/7n3JZjuPeVFR4h99vnii/Zl+5+DUdwq3vbcsxjw4yj8ctMMds1Fl75yyy4s2pU45L752HKrXlX1nN++zKOvimoWYpGTaqsXfPFxh3N+Pms93DnM8uEwer4OupMesr6uOjKb/xlXuDYorXbMNMxheg2kSvwrnzoXWU6qUmS894S4dHYudHL241b8dPHxRFZvS6SasLkgmuKcT9glSLejQh2IrqbiDYQkf4qGBPlKs4Fh7QJTDFcSVtcDVqqsftNMdHLjaJJBobSDjnGPCFgk3hD+Osza8E6XPfIAoy/bhYOvPZJAMBts4t2Vb+HgT/ee5w9C2Qmp22KdQKywG9R3D8ff3cdlm3Ie0m9K/FwEpti5GX4tT9+kU+g30boP1tkozuBYvLE/OD2hvwWirrPSGRjF5Yvk+sIU9BEIy1NP3aJbd+NEw+Ef8Dc5RPupi2idt0eYxe3tDGlsd8DYKqhvLRRNXASrxgXv1cMkF9pNm/lR1IxKYkwIM5fUp6JCRnGivnrflzWb9vj02zFZoDte4qCiF8ZKMNdSevSGmW1mIOs/VSCxe8JIzpugqgukP77z0k+QPy5sI/9boVZJeMxxei9M7rPyMSmKyrBzmfvluV+aEVs3dWCBc4HOL/dZLB+/48LA8DXX2RmyxY0dkewC8rkPeNKHYhNhhHBzhibA0DsCFom/M/3gRiBeGRhQt9t3Cq3sQsa9q4XPwiEORBdHxbLPQo5SadWce0jC3D3SysCL7/fVzmqvXHTTq/GHsssFsOPWGZjL3g4GHoJdZQG/omqIoIGNXZvPrI4Mbplq9D1JuH7rtiP3V++QnAjzBQjfzYiPveHuVjh2Pp55Uaef/G3aAI3Qz5TjCDDrGcyWVxiqQV+RdvYVR3C/4BnxojpUMjBV9DMd9cKO+sfX1heiAJXyIMBP3lsIb4oCIMQ5gKWBIZ4E8Yim73/WWoNvz3Xq//WyyP6CyMTVHFGbypcgXP1v4t2ZlUR/ntpy/FuhuqP6HWPRLd2hm9MEbQf6z4hkVdMVJQfZ4/GHp7XIu79yys3/vzkplKRKcsV7DMV+6zylgNZHUutyJdsow0img5gOgAMGzbMTJ4KTcDEy+s2un+BzusrNuOY0X0D6W+YuUiZ3/WPzMcmbmm4zDUy0fC2YM5h0H89i4iEgF+QR32Zg8IqmSnmwXmNOOeIIU5eeuV6zQzB53LGr15A19oa/OPrR0eum/t47n+Vm4hWPHu/sPbMBfg/os4NusLjVckKSVWfCZtfcTeW8X4IzdnYn1q4rhAp1A9j6jhOnhXDERWKHAu2g2xyWkYghICgXfk0snbIMYZMCbcSL5lgZ4zNADADAOrr6418v5RDOAPuSW4Wpprjz6+sLPxWrYqLW/O3V28peIkwZk5LCGjsGsNvHn894k2eFjO5/J9v49AhvTBmYI8Im0Sryw/b91WFSAiqbexyrdx/nZu2EN5BVgdF/fgwO0ITIGMAyPvxU+THo2OW27antRDfKVi2Wgnz+P9H7NA5gS3G31bz14gnxF10HBmyFC7YS215r+it8VSY8DtVLWEO8y/XQTbRGldjv2Fm0cc7p2FflOG/Xb8gimqK8b9McUZT/mvcaHvqYbxYY48zeatCpET4j/DP1N83/zmvESeMHZDPK8QU48/3/2a9h217WqQhfp3ShfVwETanysbO/W6J+JEXFaMawcWZ0C2mZ4LJaO/fF9z1WqQ8V38U3G9A1bbFcksr2o0IdiL6G4ATAPQjokYA1zPG7jKRt7JcxTkjgl1RzqK18TW8Qv5SU0y8/HiBm2PiJdZhfLh5N2Yt8LrCTR7Zx3O/UZ+tP3lbDJU9KODC781jMxYICFOv2l7BhKbKlKH6MPo/YAWNXdLZ73x2WWj9dDemEIXIFacvktwrhilHcCKvGF1yDGjxfTTC3DiP+unThd9H3jgbTcrFU+IyRZTaxm7KK+Z8xtggxlgtY2xIKYQ6EDJ5asTGnv9f5Y6VBKmAjFl1/5De/SuK3/bSDTsCqz799x9V4w26nka6XJiHznwE/4GSLelftWkXFq4J/0ivFoTYdRGF31XdokjDly1QKtrYQ6sohTy/gxmJPnSlFEQqRYHvu1EVirYcK+ybC+SdGMZe86TyGn7fAl2h7pnLkU7yAwvWbC20Z9pUtClG5cdu0hSTxpwHkfzrHqaZzJZEJfRHQ+SzSSIYwlzwIl8fo23870PRbCW/ho+IKHJ3BFDYMCGM5Rt3Ss+tEiylj6ux+69rKdjYzS0wC5aZ/1/Xxm7ydWAsLHaON220vJlHCVFt/p4EnVHFe+u341O/fgmXnDAaV0wdl0o9eCrb3VFxzqQpJi2CcV6Y8Lifbz/g3QvzM797Ge80bpGaK8qNbEIwCv6PgWwLwGDZbjouL8PqqGgE4y/CFczPLF7viQ3jJ2C2MjAf4FmgJHhpPtrVjBFXzvSFlwime+2DjzDyqpkez6582vjPs40x9eSp5IOsQ44V5wBq/K5tBuFrJbuX9c5I4K0Ym7LHoaIFu0qymxDsbqdKq09IN8IOuc5/b6+v2IxrHp4fcO8rDLETPoqkiyuCLmcxNHbJqCGsbu72fkkEBADlEFpUBVEJzy9pwkX3NOCOp5cKzubxPxvXA8mUKUbEcsHevAwM7zZuxfptewrP664Xl4MxYJ4vemOS7sHPBYlIZmMvxvTPpCjYc4zh5F88h7/MXRn6LEpl4qpYwd7cmlMOT1ULCnhuPvsQ6bmiJSadThF3okV0/p3GrR5NmHd3TNqXkl7vVzrjCFb/NY+/uxYtbblQs9Dmnc3488srPPFrpt8XDIAVhtJ8AuCFpd6FXaI2Wrc171EhioLo9rCga2j+wDuNW2N/YMNiq4g8QxgDzrzzRUz+6dMYe80T2NXcippsXlzwk8X5bQ7jk8sxbdNUdBNgMRRAqho7A95v2olrHp6vWEjn1qk0kr1ibezXPTIf+3Srk55/etEGrXxG9e8uPec2QUpzp8GAYZrXyTpHwMZuyBSTtC8GtNA4phhfHne9+AE612bwsTH9lde15ph89yBBNf7RIA49ofTdZ0HhKHr27n03R5hAa+Ge1c7mtpItTd/GBbZqzTGMv25WYeTqH70kNsVo2tijCsW8jT1/jX+hkUlkbrXCtKnVwkvFauxzljQp9WjdZswqnkBx5an5TkEICswVigk6Hplg9G9TltQaxVh+E9/75q4MTxySD0+cydN7XwnWYe2WPaH3GFXoXMEFiOLp1b93AAAgAElEQVRReQKJtwr0/j1v1WZc/e/o4QB4Idq4OV688zjd92dPvhc45j7rVl8/S6axx1uLoJU3J9jT1Ng9bsZh32xriglHudGGZh46keXS09i9/DfGHpw8W7kQtnxkuyQalTQUrAbb97Rg0o2zMXf5Js/xOK6oooh+DMAv/hsUQP40JvDblT1liGzsvmNxgncB3o/11NtfKAS4igJ5Figl78z+RUlJBhGtuVwEjT1a3o2bdxc+jNlMeqKOH82FfXxKZYqpWMHOoLZ96/Zf1RAt7SYwPazmw+nyfuzlYsGabdiwfS8e4uJ8A+Z2o1mzZXdgGzY/pl4k0YjBRVSCKTNYHLOVH89GMYlz844i8v0sgSkmp79VYNSR3r2vrCzMZ6hG5knhF0HJw0vLw/6mQcUKdkAtvHXNJzpB/k1oOQEUG/yaIJd0jByBL90tXpYt+2iaEuw6tupSKEiizT6ilivrYkkXtDBmfhmGfzu5pF4xuv0hzkfajZVeUyKNXaasuc/MauwaKG3smr1ZyxSjX6VIpOln7t9BKU1k2/PJBkOmBHvYfpWAfrz2JCxVbPyQlKQa+4dbdgu3dkwCb4pJml9bTt+PPc6jaCmYYtKzsfP9UNYlW1pds2hq1fBQ0YJd1at0NXadBk/Lxm5IvglhjNstPmY5ST88spGOMcHeGp5PkhcpianMlGYWNZKmCP+CoqR4dwxKqLHnInjFxOg3pXB35AX7qbfPEaexphg9woaYuu2oY3tLo0uIvGJMsnNvq2eD6bgkqaPs4/qXV5N52bjoaOxJSPZRMFMHEzZ2njT6ciIbe4gpJskCJaA0m1DrfHxbWuV7pqZBxQr2cJLb2KOkiUOaphh+g2Qg/jxBEs1T9nE11bd1bOxJ6v/6ivi7Pa5SBA0TIxvdlCZoVFwYkrVnW44p28iUKcbUKFGETlA81dZ6aVDRgl0lq0Qb04oopykmTTViOyfYkxST5IVI09QEiMPl+knyIn12xtzY137rb2+GJ9IgabxzwLy7o58kH8+2HFNqvLyGG8dN1hXsHxk2R3nLCK+Xq4SUKn5TxQp2BqZ0d9yl2LWdR0cbT+srm+YM+fY9Xp/2uCTTxtLVNvcqgmm5LFm/PdU6pI0JTfPBNxoN1ERM0pACbSxMYy96BsXpx+7OWP4RrEl0TIKtVmMvLToau6jjDejRKXHZaTYy79MeF8aSxbX/+Sz14qGk6Gjs/0+ykhQonb0zCaZ3e0rFxp5wLkLVjn94YTn2v/oJbN3Vkqo5JQlaNvYSeOfwVLRgNzGs6VKbVZ7fsbcVTTuCAfeT2t2TupmP6tcN3/3EAdLzvMYOxH+hk4wq5i6Pb6PWQUewVzomvGJ4UjErJqzi/YqQFa6CsqO5NXXTXlz8uzQJ0ziCPa35Oj8VK9iTulm5dO2kFuwn/+I54UbHST+8C9dsw44EWvW1Z4xHv+7yUQNvilqxaReel/iaq1i6YQdeWibehLga2KlprisF0gVK7VWaOazdugf/nCcOnKZLs8bHK0PxR1jnTxoW6zpdWjQUjOYSa+wVFd0xsOLNQJ51If6O/C48PEknoWYvShYXJpMh5cfF1LD1ukckkREtAIAh+3RB4+bgBsemaO+Cfd7Kzco4Ojr06lKDjYJRMU+Oxe/TnWvT1V912sgdeZVIrleWxv6j/xSFDAOMqOxxBXSKK5S1yBIph3Xt1R5ZbQzu1SXV/M1PQJdIskRA5x3M5VhsU0znEHNrUhavC5+gr0hTDBFNJaL3iGgZEV1pIk9hOb5OWU7RVaoGAoBTDxqIvr7Y85mMelcYK9hLw57WdM05Jtwd2zuqrQJ54s73dKpJVwv717xwr6NSm2IS3zERZQH8GsBpAMYDOJ+IxifNV1xW8TdjwGzNzTTSoJSCvVNNNmCDzWvs8mva+xC+WogbjlcX0x/oEnZbbXQmwcO20FORtsauw0Nv5COcVoxgBzAJwDLG2HLGWDOABwCcZSDfALwwZYxh0drgpGapKOULUpvNwD+EzmasKaY9YGotgqwl0w6b0B7Q0dhzLP6Ct84pa+xRqCRTzH4A+GnxRudYqkTZXkzG/B+dGvvaUmrsdTUU+JBkMqQ0xViNvbKQ7cNqXGM3mlt8eM11b0v4uzxnSROWbIi32KxTO9DYXSopCJiorwTqT0TTiaiBiBqamqK73uXzKP42sQCne6f4TkGlmt0G8i+Bv7gsEWqVNvbq1/QqlfPqh2infadxa4o1KR9819VR0q5/dAFmvqO3Qb2ftG3sUaikIGCNAIZyfw8BsMafiDE2gzFWzxir799fvQGxjFJqye0JQtDsks0QOtfJNRHTC1ss5vjZuYcpF5fxmF4KTwSMufpxo3nGq4e3P/fuWot9utamUlZ7sLG7VFJIgdcBjCGikURUB+BzAB41kG+A9iTWl6xPb3MFP0RBm36GSLlq1trYS0PUF/VX508EULpJND8EKrunTYbyI06e2mwGX//46FTKS9uPPQovLtuIlZv0Nq1PQuI7Zoy1ArgUwCwAiwD8gzGWyqoWkwr7cfv3M5dZGchmSKmJVOuk25mHDS53FWJz8rgBhfqXS7Anif1jChJ4dPkFvUk617QfjR1ArA3Jo2LkU8YYe5wxdgBjbDRj7EYTeYowGXL07i8faSyvupRteITgaCVD6jg3Osu0S83rV09JnMdhQ3oZqIk5ojxlXpinKchUtIeRHCFoVl23bU9qE4udEmrsPz/3UEM1yVOKb3r7GaNoYPJdMJlXTYYwuFdncxn6IKLARy2TIeUQM+kmyGlg4pmXS9MFgMOH9U50fU2WhL9LSalK/fgB8nk0kWkRSM/+3Cmhxm46hn0p5gorS7Ab7JbtyV4fhyyRssO2R1OMiWdeTsG+r+DjHcXLIcvFoajV2ZMxBUo1UFCVQyBhO6a1CUV7mjwFSiN7KkuwJ3wio/p1K/w2+dUshdkysPI0Q6hVaH3lniATYULzKadnVE3CAEH8hsqqtkuTcq7WLkDAredNwCH7ec1qab1HSZSBu79cb1wQp7GLlZ+KEuxJlbUunHtg1GdbTk0RCNa3e6ca7NO1DqcdvC8+NSE4oWg1dvN0E4R4jmtjL5fGXipUrUQAThw3AP/51nElqUufrnXYf0D3WNf2727exGpt7D6SmGL8DzPqVzMstT+/CUOT2WO9eXs11S9MHoZ9utUhkyH89otH4MiRfQLXtEvBzj2igwb3jJVHuSYdAaBbXbIo1zUVJNj92rQOkwT9UISpJhykOa9VkyVcd4Y4fFXYZHwa3U21YtxYGamXYJAkDznpED7q9cP7dk1Unh++dJ28VQuUDhvaG5NG6L2EJuE/zFdMHRcvjzIOnLqKVipHUNnbm8YetntYVD41oRhJRKU4yRS0qKsydc2N2YzYpg8A5x05FHd/uV56LZH5MADWxu4jyQNJKtjLKVAIXq8Y/72I3gd3mfYNnzrYc3x436545JvH4gfTDjRf0TC4aqvCIagopymmu88Uc/6koZKUYtqDjZ3HdJ/uqlgJrVNuVBu7btiMumxGWmaWCCeNG4gVN08TnjfpsFHI09rYvSR5IDIXqyjX83z5mBHxM4tRNnn+Dr+RUgf2D6NHpxrPM4zr+5+2YO/ZWW5u6SowxUSzsZffK4bH/KSgXt6yc1E14827WsITIW/6kJnwwt6PVEwx1sbuxZRgHrdvj+jX+7rjxIQ+zTEqEIkcy3cg2TMrtcZ4wrgBnluI61uc9odK9eHwT55G1TB53/V2IdhTfJZKd0fu5EOXHFP47X+eSYL0+ZG1a9gjMPGI/EVbP3YfSYZF/LUXHzcyeV3CvvQJ8x/dv+iaSb78dPPOKvZFHT+oJ64poTmG4H1mcVcDpq2xq/JPujSdz7uuJv2X+3+nHICjR/WVni+XGx+fTDUBevRoed2jIpuwDBOycYTw0D7e7RL9brJWsPtI8k7z15oQDnwWabRTry61+MHp8SYYXYhI+jEkInz1+FGJ8o9WF/g09nhdL+2XQpV/0tARvI09qU+8DpdNGYMh+8j3ZM2mOmpTTZ4W4Z+Df4HS96eOxSUnmAkMJjPFhGrsMcr63iljPX/7VxmXwjpaUYI9yQOpq8kUhnpmBHu6rcPH9MjPD5DnbxkHDiq6EapMMaUmr7EX/+ZNMcP66HsQpW2fVA3/ReajaCtPS2+KUfXTL04eHsssKSNOrPE67jn4L6/JZHDygQOSVguA/J0PkwVx3h9RiO2keUauQ/pFmCOJTXBY326FjhNHKPu1ibTbJse8HV23vK8eN7LgxpYRxJgpJ/zogY9zc9eFcnczP2mbYmqzGamHhEmNPYkp5vgx/XDz2YdopVUNDLrUZXGTZj466G4TyPdJV5vNZigweVqK/tu/e6eQFNHLDxPs1hRjkK8eN7LQcUwIhygdbkoMrcMfhU9XF/rUxP0K9xe24bUu1585Hv2618W6dtqhgwC4gcyKx2NPnvpu6PJPHIDLNTetSIpIsMf1ikliivnKsSPQN1Qg5VH6k1PyAFk8uRww7ZB8e6u0d75K7sjlpHEDAiq733wn4+RxA/LXK5BVp38P9XMkij4SCZsstYLdR5IHcuZhgwsNZEaw66edcuBAHDF8n0j589oPEXlNM5JrPj95mGcxhsjFM048joMG94q9JHvsQPFQnxeSUZ5lYIOGmkwkTfoM50MjQ1WXOp/5JGp35DX2JH2wLadvklIlI1DikLY8DMDtn5uAN6/9hPKDx7/HdTUZPPu9E/Cr8ycGrvGvuJbxvVPHoofCTRWQx6Ef3Fs+B+Gvqy4DenonhP05WFOMD1MPxMSy9LAG57tRXU1Ge/GGS1vOa/xpVSzG8HdZV2hkMsEt9eJwwMDuhQ/LwJ6dcMr4gdrXFj4y8LafV7CJ6/j36UcFjvXT1FRl3Pn5w5XnVRquyHwS5UPJ33OSZeXdO9UYade8xi4WAXGyZ4yhNpvBPt3q1Bq77++R/boJIzDmN+QIr0iNxrMUmYn6dqtDtxCXSt3H8H1nJfXwvl0FCoBfY9fMNAGVJdgN5RNHW/L3i2DsGfm1cSbKeA2DALS1eTV4Ee5R92UQfcD8cwVhMVtuOecQ9O5aVxDsPzzzIMz4kr5NnH8x5R46wWPTDhmEcfsG6zain9lQDYG6KM75zSdJ/NiTKBdHj+5rJN7Ic+9tMGqK4Z+Haj8P2ebV/ufpVwZkZDMkbQt3MjwnqFCfbuHmRd1mOnJEcUTut7IljVMVh4oS7KZsU3FeCtEwUReRYD/1ILXWm8sxT2dtjbDzjavBbNrZHNqJ/vn1o6Xnhvbpgs8eOQxA0eZfE/EjVUgewUPnwW8cg1s/e5hQyopWf5pEVceaLOGuC+tx/JjitopRYoh7NHaNZ6EKxKVtilGka9y826gphteKVU/lY5JNOAIOCpqmGJWi1qtLbaA+7nPVaTmRMiIyL7ojDsbCvWCsjd1H0udRcHdUZPS3rwWH//lr/Z1OvzKiVZ6XnjhGeU2bzyWm1ef+yOPGMOnpdOIoAkQlKP9y8eTC79aCYI/WCF6NXYz/+LA+XdGpJhu4z0+WYL/TMBv7yQcOxOmHqO30MmoimmIuO1neR3SFg2pR38/PPSxgNkgCr3uoTDG3nKO31Vw2Q0qvHj6djB+fdRAA4PBh+6CHo727yXUmRUWP2c2TxzVpMbCAfAlOnoYWm5iKEuxJcTUCVUeQnQqaYvRbR1Re2OWMeTUY1VZ3nzxsP1x/5viCIOBfBlOrdQsau3Mv9108qeDxoqJoY5e7rslskDo1N/2OqJ6XyB4rkw38ymEX3itGp//UKiaFdbufKt3B+/WMvVBMBN9fVTJTtlaAv+agwT0xoEdnrf5bl81Ite+TD8yPjLMZwrVn5kP3RlHKwpK+fOVJWPyTqZ6RrP+j7W/rNAKL+UnUqkT0GSJaQEQ5ItI3vMYvTyudLBa6zgIlXTMNAfjH/xTNGMohvEDt0BLszC1L7RWTzRC+cuzIwnCwa23xxUmiHfB1LAr2/L0cP6Y/9u8f7inDP2tdjV3WPqKXN0lIVZGAkbXL2RP3C51o4zlh7ICAP7zHK0bRAc6aMBjfnzoOIxThmU0M5+tqMiCiUI8SXXiNXdenXXb9V44dCSC8/04a0Qf9e3TS0r7dNAWNXaNOREH/ep7Bvbugc2220J6Mhc+fVIJXzHwAZwOYY6Auoaga+Z6vHFn4PVSykrHox64uQ+SaKFo8wb94qn7ll+uXnDA60otJBLREsLGPG1S0AZrqRG0CU4xOjdz7FLleyqDCNd4LZMIi7j1+++T9g3lJ0o6WuHsWPr6+C/3rEAC/V4y8Xvv17oJvnDBaOZ+hb4qR45phTMkZXrgm3eauMGoLuc9bP3tYqPD11ymSxq6brmDeESxI8k+mtveNNhhjixhj75mqTBju43AnRHh4rTjMbqh6KWSN7hcqGYJ2q2eJMNEZRTz5neNxxdRx4e6SvvI8giLk2oGOH23n2ox2JxYt1PBo7MxrihHVUURBsEPhzeM7zLtIpkmUjytvshDd9nH79/P8LXJP9djYE7rxibq4aDWqeoFS/pwpQcN7nsTZmJq/xq12WNWiCGn/AkUdj6A4SkOYKcba2H24jdi7a1CweyPniW9LZ4GS7IXzv8yTRvbx2MpUHSCbIVw25QA8+Z3jCy58YY3LF0cQa4Ay3HuY/rHRAeEoEkoPTD8Kj3/7+MBx/qVxd2SqVcT2ENfFzUuexm9zlF6TUAsMlCuqlKSiIs8m1T2JdrDi+52qDxaFWjQFZELMUNJuTnFWSPN4TTExMhBcox1FVaM8t7+O6tcN/zvlAMy44AjP+Teu/UTgmjgmL78pxp9Du7CxE9FsIpov+HdWlIKIaDoRNRBRQ1NTU7zKOs9D9FJ4BHuI54byhYGepsgPk8PSZ5zVoLxfdliHzdvYJaaHsPI4bUdHozlqVF+hxs5rYO6HhX/OceyoInTdwVyNzpR5SSRbZVmHrUXwP+fhfYOTp7wZS+ceVBq76BmJBIZOOW7dL3eiEn7uSP2dof705aIJ1LMoL6G3jXsvYaPCKIK32H8Il00ZEzDZivzaRbmLalQ0xbCA6WWgbyVqu9DYGWNTGGMHC/49EqUgxtgMxlg9Y6y+f3+xH2soztMTdXgtjd35X+WyF9X2rYNoMkXUuPtyHcA/LI2zpD/pCtu9rUVzgmuK4V03o2hlIqHz3PdOwCtXnRQ4XjTfeK8x9B0pIOpHspdOGCfG65HqYfrHgiGRea8YnbYRhdV11z8IP0oxm5sfIa24eVqkwGAnjhuAi5yJTl4I/+K8w/CNiCF3PaNUp05hykNBoGqo7LL5EHUBmsm4TPm2HdG3K66YOlaaNi0qyxTj/M/b091npBMSVcePPcoz100q1K60NPbi33+ffhQmO7vA63oxEAVfjC9MHq51LeA1//i9YgDNl0lxbkS/bhjUKxirQ2aKMS3YP1M/FF+YPMxzTNYuYbFt+GMTh/UWjiqjxooRfXh+ds5hAGQau6BeGr2UfB/SqIKn6BdePDawZ2d8f+o43HKO/kdCpJ0rvHwBRJuH8XvF6KBrNnHbqlfXOk/bfnrikEC4hHahsasgok8TUSOAowHMJKJZZqolKy//P69xuw+0RkOwu6gmi6Jp7MW0qvCfos0OdBrX7eYEQt/unXDvxZNw09mH4MxD1Qt1+Fvwvys6WtQnDxuM/3fqWBwwsDhKEJlioghapY3dd07u7mhWsneuzeLGT3sFj6yaMvOeSBjJnovH9VNpDqRAen8F3ct7hMU60THFaKa9/6uThSGW3fdJpF0frFg968czAnIqEza35KbT6YvuAr4o8YZEz0RU1sCenfGTsw7C3V+u97WzaCVq+pI9kQMrY+zfAP5tqC6hFGKgZHjBnkFLW1ukyVPVY43klsf9vvSk/XHRPQ2BNLd99jDsI7Dd8R+QrnVZ7Gpu89bVVycgP4t//iSvhqkif7vRheHAnp3wzRO9roDuC8Z/NEXxN8R1UOPv6LKOL8pL1VQ/PusgvL16Kx58ozG8EoWyxcfDIkjqdBmdYFXe9PIJ2ywnTP/19aNDA2/xHLt/X/zwzOLqSd5zScWwPl3RuHl3sE7O/6LuEGWiUFR7XVOMDmceOhh7W3L41MT9tK/JEGm/QhccPQIAsKu5tVg/BJXFdq+xl5qiKYYT7NmgsA+buFF9MTNEOPWgffXqw2Vz0jhx7BedwFePXnocAP/KPZbY9MAQ0ztBgOu+VxPXxq7S2DWvKY5g9PjS0SOwn2JrOHFdJKaYrNg1LmzRFB+hUjf4nN/VT7TIixcW9SP6YHT/7tB9Mvv27IIxXLwTHc8lf928xxytWfA0ktr93bC6stWqbvZaHloZwnlHDo0U5pkQvK+wkWNY/HVrY/ehsqfzD082OaojGDKU3+y6s0ZwpCRuS54YKprDPV34epmyS7tu2fxHVccrJon5RHfyNKn7mEdoCLLq2bkGE0NcCWUv6+RRfQs7WkXdXIOI8I//OdqzwtlFd/WkzpMp1l2dmkhsqhTZ2PlrdBnAeWa5bdqnWx0+uOl0XHiMeG4o7YBacbIPM8VYjd2H29j8C5KNYGPXmRXP7/RDyr0vuQrl8/UdPn9SuLsY3yFNd06Pjd2QXbqosQefbTetWPMKm3KC2zch2Ob+4GT87ouHS9M/ftnxnnACvAArhn1A8KCDaNWuLpNG9vEKPNdsIrAtR3DLF6bh0+qOooBi/xWZ5qL07YuPGyksJ2wXKMD8/Esh/xhKg985IywoWBpUlmB3h6i8EHd+e3ZlkQl2jcaPNGMuSXvT2eHR6/hyRGX6FyjFJYrG/oPTx0nPue+sSGNXmRi0bOwa5iont/DMQvMI0r1TTWFiTZxHeP34337Fwo0/3kWwmYQwX9/fHv9353+3v3vcYoV1zB8d1Kuz4KybxpunPJ24paYenDddThFswBKl79ZkMwV3Tt3rUl/sI8m+Nkv4Kvch4sl4NPZghMoSyPVKE+xB7dzVIL1byYmv54NqiRjVr1skm2yS9unRuShI+Pqc7UzsMMYSayGMRVtEpJPUG1LAOaaxGEXXK4ZfDei/xNR8gRDFaE5WdX8ETiDvinrH+ROF6UW7BOkgcu8VmT9Uj+fCY0ZIz0WJOyNKevB+vbDi5mk4cFBwY5S4QkzbgSFlCSbTWZbeeDquOWO8Vh52M+sQ3MfhEezObz5euezBuXG0RbFmAOCZ751QiB8Rx5sjCl048wWfzdcdd8Qc78cesZyk3UZ1X6KVp0qNPUK5vbvW4hRu4lo3zK/L+EE9AzHbdTU63rXUT3DyS1grAMAVp46V7qOpq7H7qfOscvaOUPnnK/KKocI5ef7FNMFE07jY8/kio/auaOmjzgnp3F8ShH0tch11+o9ZKkqwu4oL/2DcYSofdEn24L4/dRzevPYT6CWINeNHp+1U7eNuYBHmU9+3W11h6MZYtGXuOpjq8O6erXxHF5lneKZ/bFShAqp7IN//MsYIVt/y1xwzui++f5rXnKT7EvnnX/76teImI6o8ojzfznXxXjdRKIKMYPZUWBcNG7ToI+FyCrfTVz6mvk6N+byjpZcZlqQT52lPnirKVl7HzVv4q1gKjT3dfcYMI9Kmph48CEvWL/XEeZA9t2yGhD7lcVG19w9OH4fBvToX7I8i3r7+FGQzhG27WwrHipNiyaeDGFgkU8wXjxqO99ZvxyWCRUyPfes4vLFqizf/EI29S20WWoOOwktAosMA8m6DhwvCKQNAzy75bty7a23sj6A/Ds0xo4vRGiPp/Iob1Y6f4stDNOmaEQhssVwPr31hAlKk8fu8tyLr6xGFWNRl/1Fiq8chrsKeJUJrzFhPJqgswS54It85eQwuPHo4+nKryUx8Ed1OPu+aKTjihtla15xx6CAsXrcdQN6G/i3F1mZA0SS0Y09xQYNIe4p8O9wFUbSNbp1qcOt5E4TnRvXvjlG+jTXcj4ZsVNKtE2du0ujO/u8Df9+TR/WVXnfuEUPR0sZwXv1QbNq515tHaKl53Ock7DsqjV0/aWztslZoYw/mpfqIK00xrldLyAIwQvR7iH7H+UpE3fqPj9y4fOPOyKWG5R+VfP1ZfpQjPJcuFSXYRWQyVBDq0w4dhJnvrPWcH9W/W6QlxH50OrKb4s7PHx6zjOLvgnBjSGxHyU/upYcrCEQa+/mThuHLx4zE4nXbAMg3MAZ4LS1eh89mCF88Ku/nrPPSPPe9E7B5V7PnmEoo6uQZK8CUhIAg8CxQIk85fLUFIeA99TlxbH88+14wsqrKD91fMd3VraLydRC6j0Lej4v551Ps26uzWcEesz0zGQDOYnJ/3HdrY/dR9IrRX1n6zOUnCBd4tFeEGntErcH7bUhPtBe8YgSC/ZsnjkZdTQaHDumNxT+Zik8IXOH8+fhzkU6eKuoUzCOYZkS/bpg4zGvWKZqMghdEefqitlLde1T8Gjv/QRKu/HTPMYbTJJtwi/Lyl5fPK7pEiqqdRu2taQtJPv/xg3pi3L49pFtv8vA7h/XqWouHLjmGy9Nq7B7aBMvaPRSG03mbbJIvd5qaroriRGp8G7tngZKTyWkH7xsIeJUU96Mh8jLiO2+Ymx+LOPy+/pMH4dqH54tPBsw5yU0HOnmo2uoPX4q2HbDSNdT5PytQAJKu/PQIdlcwcU+EKP33ohDPSbPeflOMafj7P2S/Xrjl3PA1KkAw/s7hw8TzQ2lRURp7i7MrjUxjdzsmgTB5VN9IAbP8yLRIHne7tOkfixZ3WlomvJNBJob3rtDs0blGuJFAEtx36dwjhgTORfGGyHEfZB0uOGq4MN55Po+YD0vDHbCQVOGJkr4GmS+gMLLjTTEJbexhH4Y4txbZFBPxOn+f6RQhDowOcdtzx97W8EQpUlGCvRhhUPy0Tdo5XVR51WYzWHHzNFw2RT1JGgXdONu65AofKPMSh588nXKg19wQpTx3KXqcIWqUyUt1PnJNUVM1jEgAAA9mSURBVKdaOpFDdVE9O/eMaGGOOPpleI3c+P5hfY+IImvGkU0xkv4a5u74JWcB1g2fPgTfPim4SXlckrbne44zBQD8/NxDcfB+wUVcaVBRpphWZ2l2WLxuEy9XmrZpFfykWGKHR8Zw1oTBePn9Tbj81AOSV85HjvuQ+t/fKO+z0YlHrcVEijpEzpMpzplH5RXD1+SFK06UnvNz5/kT8c95jThwUI/AuaDGnvLkqbew8Pyd/z9+QH+suHkaAOC7p4zFHc8si1awhAxRorewjZMjn6kfis/U6287mISK0thbuA2VJw7rjQscTwiXoqBJ/nad5zRA3GXgcXFtpzohEmTw2k7Xuhr86vyJGNBDHiskLkV7aFAvjFJlN5Lm2IFBwRJGknJ5VJ45qud/0OD8RhJRQsG6vHDFiYGRThhFU0zwnNtnJgztXdjPU6fvDOjZGd88cX/Je+OzsXNS7pFvHhte38grT6MpZ6WcPI1TVtLtKeNSWRq7O3maIfz7kmCnirP1lYwfnH4gLj9lrEewHzF8H8xbuTl55j6Kngter5jz6ofi/ldX4awJ+hsDlJIc97yDGrt+Iwzo2Rl/uXgyJoSExtUhsPw/ckiBIKocfv2Fw7F47TY88PrqSOUBwNA+XdE35ryHSGMf7awz+PrHg3M+YVEgZfi9YnjtVWcfXv76umwGozX37tXtP6mvPE2Yfyk8YERUmGB3Jk9Dw/Imf5iZDHniuQDAg984BiOunJk4bz/9e3TCRceOxHlHDvG8sMP7dsNb150SO9+0jUmu33SGgsswojbBcWP6hSfSIaZJSOWNoepP3TvVoH5EH/zttdXC8uOgU2eRYO/VpbZgjijk5fwf1axHvv+Df+jVk0+z5MbTQtPrOC2UmmHO6GfsvtFHlKWIvS6isgR7wStGZmPPE/VhvnDFidjKLesPI86wWwUR4boz85Hitu1x6pFAKl9w9HA0rPxIGdHPBEU3xeA5k/15VL9u2mlVwkYvWFm8yeu48ztjBuppsH60+7jC40Xvcvkkpla4gohP5AuTh+HFZRsxLoYQTYtj9++HRy89FodE2L+13FSYYFf7secUWpeKoX26QndK46efPgSTRvaJVkAERHG2o9KnWx3uu3hyeMKEFJegB4NDmVo2/dAlx2BEX33BHjTF5Ln4uJG4+vQDpdcVQwqE56ki6mjxomNHYuKw3vjCH1/FnhbB0lEJUULtJsHrFZP+ytPTDhkUGHUABhwJEnLokHhmwrDNuNOisgS7YENlHjdcas/O4dEb4/L5yfF943XIJtSwSgkvDJN4xaiIurAjMJlKxeMZlcauNMVoFByzvTIZwhHD+2D/Ad0x/8N8+AWd4mJ7m0TE7xXDJOek18cst1qIEoTPJIlsCkT0cyJaTETvENG/iSj57JcCV7DLhtTXnTEed35+IupHpKdRp03B3bG81dDCHZoO7t0laGNP+ZXu1z0/6eiP1hn4wGg66bnzNjpeUKJ3VTX5qsO9F02ONNTXn1x0fsQUMF6vkPT92KuNtjK9yEk19qcAXMUYayWiWwBcBeD7yaslxtXeDpMMizrXZnHGoYOF5yqF4orC9i/aLz1pf0wZPyDv8ucXqCk70l507Ej079EJZx3m9RiKO4l70rgBuPTE/T37bkbJI+pSeD99utXhYwf0w7sfbtXO4ztTxuDkcWp3Sd0PW9j1+d8xrjcl19v/6yCkTRSZrQQkEuyMsf9yf84FcG6y6qiZevC+eP3qKejfI360xvZO2vGlTZLNUMGP25Q/uS412Qw+PTEYykAmSMK+k9kM4XunjhWe09tBKfxcGBccNQLPLm4qrKEI4ztTwhedJRasPj9uzx6rWqaYDq6xV4GN/SIAf5edJKLpAKYDwLBh8e3U1SzUgaIQMR3zotSUy39XKtgTfCp17uQAx4tjUC/9PXP97NurMx6/7PjY16uIOgB0bcM1gpDBkejYch1t5VHYwwU7Ec0GINoG6GrG2CNOmqsBtAK4X5YPY2wGgBkAUF9fXwkKaVnIZAjfnzoOJ40bUO6qRKJcgtxP0BSTvF46eXz9Y6MxeWRfHCHZ5alcxPVj3+t46PBzDuSbPY2zeUpHo1yTp6GCnTE2RXWeiC4EcAaAk1klGIYrgG8ItqZr77SX91cmSJL0TJ17y3u3tC+hDnCT8RHvf29rfpeIzr5NIqJuLWn6gz9mQHcs3bAjNN1LV56EvS1tscs5bEgvvN24Nfb1LhVpiiGiqchPln6cMbbLTJUslUg7UdgDguSY0fkt9fhNmaPnmahK7YbjndW97m5TKva2uhq7d1u+Awf19PwdhulHd84RQ/D1j48OXQG+X+/4JjEA+OvXjsJHO5vDE4ZQke6OAO4E0APAU0T0FhH9zkCdLBVIe5F9/nocOKgnVtw8zbM5deQ8q0SyD+rVBStunqa1A1BRsMv3rU3D315GqcVjt041hUBqcfjxWQcBqFCNnTFmLvCxpSqYduggNG7eja4ljorpUiUy2Bg9nd2tuneO9qq7ZoxOtcGNtKPQUf3YxwzIT6a3VqJgt1hcXK32pLEDcI5gRyWeUf31QwTErUe1cepBAzFrwfrI131+0jC0tLFAiOswRBq7PwRttT5rExQ3CLeC3VLBFL0v1Mz/0anSIG4WOb/5whFoieE7V5PNCBddheFqmvzkqSokgwxTsv/Y/fthxpzlOHJE+5ugFuHGs6pIU4zFUkDzBe7eqfK73IljByBDepOQpshmCNlM6cxbGcoHeZNtQwlo2tgNzb58/ID+WPyTqSXf+CYurgnKCnZLRVPcLb76PV737dUZy28KRiCsJh699Di8/P5GpblFL268uTpVilAHivGs2qwpxlLJVFLwMks4B+/XCwcbiD/eUe3wQ/bJe9Sce7h6viktrGDXoOGaKWXzR6047GPqMOgI7Y4p1vNB3T646XS7NV57pl/36o5PY4K4S9ct1U0HVdgBlHe0UtmRpiztho78AlvkpCXc4m4CHsanJgzGQYN7hids51iN3WIUa7GylIKnL/84tu1uNZ7v7Z+baDzPcmAFu8UISTd0sFii0LtrHXp3TUdrrwasKcZihEtOHI2DBvfE1INEEZ4tFkspsRq7xQjD+3bDzG+ns0mExWKJhtXYLRaLpcqwgt1isViqDCvYLRZLJPjNNiztE2tjt1gskXjga0dh9Wa7YVp7xgp2i8USiV5da9Gra/I4Mpb0sILdYpHw4DeOweJ128pdjbLzmy8cji4VFFnRYgW7xSLliOH74IjhlbGxQ5qcfsigRNd3qom32YclPlawWyyWVHnvhtPKXYUORyKvGCL6CRG9Q0RvEdF/iWiwqYpZLBaLJR5J3R1/zhg7lDE2AcBjAK4zUCeLxWKxJCCRYGeM8TNL3WBjQFksFkvZSWxjJ6IbAXwJwFYAJyaukcVisVgSEaqxE9FsIpov+HcWADDGrmaMDQVwP4BLFflMJ6IGImpoamoydwcWi8Vi8UCmdpUnouEAZjLGDg5LW19fzxoaGoyUa7H4+UfDaozo2w2TRvYpd1UsFqMQ0TzGWH1YukSmGCIawxhb6vz5SQCLk+RnsZjgvPqh5a6CxVJWktrYbyaisQByAFYC+HryKlksFoslCYkEO2PsHFMVsVgsFosZbNhei8ViqTKsYLdYLJYqwwp2i8ViqTKsYLdYLJYqwwp2i8ViqTKsYLdYLJYqw9jK00iFEjUh7/ceh34ANhqsTiVg77ljYO+5Y5DknoczxvqHJSqLYE8CETXoLKmtJuw9dwzsPXcMSnHP1hRjsVgsVYYV7BaLxVJlVKJgn1HuCpQBe88dA3vPHYPU77nibOwWi8ViUVOJGrvFYrFYFFSUYCeiqUT0HhEtI6Iry10fExDRUCJ6logWEdECIrrMOd6HiJ4ioqXO//s4x4mI7nCewTtEdHh57yA+RJQlojeJ6DHn75FE9Kpzz38nojrneCfn72XO+RHlrHdciKg3Ef2LiBY77X10tbczEf2v06/nE9HfiKhztbUzEd1NRBuIaD53LHK7EtGFTvqlRHRhkjpVjGAnoiyAXwM4DcB4AOcT0fjy1soIrQAuZ4wdCOAoAN907utKAE8zxsYAeNr5G8jf/xjn33QAvy19lY1xGYBF3N+3ALjNuefNAC52jl8MYDNjbH8AtznpKpFfAniSMTYOwGHI33vVtjMR7Qfg2wDqnZ3VsgA+h+pr53sATPUdi9SuRNQHwPUAJgOYBOB692MQC8ZYRfwDcDSAWdzfVwG4qtz1SuE+HwHwCQDvARjkHBsE4D3n9+8BnM+lL6SrpH8Ahjgd/iQAjwEg5Bdt1PjbG8AsAEc7v2ucdFTue4h4vz0BfOCvdzW3M4D9AKwG0Mdpt8cAnFqN7QxgBID5cdsVwPkAfs8d96SL+q9iNHYUO4lLo3OsanCGnhMBvApgIGNsLQA4/w9wklXLc7gdwBXI774FAH0BbGGMtTp/8/dVuGfn/FYnfSUxCkATgD855qc/ElE3VHE7M8Y+BPB/AFYBWIt8u81DdbezS9R2NdrelSTYSXCsalx6iKg7gAcBfIcxtk2VVHCsop4DEZ0BYANjbB5/WJCUaZyrFGoAHA7gt4yxiQB2ojg8F1Hx9+yYEs4CMBLAYADdkDdF+Kmmdg5Ddo9G772SBHsjAH6X4iEA1pSpLkYholrkhfr9jLGHnMPriWiQc34QgA3O8Wp4DscC+CQRrQDwAPLmmNsB9CYid7tG/r4K9+yc7wXgo1JW2ACNABoZY686f/8LeUFfze08BcAHjLEmxlgLgIcAHIPqbmeXqO1qtL0rSbC/DmCMM6Neh/wkzKNlrlNiiIgA3AVgEWPsVu7UowDcmfELkbe9u8e/5MyuHwVgqzvkqxQYY1cxxoYwxkYg347PMMa+AOBZAOc6yfz37D6Lc530FaXJMcbWAVhN+c3fAeBkAAtRxe2MvAnmKCLq6vRz956rtp05orbrLACnENE+zkjnFOdYPMo96RBxguJ0AEsAvA/g6nLXx9A9HYf8kOsdAG85/05H3rb4NIClzv99nPSEvHfQ+wDeRd7joOz3keD+TwDwmPN7FIDXACwD8E8AnZzjnZ2/lznnR5W73jHvdQKABqetHwawT7W3M4AfAVgMYD6A+wB0qrZ2BvA35OcQWpDXvC+O064ALnLufRmArySpk115arFYLFVGJZliLBaLxaKBFewWi8VSZVjBbrFYLFWGFewWi8VSZVjBbrFYLFWGFewWi8VSZVjBbrFYLFWGFewWi8VSZfx/RYzyzxBIEAMAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# data本来就是一个数据,所以我们可以直接plot\n", "data.plot()\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 102, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXYAAAD8CAYAAABjAo9vAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzsXXe8FcX1/87uff3Rm1RBFAS7Yjdq7DUajcYSLLFHjUk0JjFNY0VNbFF/sWOJijGWiNhQREVAUAHpHR7tPcrr97177+78/tg2Ozuz5ZbX3O/nA+/u7uzM2Slnzpxz5gyhlCJGjBgxYnQdKO1NQIwYMWLEyC9ixh4jRowYXQwxY48RI0aMLoaYsceIESNGF0PM2GPEiBGjiyFm7DFixIjRxRAz9hgxYsToYogZe4wYMWJ0McSMPUaMGDG6GBLtUWjfvn3p8OHD26PoGDFixOi0mDt37lZKab+gdO3C2IcPH445c+a0R9ExYsSI0WlBCFkbJl2siokRI0aMLoaYsceIESNGF0PM2GPEiBGjiyFm7DFixIjRxRAz9hgxYsToYogZe4wYMWJ0McSMPUaMGDG6GGLGHiNGnrFuWzOmL6tpbzJifI/RLhuUYsToyjjyvk8AAGvuObWdKYnxfUUssceIESNGF0PM2GPEiBGjiyFm7DFixIjRxRAz9hgxYsToYogZe4wYMWJ0McSMPUaMGDG6GGLGHiNGjBhdDDFjjxEjRowuhpixx4gRI0YXQ86MnRBSSgiZTQiZRwhZSAi5LR+ExYgRI0aM7JAPib0VwDGU0n0A7AvgJELIIXnIN0aMGDEKgtaMhptem4fNdS3tTUpBkDNjpwYazcsi8x/NNd/OgNTatWj++uus32/84gvozc15pChGh0KyFljxUXtTEUOAjxdX4z9zq3Dr2wvbm5SCIC86dkKISgj5FkA1gA8ppbMEaa4khMwhhMypqekake9WnngS1l5wYVbvptatw/rLLsemP/05z1TF6DCYdBHw4tlA07b2piTG9wx5YeyUUo1Sui+AIQAOIoTsKUjzBKV0HKV0XL9+/fJRbKeG3mgsclpXrWpnSmIUDFuXGX+11valI8b3Dnn1iqGU1gKYBuCkfOYbI0anBP1eaCRjdEDkwyumHyGkp/m7DMBxAJbkmm+XByHtTUGMgsNi7O3U1s3bgaVT2qfsDo6uPuXmQ2IfCOATQsh8AF/B0LG/k4d8Y8To1LCZR3tN4q9cALx8nsHgY3yvkPMJSpTS+QD2ywMtMWJ0LbS3KmbbSuOvlgqVPJXRUZyI9yx2BcSt2N5o78Efow3QThI7MYd3iD62bEsDRv1pCibP3xSYVqutRXLBglyp6xDoqhrR7zdjb6kD1n/V3lTEAEApBY0nufzC4lpUD0z63YY6AMBHi7cEpl170cVYc865OZEWo7D4fjP2Vy4Enj4OSCfbm5LvPY6edDROer2rOVO190RliaP5paN12bK85hcj//h+M/YN5q5RPdP2ZdvSVHsP/ghIJ4HZTwK6IQEmM/mbELe3bMfGpo15y69DIdf1fs0yR1+eTbmdqY8VGA1Tp6J1xQr7uqtWzfebsdvoooq2fGPa3cC7NwGL3sCMjTNw0EsHYe6Wue1NVYfBjBVbMTWEKmPmppnYa+Je2JYMuSP10QOBR/aPTpClYw8hsXdVBsej6trrsOq009ubjIIjZuwxwiNZa/xtqcesTUbUiG+qv2lHgjoWLnhqFi6bOMe5IeGWzy98HgCwcFsB4pRoGUDXzAt/HfuOlh3fe7tGbDztkjA7dXu0bmfsUYpq/G3aCjr7qdzyohT44iGgaWvudHV4hGvr+pY0WtJacEI/3N4H+OeB7mIFzHtN3Roc+eqR+PeSfxtJ89gdG7/4Aqk1a/KXYYzI6HSMferiLfj3rHX5yYxG3xmYyujQ9SyknOn3Axs6t9qiZUMDMi0KsPwDIGXEuiER6k6nOp5e8DQaUg2GfePDvwBvXFUoctsfdv8K11/2vvUDnPbI57mXu93Sx8uNp6vrVgMAZm6caaTIo+C+/rLLsfKkk/OXYYzI6HSM/bKJc3DLG/nyoY3em0f9aQr+8N8syv/4duDJY6K/11b46DZg6t98k6x+4Ausere/y9hMIoh6n1V9hge/fhATZk8A9LRxs6U+K3I7B6L3rxXVjcGJwsLHjz1t1n9CyX6PYi5qnGlLq/HZ8vaL8trVNVCdjrEXBtFa+dU56/NYdAfpYZ//A/js74HJtJQCUD0rB7oWzTjUoDnTjO+DwdquI0kbF1y/7eMVkzEnZ4uxZ6WKCUH/tuQ2LKjxCkKXPPsVxj89O4tCY4RBzNiBjsNcOzDWXcWoTKgGajKCKKoY2k5+3fNq5vkyUZpOQ0+F23YfCe3er+SqmAw1GHuRUmSkyIbUEC+dN/k8XPDuBVlkHiMXfL8Ze3sOPD14N2BHQtOn050Lpt6iMHbbVu16p7BtMG39NPzs3Z/htWWvSdOsPOVULN17nwJS0U79TLDzdO22Jny6rAZpLXdVTBhsbtoc+Z2tja14e14X2dOwZDKwaX6bF1vYVu00aIeB1+7SXA7QNScgbYQ1vG4yGIUobbZ5pqqhCgCwsla+wSe9Po+qNRHaq60tHbvueNocdd80AMCES9pGFZMNLps4B/PW1+LwkX3Qp7KkIGW0mVPaK+Zq5da6NirQQKeV2BfULMBeE/fCV5tzifUS3DHTGx3JIZ860U7tPyzRsX+ytBpvfVMlHfA6DMYeZTLIFfkoq2XpMmyZcG8Wbcalr9/oYrKFh9yPXaSKKR38AtZm3g2ffYH68KZaY0dzJhvvs5CITLqWARb8J+tv3ue2D9p0FdJpGfuMjTMAAF9u/FL4/DfTfoM3lr8RLjNRY9VVoeGK/lhxzLFo+PhjaTI/ZLZtw/bnXxAzBLvTdkIGTzUh1Tc8+wnOeGsP4MtHxa+Z9RBJfdMBsO7SS7H92Weh7dgRmPYgshgl4PX1FKjfBPxjDPDxHYUhUgSfIGAiVUxR94VYnnk5fP4FFk78sqe6DppOF7R8F758BHj9Mtx17+044YFPI79el0zj9ncWFYAwMTotY/9oiTH7WRIHjw/Xfoi/zPiLfyZ+PWfDXLRsLwYAtHxn7BCM2o03/vZmbLnrLknQpM7B0Le3CA5pYN0dGSY9gJg7U795wfibbgFeOAvY4u7QhhRdmABVUWG5/flCM6XsAOl/Z7IZk0puxx2JZ9wPKAUaTV3zio+yoDJbhJfYwyKZclYcopbLx0rUno98+sa6n1+GJXvtnXNZYUF3bAAApOursWxLdi6pmcqpmLxqcj7JkqLTMvZ5VQbDyY/xJ6Azmj0taqfVm5pcf91FdnzGPm39NBz16lF2+AAbIcLAAgA2zAFWTgUm32i8BkZiz1ZFomWAHWsjvyZjEld8cEWId8OhB4x2Hq2YOntRGxMSTj1EKbDoLeN7s4Xtx+5V/1gSe5EajbHvfdv7zoXo+7TcVU1hVnTNM2fmXA4Qrhu2LFmCJb+djIaq0pzKyvR8B7//7Pc55REW+TjzdCgh5BNCyGJCyEJCyA35ICy4XLfxJycImay3xaOyYlJsSPy0VXBKfSfwirECfH239Tv3A10HNetHyKSs+uSiZloTo0Jy6HZTbwUe2huo2+C6nVq3Ds1fRbe3hApiZqmQlKh0M+q2qBP5wjeASRcBMx6OWCYDHwO1vUGJRBs/aY3Ji1I0phoxr2aecyugX2u6hs9ffQAnrQlmzB1F9knON7xaGjeW2P2+oyMfEnsGwI2U0jEADgFwLSFkbB7y9QcxOpBwKRn68Ay/nuN9FrWj2Yxd4CNtMTlKKWgqhaUHH4L6dyMYrtoASzc3AIB36ckYT23p6uM78U7xLe50z5/hutRFkn7USl35ifG32R0ZceUJJ2Lt+Iui5RUVAeKddNBTisgHWzeZuzLrczG4+ahi9PwIRtd/fD1+9u7P0JJpMTP2X2EsOPwQ9PnrE7jh2/+IE+ga7s/chaOVb9peSdfaCGQE+xkYfvK9YeyU0k2U0q/N3w0AFgMYnGu+gSDGkq9Fa7E7qY21X7gu121rxidLqr15RIzlEXWDDSkxXLVYiT29aRMapk1zFZmprYVeV4fNd98dKf9CY1uTQXddM6eHpgJ3x+n3ooTIBrW73ozJIMsBYrVZRFVOWDVaZpsglK71bsg8CATpbbrDDrk82CDsLLyMXTPVMypRs8+fUns1Z42NTX/5K/OYen6X7PDqpzWdQrOcCVrqcIQ+B88V35cdTR/dCtzaQ0JuQF3ePRh47lT3vc3fAd+8mB0t7Yi86tgJIcNhHGw9yz9lPgozOuZDXz+EO2Yanga1zSlsrmvx6BSPvv8TXPqcSIoPOWhsHXtEEksMiV1nGPvqs85G1dXXhNdTtxOS8+ej/ybDGKrwKogsabd17D5MmVKKe7+61yekbTTJN4oHTuNnn2H54Ueg8VPO68FaXQWoGXz2tjIEtaHEJ/BjjwJKKRbvPgbbnn1O+FzXdKRMnbpVz/XvvGM/f3+No4/3E4qOuu8TjP3Le1ahrvLXbWvGqvVVQGtDOKI/f0D+LMwAruLCHGS8alRF19Da2oYeOVkgb4ydEFIJ4HUAv6KUeiI7EUKuJITMIYTMqanJPfgPgdNZ311tqDAOumsqDrl7qqcjB7rDFkiZp9iqGKdz2C5zLmmuIMXnhDXn/hS//L9pAACVZ0a6E1LAD81bi6ClnYQud0d7leX++GQmiRcWvYBL37tUnGmWEnsYJL81dMXJefNxzYtz8bf/LXKXmSV0XQucFAoDuSqGnWSX7ViGquYl3tdNmqsnTBDmvqqm0Zb8RahrdTbl+EnLVTuSaM2YZdU5jgaUAkfe9wl2eXoP4N6Rwnct/XcoZNMGXD+jACa//Tusv6Bjh0nIC2MnhBTBYOovUUr/K0pDKX2CUjqOUjquX79+OZepEmfGtAxAKbNz0Fw8CXxg9c3DlQXAs6f6J968AEQxJT2R8VTQ0Tuqf7eicHQxg1lMM4XW2IS1H/VD1ee9mbuM8fSZE5z7WTHOAtYVIZjy3WY888Vq4zqyKsaCkX6f//0INy183PM0iIa8QcTYmW85++2z8dSqXwve8/9eoz0p81sOa3NaEDKysasJxhAMASQ0smHsCqOqIo6OPb3wO8OdN9VsPKMUeO8WoFowQbYD8uEVQwA8DWAxpfQfuZMUjCGkGicknCWTqrj1hBoNyditJbamYe1FF6Pxc1Y3L/KKMdI/XPRPYG1A3Oz/OwJk6dvGeyLjqbWMcAnuFA2pBtsVrRBozWj4x4fLIh3o4JXYQ0R3zBjf0LK9yK5nmfH04yXh44lo0PGPXj2xMSle9a3b1iy835zO4KGPlvtPIj5REGXPXa9bnkKC2vmg2jxZKapHUC6rBdsrRt7WvsJEUNmUghDHCcDz2N25Q4H40JorsqpJv/b6+2jgroHG7/oNwMxHgRfPzqaUvCMfEvvhAMYDOIYQ8q3575Q85CvFUFIDlnXzBiA94uHUWl09mmfPxsYbb8TK2pXeTTnLphj5RtWxa8ayMqzEDgCHvXwYLv/g8mgFcah9/b9okvj5vvDlWjw8dTn+9emq0Pl53BOZwSd2XSSAj2sgr2O/bKIzSYskv682f2WHjpjd0opne3bHr74W61K/XufeHWqV9fnyrXjgo2WYX+UXs8Or5tnvhf3QqpkTc9R9DBmgpdbxOkk1qlh8fxWGLt5ulhYmv1wYu+XHLpdURfaOtfXmPoGA7w1aUyj1Tdh3pVG2SGJXSjd47rG06pLyW1evDigZYtoZiZ2ve6mgw/Vvl1dMS61/ee2IfHjFfE4pJZTSvSml+5r/Cuq310RLkWE6JO+ypTG7CRs//RQTPnsMRNi5Oa8YQnDmW2fiR6+fAkwa77TVRuNcz6gqA1sVI1wCylUxX1d/7dzU0sCE4cB8eXRCHpv++Eesu0Sso7Z0ma2ZCBI7x6SnlyS87o48nO2DxmBd+Yk8pADxV0v94u1LcffTxvc0p41JOyVZspckxF06rVlxasTkcoW7oJmCwob6Knxb/W2IDAxs/qIUq9/rj4qk8X3JGsPmMnrWphA0+BDavD2kS6/cj91vUvnxWz820wSAW23y2OXOl3HLJB2lrVQ4dipGPCLIUz4Jta5Ygea5c7Hq5BByoygfH1XMdf+WnN275gvx/RCYtn4aLh7Yv11MaJ1y52kLil3XPGPXmQasuuFX2HvbKhT7qTc4g1xdRrBTFDnITqIOFVbf11IHJHcAU272PmveDky9PZLXA6UUiq6h35LwDErhmMz1fXuEGPRMiqrZwAtngm4xXOMU1zmn1N6TIMMNb+u48wUNWi0jIUkmlGIJY7ekP/5b3CSLv8qad8a/+zOMnzLevj9z00xsTbLf4s67udrol8XcHGSnSieBrSuk9JhEee9N/BHw9HH+7wG+sWLYSVbVKIZWO+XYYRZCqGL4/FiUVBmuo6ouUcOJSGbS8VmuOu10rL3wZ6HyAaVYX78eLy1+CXXJNKrrWzz0JrrNh06Nb/1o8RYAwMbZPbDmgguNROkkMOW3vsX8qn9f0yvP+/03fvwr7P5lEVpSbW8765SMnXDyAb9JSWckdmu3oOrXSS0mG7QBxVaLhzWAWS96Ga+jY3cMUP6ZCPDe74HP7jd8d82NFTsmTfIliVLg/KUf4ZD/uw1NM2b4prXA69jZK7HrInXsF8yn6UlDTUIWv+0miFmm03TSk9uIzaaOvrWVke7F9VKSMNVyD+0LzHzclvwtOlTeECyC/U0W8xPjig+uwIWTL/S+Ls2Xu542AfjnAcH0mKhpMFV6W8wTiQJXkASrihLY68ubsHT7UtcTawRRUFw0Vcffn9bQr9bJb3rV9BCePAHlh6jqVs4oyurYZaoYHhlNvCK+5P1LcM/se3DU/e/hoLumuiafVY3zUDbk31itu1fCdasqkPzaXDGHUOlOrSjHq0tfFXprHbxIx5kzKbZ90z3Ud+QTnZKxK1yH8tWxJwypSfGTGMK60EXVsdu2K5HEHk7Kvnb6X3Hs0EHiwq3dfjMeBj74I1JVG7CZ2SAiw2BTYt6waoNkULjBe8UQMTUOti6zdyBSTbFjbNgudvzLjMSuP3W8cYsQzK+Zj0lLJzmulYGTIDCz5l1MWT0F2LHamPisV82/CT/GbkmxHGO3yRQUvbGJCevsS5kANaYHRci+cMjdU903fBjfxBlrAKLg4/JyAMDk1e7gU+zO51EbjN/dmDn12qnXoropwC2ZlYC5r+d7FQXFks3e82017tvdjN2/eAt3vrtYQJtuHJoOoNbaYMdMVM0Zg5ZWCILcAfi2+lvMrZ6Hz5b3RmudoxEIFuqc59bqg+ptL7F3yoM2eInd6xXDuOPZErsOSqlcwgRCbBnPUhkjkHzC+jVPr/7UmJyC4tlUL7Y9UfzA5nL3lCXYpecS/Pk0/wgQ2cR2YSXv7Usr0G1IC7P8d4OwEnvtaqDHUADAhe8a0vBj1guuOnNy0Vta7N8Tl98HLAdO5umxVDF+jF3n+4Hbc8n15sKQIaFF4Jsy0woUl3M3CTKtxDVANZ7TUR0y2eyvby/ExaMIVDgMXEyKvE+3pFukzwwKfRg7R5ZOdcxatR0HBZXP0Hnj9OvRbcwcIMBWOmOFeLew881Gy2178ilPuTIb0fgp41GSonhhbilsc3xE/tye9tROKbETUNcGGa+OnZHYVYPpD2rciuR34t2MsvpfVmyoeBabO0j9GmpFdSP2ue0DbKpjxB7LFUzAxKuuvoYhwJvx5R9czi1TKV79ah2+Yb0+WIbLnkoUAbNXbwcWvil9fuAyXeKp7g0ClqLsp8iDqHm2fBBWapO/t3hDLdKm8ZdNVfvqq1L6rYEbdlkPAFuaq1E2ZKJNl1WWS2J/7RKfMt0TggzUiqyY8TLQ5mUbsPyNgaifbxhaX+peCbXCrU4J2gG8sqYJpv3es5EojJDit/kIcHfbuuY0znrMMTSy45NQo7y0wGBPU024WH0fdmUxEvyqpjmBNAKytqUevf62J590PQ+CEokxyw3UsfE0AHpzMypTzVC4bunxinFtoDEa9x+f/RNrzzlHkrGlY3ffbjAZZ4OiGBKAeV/UUC/OXItUsgFLPnzOKduWNDOgAP6vp1fXRl3lOwTM2jQLi7e5l5i/e30BfvwYoxdnGbmihmLs/BigoMBrF0vT//Z1HXzFEMB1mPXEhRNxc78+mPrJICx5zfTr9dvtyNcgq4qxyyA4er6O3aqcSfw/s9dAOIBCqJNC7TEyH3667H10K14EpcSIL2QxdJEqxvW6RKSz6Ld6pb0eMBn716u8fvwt64yym1cYqoJ7+vRG+bBnuYz9v7umKW0PcKnEztznv08PCMHLyis/uPdjfL3OMW4b2gfLr98ox5qUWeyY+lfcVjQRxylfmzRE92MXMnaq+05ezFfLMxZl6xvozcguren4YOFmRoUYG099seW++/DkRxOgQHdVMB96VGf1di6vBQlkbniuTLVAd8e/JZ7DHi/eiepbTUu6ld2q6diiqni0V0/PO6l0RsptXBKHMAnL2BMexp7ZLtYfslnyRafWrkXzHLekxKdhGQABwf1z7seUygoMr4Y1otE892vwkKliWImdHda/mGx4w1jjQskh1jerUw7CD6dtx8R/aNxKIhjshKVWLEcr1x7flbi9uagpkNzw0kwgWYtxxNm1SEyhwn8iCohdQ4ltj2L70pQ3b8Lubxlb8akP+9MCdnCz3mf8rOCR2CmFJpDYT9lhbPQrhuWJE72NxQI7+2UCYcAz5sPJ1cGpCP758Qpc+cJcuw5iiT0AhCggoB7jqZ8qhgSJWUCg8bR8hwJoKbvU1g0qGjZ6D9kdSLZh25Ju2PbKO+4HO+SHJetUxz2zxbE42JVHBhTFfaYBxPB+uWf2PfhPhjFuCRj78sMOR2rtWtc9dhu4UrLZNSj+1qcXVp54Etb+bLzrnbTAihVUqxtu8h4o4Ejs7oxYHbtufkNjupFNYtCra/bLUcIvHDVfx87VhrFsZY3jyqp7voszloI37PmXQxhGUj7saTSa+nzrrs7xEEtiL0EaePk8/KfkbyhBCl9t/gotVtl+FsR3b/KlhzI082qVPd5YYKaR568HGHV1HzsRz9h16Phqx7+l6TWoVqa+ZQrpkKhi7ENKCHDYxgXe5wx4nmK+FgHO+xvMM1up91GboVMxdigKFEo9S3neIKqznThM61CvKoTFTisSSC6YbzPBhs/LUDW9jzcb2VLcR+xqSNdh2tqPhc9YKet/ZcUo6f8eivt+AgB4afFLuK2VsSpJDJx8jHKDFCPf4j6fuZ691r2bMI9JX1W5rtn6j3JY9H5//RIP/isTWmK3YEvsOqtic6WQlkkIwbWTddz9quG3f/WLxsEaW+pbsMst3D46z9LE1OcLjKeiEs9QOfdRPjvzb6u5y9GS2EuQBjYa9BGlGT9//+d4bVuITXHfvgTA2DX5jw+WenZPUpBAVYwfeIZ53dTrkOjOHKrBqnG4dykApI1JVDEl9gUN7jBShHlfMyklIWPKuOkU3GQk9vJ0En+ePZGjzxYXzP+95YaRCXm0EADIYBeyMbKxNZ/oZIyd2IydrXP+6DbWhcrDdzYKNuYIJPY1CfcqIL1hg69006BvQL3qPK9fzxyj5SN1UUqli8G3Vzr+3k0K0K2Z4vrp811eIDaUBEQ9SWt0x792mXOoSE4RIaK7owTFDWkM2i5yd2RWJoLBwKpi3uzJxQ9v2gp88KfItKyqEW9CE9Flk8TQ7fn+TCuuTEx2p7ey4f7WJQ21g64wErs1iSvGsy0pQRRQCZ6bsQYPf7wCT3++2nVfZxi7LAgXpVTKgDRuU9+nVZ+ibLBz2LV7xeMzuZrGU94YqTAk2Yw9C1XMj9JTnGBcJhZuWwTNHM+KoA4tocla+YUZCUa/9+fWB/ak+Dx5Cx4oeszXJldodCrGThTVVsXw3XTZnCfs35bErlLq5SKNxg4z1yEA5vIvs3kzJt2dwciNFKcPHYRGdit9cpvvMvGDuhtx2zAnZvSGL3rbLdpCKVYUi8+WpFSXtjzL2EGB86brOG7pFtS9+ZY3saKKFxym29earQ4jc05MU0JJclfMcuvLWcaeTURKr1eMU6+anzeN1oovKhLum9sCdm5KYH33HRMznnsWyi2XTfO24sfYferRkfg5PbRqSuwkbedoqX8krvRCNJsHTG9sXoYmphMYEjtnW+DopKDSMl5727v5ioWfKoZtRst4yg9Ftj4txk6ziB1/U/pf+PDhq1H17PNINxkT/3kfOWfZUiV4o5EocJtXAAlhPAXQRDdCg8IYTwOLzzs6FWM3VDG6xysGANJzn7V/a7rjEudhdqbKYmUNI8lyRqijFxjXLie8D/+M8pniwFPpzZtBdIokJ0xWmVL/u8UE1+zUX/guySSZDu6j7/QZgEZGkpNwKMWb327A0fdPw+fLt8K9ycepnExSQY9GcQGnL/Yyz1z6qkeVxtT0RYMGeMsyyaxvdqQye0IpFZ+WI4XahOZ0s03BKJ+T58bPM4zIokFivb/vSh2Nn4kjffJuknw+Lh27vTmK89AKo0KhFCBpvL31d7hhgDskNu/uKGJgNr3co08qeN96N9yqGn7CcOerUz2UxJ7tIS6Zmg1omHA31n7Sx/uFije6akq3Vr2WxC5QxWRFiUkP2PEYe8X4gtStRRHVoBDd40Gkg2JN6QW4M/E0dDNsLwEEzqjGiy4PuRDuciAUxWvEuvAVR/8QP/ncm8faIoOx+23zaGW7oY++ulFR7O6hbavGUw9msMsm5l0lIeUB89YbEQ2XbmlwqWISoBihGcv35W/thCcfCS8tvd2t0iQ5R4mduiX2Hap3grLaeulGx8PJXrJHPLPzrMbb8Mf7TkbPc0/CMeu4g6z5xR3nxcLr2Adto7hlko71V1zBpeMnLpNUm3azFVgdu2XQNo8XPGAxJ2n7QGPqcD5DM6tjt1UPvMTuo4oJQhBtrabx2FLF8BMHe63bEnt2Zymo5vdnkl6likgV8/X2DwwafFQx0fzY3dCo6vGK6dZMMbqqbcT3TsXYsWM1VGiugXP6TB3nT9Ps+fbCxFTUNBiSnUKph1dab652huFSAAAgAElEQVTeKpfY+bQAAjv/XmsEDWYtwX3aUidM1ilxLHEAaGLKb/7fs+ieBM78kqFbUXmKTRooo3oxnqumhNwdSTze8Es5cRKwVVFdL6c5zPvGDe+EYsWHARzGnqCOzrdih+njz7ddALO54n0dVz5fDaW5CVcv4DZmce9uL3d7PvHtePl7bNk+S3lJP9BNxj5WWWvHJbFWL7uvEfvK0XQaqUYuhIbkky0d+6gqinN++T9kduzwMLCtjY7YwQtLQcZDXfOxHRFHrWYZTz0SO3OdoW6vmKi2XtWc6KmmoKmam5AFmXmYv3DshLolREaQ4+0vaLj9hcLFm2fRuRi7ohgqWabKxn+i48dfur1x12wzmLYCSMz1wNUvOnpjXvI4agHFpLszKGt2XibM/yKI9iAQ6nRsP9gDqEUeK5w5YQ7V6Xr3e4DB2EWjQdfRp2U9jlYsLwtgJDHiYIc1nXroZX7f9+GinN43bmgglOKczzRUNhs03f2cMwAsKlWGsTsGTU465j8phyPpgjw0VJaj+unYub/2K0oCT/bojoMrmTguXKTLqkwSe40YZl9vmXAvVr4zAJkWZ+jqOkVCy2DcMve7FASEUlw0VUNJcxqty5Z7mNyz1ilR8NZdkCC/vYVxt/WZBWQSO6uKsfc3Ux2pRhVLXh2EQxeFb7sEM8FXfdzXXb7oBS7cgEcVI5iIzK8QE8DVawYqo04z/hvkv60kr+hUsWKIogIUQh07q++zBqQCr3aD6oKGnnav67LU5B/da52Ui0qKMdpnoAs3l1m6VT/+SZ0x4ZeMXaAuLSnG/ryXAZEwdgDXLfwpUAw8BeOcxiLzWMFclppOudGXzu4BTkGIjr1XUZzzOcXgbToePFN1GyotiR0Cxi5Qe7iqJYyazc7KnVcJWnHwEud93niquvaPUYaBiycbixWXwwgVcYtWBfQ2Nq0tWL3OSEM0V1/eqLkVeU1fGNv2tVYFiVKDgH9NX4VLF3+Ic03GvrpPX+AHBmOvqEqgp6nBUrt3E0yqPv2OeZCq8h6Kcc+8a4DuDvdSSsRx5i0du5/xFAAWbazHqpXV+MFWQ+Iet5ziS/8wRjZUv1OihBK7cW9HcxofLtriYeyE+s5VAngZO7tgc8XV0XU7hlWh0PkkdhAoVPfMnC7GbvkfA57WoczysaGqFKve7wu6anpg0Q/17oH7EvKT0nWBrtm2gwVJ7IGlA2kmn/1XUTvfNIANCRVfZeqwucFrCWSLptTq0KY+FxR39+6F/YYPDUGBmF4ScXemUS6gpQgWvzIIW5YmAeg43NQplwsMEiJVTJDETikMD4kcJPZStODGN8S7fylxS5w0RChCa3AnhN76VhoNZYytj/D5mv3sf5UVuIoxlA6Gc/BGyzaDMRZtTWHg+5VOfpS64p0P2kbx1lNTjB3D8PZD9nrjjTd6iWVIK+4zDRW7PCR6BIUCq+pW+apiCChOefgzbHhtKpq2GCqwxjJvkTIkfIQukWHUYuyNrRlc8fwcz+pVicDYR2ymqH3nQ+gacON/NQzYTg3Gzkjsrvxz2EEdFp1KYreOWyPQMXAzcOQ8drnuNN4YZS2AnYxZl++t5kDfuX6TfdAyFTlPg2OKBFjjI536SeyBHUTyvEcTxQ1v6XjgTAWiuI0EwH29e+HlHt2AutkY+P4sPMQn8lERKAD+3UO8KSk0BIw9SD9KALTWGR4htXNT6HNUA45eYE42gndHGB6qUEVn2VKvpAUAdavLsGl2L1QcsM6fGB/CPVIcmxTERatOdcc4CqAiSdHd9Ja00rHPZSAk45rcMmk3TSlTMHmqZ3dsKGdUharX80Np4YQanaK4u6OCPGyR8bzIakJ+DnGtUPwbtbj3l5577Ji4duq16OOjirEY35EL5qEOhjdOFMau+k6WAqZvu386xtMPy8swxMpPtLKXYMKzGjbhEdSU98fBzRTFaR3aAW6Z2SOxh8w7W+RFYieEPEMIqSaEfJeP/KTlmIw9QXVc+rKKIxY5lZVmJDOr2gioJ6SAJVn938d/t++11Ip9zFnoxL+yRCGXLYk9SOVhPd+acBvFTp6jY8+1FMd9Q+EdtsbAm1FeKnjCgGNWiUwzSsywBNk2PqGAqlEc+43u2g0a+n2OSRTpztclfAxyCqOQkqpizMt0s1GXPb4QR/QUg+srqntzl5vRuVUxySXL0LDBkDRpkmLCs5o7MUNzQ8KHCRHNlS/fd9Ztb/LQIoUnKDpF/+Ll9mVJmp/I5CAJ7xjxY04sU7e+QaaKeapHd6SKa8GjuSQ8+/Pb2CTyinEmKodX/IZZASm6uI79NihlmhNmGiNEQiWzDaKCPUAmk53nTxTkSxXzHICT8pSXHGbcddGhGVsY7wyLyRLA495d+97nSC5wzz+b53iDczk5mHkqxHcw+RpPw+3j8JWJNGH+7msffmHmT/HTxdehzHTAVMMwBwlOmUNx1Xs6TlgqkIjD5Mu4jLiYgE9dKYxU1q3RjLfNq2LMv0XlRtrEDjdz9sPWpDuud7pUHkCOws10q84fj6rPjDAT2ntAf8YOLjOeCkHcIRd4xm6HSw7IZh+y3LtyojpOVZxDzks5acHPHVHbvh27VYknURls1ilh7Nb1Q717Ys3OUzzva5Zru38xAICkIu/8arG3HVnG/qOV03HSCvfh7wrN3gZVkqGgrcC1k53OvPsOZ5yEPYshF+SFsVNKpwOSo0jyCdWU2AXLLnfQf+seQDjuVfPs61gjC9/Lg2vY4nQDlpRcLE4qGmkhJPawujwZY7de3W+FcbyZlzAn82/X12JQ40KnfrIJhgGgQVVQaR7QXNkafLgHAOiMuov9FH0rsP9Gx+iW8Onzlipml00UVz5VhNrX/gOZxG6p4NQWlnv5f++UVe7YMX46YcAtsbvAVYmt9w/B2QnRXGR6GTv/Q4wT1Vkeif0Pr88HqwQoldBpXzO/U6tX484sXfVs4zFHj8srRrA7NGx0xOv798UIIt9pVrbTfz33+mxrRb9aikS3Bbhmwds4/zv36VSKLig45AJij3XA6LfXODe4hqedSGJvExBT/C4SLbuYXmn1FwUAycH1g39TpUApETMykSpml4XWsXzyMlRmySdLRiAOjqVQYF2RsUTef2Xwd767wIj7bfWzXCR2Jx67SH/pvkxuL8bS/wy0r5uI4tqI9IuZjt5XyizhrNQGbzMKaJo9yxP7x8OcGMZ+U+JlLq1Y2rfL857v5v88ALwEy2KvEcPwTkU5FKK5+gs/0VESTmLfiu4exr5kU73rG3jGXpShOGq+bhtsRXRWJJ2bYVewto1BMlH230Hxs6kZ70rcfB5UzdMqyoWhKPzovPXh9Xj0cQ1KQrwPQxVI7BkQ3527MlBw6sfOIrGHASHkSkLIHELInJqagLMUZVCNxiuiXubKVhwrlfASey4Iq1Pk4ateCGmkEX3F3qJNUZ4XvWms+hHpHsPCevMAZann2eM93Nv8KbfceK5nd1zPbX23oPoIhRa91iRKU0ngf+4NVi7XYQBKi9NXLi9yn/vJw8/Pms3byj+szGCrYgLSP92zu9AY7cpLTYbKq8f6Bu+Ks8ds/K+ywr7mv++86Tqunaxj3HIKQimKBILlsw96I2xe8ImGl+/J4PbnxZKoKDom4NTfb97UcPpXOkbUbRI+D2VO8BmA2ch2onH5XkCIBT+4NApt4BXTZoydUvoEpXQcpXRcv37iQR0EYgZNKhbJr2bvaSEESWYrcxbHddpg+4NCKSTRWIy0fozdTxUjMdLwdMjOw+1mbuiRZmEyw4nduyHRbT4e79ndYXr+xYaEl7CnBCdFhUUYid06T5NmvCblu55z9436HU7wswyATISP5tvNz3jKlsGDUKBvHUXxV27GcMUUDXdMzGBIjZHxsTMI/jlpChdygcusyLuJbRTxxvvfqXq7R9Qt7jnHJfTwfXZXk6+2FANXv6vjoSfCMaAzZ1KoFBjNuLqzZMt07NbEYt3nfdGt+g9zFnSLX2gLv/ElEW5EKtI6VclKYgc4ib0rMfa8wOTS2ytEGyF0NBGCw3Yegl+Z0mBeXYqod+nuKj1LiZ1VxfRtEPgtw/gOmYPU0w9peOBfwTq7+/v0QtmQf+OxXj2x3oxhY+XYrzZ7yV30admuQIAAxg63xN708efY8o17EhnMWXrKGea/nSjI+M3OfHkS3/QJ7y0xJHYBrbf27e25Ryjw6zc0KKanjlU/x39LMWoj8I+njIF+7JcE3VtSboYi6XNsmg9Kfud5XtOtyttfOWYlE0Y0Bfjh/DCrQZ9nBPaHSnXsHONWORWF9V4Y58Bf95cLi36CVZGEx4oELkOl4iC5vQi3vBKCSVNutRdl01yWyJe748sAvgQwmhBSRQi5LB/5emDqZecP8HpVzixP4JDhQ5FmZu5dqyhqV1R40oYG07Bj11Ec9bGcK1AC7LNS3GC+Onau0fswe6DY1/y6As/MgrDVrMdm8yzXRx/P4jgyIqcr1KFVkrEaSmJn3t2+tFJSgPGnPOOoYt6dv5MvTUE7I63nj09bAUrEtB79b6/7KYGcgYQBy6Apxyzt+9w7uqJ7hATe02PXjcGThi9d4ZI5jF0isVvtWcm6BCKaKsZvjPnR+cN5EoldtJImbsl7zQf9sO/qYOrSm4vdtqiAIwfzgXx5xZxPKR1IKS2ilA6hlD6dj3w9sN0dvY++KvP62Z79Sf6KPucLij2+U6VRRXUF+OMkCWP3YVY6gXtHI/PM5T2C8AMuCFa+6xMJ29c2KnyFtRzo9GfspsQeRZ3C6PeP+s5NWGXGL+4m7E1TFmwGRahUxy6cZGk0Qyvrhjhig4aX7vXGzVEocOIcHa0rVqCRiKPiE0GZbNuUtYrLj8qwZeBVfrKJ02rPv810s40BOyjKWr1nL0SlhX+2mfFuvvwDuTAmat91PSJseHMo6JwSe1vB2qAkakSRO2AhDgenEp2LXx/3kyaq+nKNIKE5SM/IeziERc8QBwn5gQoqORfG7mtopjqOXKDjhK8DxFUAjZp4dRVFsuvTIH6uKoaeIYpk6yqXe49v2z9zy3uXZ4yZVtGByz7UseKsH+NQUUgIIvD6odTtuy7pU/kQIELp2AN06Md/S3HH8xo2JYI3yPvuFeG7Swi+IOsnCwYsET8IQilzvGRnkdjbDKYKQdTx0pzx5MgFOgZl6XxjQdS2sg1u/sZTn5FCIZXY3aoY/95YkgVjV6gRtiAqfjjPcRkQDcqcgov51qOO697Rsd8q/wL2WaWjYa7YgOvLtALoVqjhQ69YXjkhBQfCSez8aymOb5VLJGmWRMunXEnJmYSXsTv6fDYvHmWibc6i/AEMrRHnUpIBejU55QLefnHudB2gFJoir8ihW4GzhgyUPrdpkXzMqCqKgdvFKy8/KHqO/ZgD7efEo2qLDUqdKlYM8VHF8OFernunMJWni5YGyN54qnA69qIMUNlM0cjEATlvuo5PMv72+Kg+1YDRwYuzEB6ueVfHpCMUAFRo2/NTp4Sh6YmHxUT97FtJxAqu7vdcK6+pXKTRM7/Usf9Kij8cswbUX13vwsjNOgbtcK4V3W2YjdJ2MvLF9zmGxj2tkEwgN/03HEG9Gyj+8rI4LTs5GYIN8YzbfdZQdEtGU63JIGPCdwg2VYWZj1WRjh2QGrMjIfaK4WCqYkQDIVMQPu7tArosYFgId8eRIYxV9zyn4ZmHvA1/wDeKb4f0Y6ayrkgkesQwONc8MYoK3Mx++pl/YxSlqZTe8tYs1EMSI6cIvs8CirGMjX1a6/mFli+uftedctwKilcmOG2cq2TYt86bgYi+wxbnUQQFcN3/Qg46iSrGQpCa8ebXtMAT86LUYSiJnQZ7xUTBuOWMATxm7BxMP3ZRw5wzPb+dVgZ+s40Fv845egMw6e4M9hd4zRgdyKFdJkUFwU/qk9XMtZN1DKvOrjwLvWu8H378N/5t8dL9Gm78r7hzZ+M9wgdmiqJvjQKLtszAl/B5UPC1CPALo+CBoJ899pjmifsCwNPwx32b3zHSO2QYHlkQMAtBjH3cCorWOrlyQdUojvwufCWGVcUIdfNZVuGJjF1o3prCR1/pVIyd+OjY9wyzCzMi0oIOp0t2uITRtx6wXEAjDS8F+H2hH3Pwe+/86bktdYavVjB8c/S675Wj0daFCBK7bwTDgGKsIGsZFbilX9+CGOeDIPu0Ui5SoyGxt42wEwSZjt0CDcOFfOr6lDnUxThzyMrGXc9rOHipd2zko8krg4PJ5oxOxdgtd0eRB0hbjbFsVDEWREYxBdn7DVczO/ejSOz5cpu00KehnRmIxNsiKoJWGpbELnG4yQlHzw83wUr9/0Xx3zocYxfTE2Znqd/G0vEfRxNOwvb/oxZ4E+Zj7AzuXhKcKEd0LsZuSuz3PdM2B8IKvW+axKM6DGOvELlNC3R5YVHdwyk04XOCT8cY3oUDzy/yPXHxyKj5FyN+MdmfOYl2JLPw2CzaYTUhg58qhiKc8TSfTRq2f+TTK4ZFcaE7KDoZY7e8YoTPClBXojxlsdvDlC9yI8ul87ADIhuvmK6KQg1IC+1R1dZqIeyOXQoAIY7rawvI/NgBM1xGmEkoiwF+zLfRWmrS3cEuYnnx8Y83KHFQC7AG9kEUZhkmrUgPnotnisa0np9XzC39+riu20M3XFBwH1RogciOINmG9WhFWpR9mqhvDSCFN9KFgVVNsn4ehrFnU9cXSVQ0WR+gkQYq/TcrhwIpLrySvVP5saOtJfYIabPtLAQIv87k0oVl7O9VuuPl5Luu9ltJ8bv/FH43nQy8KqbQEntQ/PxCwGbckk7JCxaUyHdJtzVkQcCsZ6H82LP4FOnnh7VpcelO+IbihG9yVwNvGdUXu+Sciz86lcRuhe0VPitEeXn2jZW9ly3trBEvaFPQIYv1nKI4+uGEAKNjwdHGOvZCTxwiJDKGnl22MhS1fwfRxPirYmg4iX3NOwMilyvLN3QsnMglhsOmJlF02vyiUzF2X1UM02my2SYvwpBtwWksHLkwuzJJBOMpz1DCSuwA8Js3ddzzbNsYndsaM0rdPuWFl9gtTlXYclgoFPjLyxpGSU6AEzP2jiGxKz7VRZCfnaciyD4/tBdagfoR8XPxyRM6FWMnilxir2wxdjQO2EHx5MOdh4HJGPtuG7w3+cOqtYjG02550A92RCwrKnZdF1zH3g6qGFU3ztKUQXSQeT52v+cDfn7sYSX2QtATmK5A5Su5nP4TtoyCl5BP+EjsvRuNHY1j1neQ3hwSzHkELtz5vHek8gaysBK73wEhXQH8txdaYrfjhLchQwpakYmeiyJvtgfKW434RzIdu9bGXCjsTt9CCQhKG7DdTsXY1W7dAtME+QOz6AgeglE6j5/E7hvHvCN8aKFAqGdzTltI7ENqaOgt9flA0GTF9w1KgA0+Nqm2xNVTdDzzkJabu2MeETZ6Zdh0URGrYjgkBMeOdXZEcXdMcI4nmbCMvYsK7GTnFoAS8OeVtwVjZ8PftgWCJmdR+2/qIIzdgtR42qm4UO5QSeHdtjtVlaq9xZuDOjP83B3PnuF+wO8u1b/vErsp+PDSalupYtoSQW3okdhDvNPWaGsdexts8MwKnUbHTgg5iRCylBCyghDy+3zkKYJSWh6cqJMhrLsjoc4mFQthjacdbYDnC1bwKL5ehlUXdkRnc6hJrlB18SlhFni98alzaLvQ6YeOymjbGp1CFUMIUQE8CuBkAGMBnE8IGZtrvkL4bFDqrAjr7ljR4t31xjJ2P4MQKykN2N6FRpdZcfy396srbLFHftf2dahSIB1Rs7KXz4Ej7QGrH/7+Emcc//41Db3a0FbREdBZjKcHAVhBKV1FKU0BeAXAGXnI14s866Y6gh4qLGNXAAzidoizG5SCTmmy8Mi/xEasKFg2KLf384XNRQanE7n6FRJtXR5gtG+mk8s1Vr9jBZKhW4HD83wASEdHZ1HFDAawnrmuMu/lH11RYkf2/rJpJsqgr8SeZ1VMRzF2zS8z/Nc9XjEFLnff1W3PiBSdQnIUQKeBImDshUR7qn7SPqxKWTez4OXno4pF48hTpYSQKwkhcwghc2pqsjxlmihIdTHeHmXnKYtLfq2GluDybezrICFIbAYxjDtQuSvqclUdyHQsJ5fIEEnsXRWyLnjf2QqUgfsUvPx8VHEVgKHM9RAAno3PlNInKKXjKKXj+vXrl11JiorWNjh9pK2gk+wZe3MpCS058xJ7rnxZ9zlVvi3RLWn8bUt/8vaCQtHpJfZzzbNw20qltHJg+/VT2d6wb3YhIKXdC15+PrrKVwB2I4SMIIQUAzgPwNt5yNcLokY2IHVkWIw9l/fDgJfYc5VoO4rELhs8kc4Q7SRQu4CO3ZqA2+o7agrsHZ3NOKCkkxhPKaUZANcBeB/AYgCTKKULc81XCEXtMPrdfEBXDOk5Wx14WP587CK3Eppl7BN+orj0ga0hJs6Owtg7oxtnXZYeu4oOpLrIarUtVDFj1lF0587Vfe5YBZ/snb/O67eCkgkdutJ5jKeglL5LKR1FKR1JKb0zH3mK8PDi5zsMU8kHLImd3zkZ+v2QrXfWp+5rVoKv6UGwcJhTqQ0hGE9HaYPOtqN2Q2/gu52zqzylHYJlLSmMC0RevsPPpx8AbntJw8HL3B1kyjiCbcFRScLTkMXKgxLSeRh7W6Eh3dRhmIoIkw+MRpyumIw9S/e5bGM8sRI7Je586stClNtBek0Uif3JE9uf6Fy6rqq3vVG4rcPpsrBWkVWDxY0cVZ0zazQBVUheI3Jmy4tixs5BIbmpYs79QwKf7knw6Z5Gi2yvBD7a17911JLwXDdqp9GJMdiDIvflqzzRizpxd9CtPYJ7a0eZXKNI7KkOYJvJhTGPrqIYuTl/tFT1CU6jF2iHZJgxbNnSmiQrSJ6x/3G8ircOkdNr9VlqftPckbl/W9aCVWfYedqWUIiSs37u0dNVvHqkkUlC8/c3BRBJzIra0DoxmFO2jD1bKBxjt+ieOxpoKgl+v6PYOaLUW0fQT+fC2E+ea7z8zS75YQqf7xHciIVq5zCCgTUuZTTwfGDNAGD+cHnGlLj/tidiiZ0DUdS8SItWpwnDGAo5ueqKEas625ge2XZSdoMNy9gbSyUvcOgwEjvTfht7+acNYxRm0VgaTi0VFVbVhZlARciXR0mYNixUO4fpt9Z3ytLy9RBUL96NNcE0FAqdwiumLUGh5GXGzTCMPSg/EkHMikpbT9Nqf8Gn2Yns+dC56oojFYXNrlADviWiVG1NzI+fouC54/27clSJfUclUF/AmHN9964PTDP36CGee8WZ/GiJg1a+Opx2znd7hxknNKBslpGv6Q9QhWBdv2BVjK2SCUFnoRBL7By+29CYF1cpS3+X0EI0cITy8tVZ5vksKVkU5SFmCSWs/jGcINMRlrMAoJgnQ9WXAy3F/kSlEs7zMBt9CmGoZD1beoQ45iVT7BVDi/MUsTFIzaIrjpG8pdg/beSyI/SfsKoYAKirDFbFgHDXHBYNFd8X5un3zOcbY8bOoSWTH+nB1t+FyMtSxZAwlro8Mby9ejWESlfekjv30Ymjcghbt4WSdqK6L34z0ui+G3uTwMmGNZ5a31kTsAGwEBOYlWeYlaBIDVic8d5jcfkvw+lqgtqanfCT7cDYrdoJq4oJzC+kpL6pd/hG95sct/hsjoqNpxwUouTFoEMVgqZ9i/DHi9VgZmwOwPL+rdIkH+xHcMOVat4YXhMN52xbIScpNCgBtnU3KiGsNFgoid2P11X3AF4+SsE6JhrF+/sT/PwGFZv6BLuxsaoYqw8FqVry/Z2RD5UQ9PWSAMZeXxGugCA6dOLUU1QVWRCi1KssrWzl/vgp4gfsqtQv34/2Dc9g/HbBP3aqfOaJJXYOhChZS+zXX+2u6OQ+xVg7IJghKAmK4SfUYMjhO6RpVu9EDOYSkrb1ff2fZ0KGJ65oCU4TBF0x9MkA0L05nAoiXwwvowAPnOF0QT+Dok6ANw5z75LVCdBYbhCzT4O/5Zc1nlpMwe87CEXeA84RMFJeiEqkAskuaPLdNRXuoM4gAYmV2PMexiOCxCqjUyaxfzFWnDfP0EXdfNFQYOWg8LT5edQ1lconz9h4ykEhBFqWAai29HK/FzoXApT1TkMpknO8qJJ6bZBUFbLjNww1xLeJx2bfjDpxBklYvXI+JVl2996aAfKMRQOZpWNYi7+bSVrA2P2EBIL8R1NkJfZQVZ2FKuaq2mCjLMDqnMWU6IpDaz7tDWFj+VvkydpIJrHLGL6HoQvyjdqv/dRBfhOnosSM3QUCBXUVbV0moAW0eJAFX5Y+2+cWtu2awQW/VTFvRPaclnV3pHng2EFbvT3pzR6Y6u/PsSacY4wiNnuW3CC9JStdTTU3pa3ayecd6ja45gMuVUwYk42IsQdI7CPS4fRpNtO2+q7geSG8n9b7eK5YePJExW7nKKqYXVvTUpp5VYwIe6wLJM0FfiXDrvA0Rd7EscTOQSEKnjhJwTPHK5g8LrdeF15ip2iG/zLf6jSHJ8PpRoI9cYwMvx1BsGKgPJlKKTIJkpNxi2XsYevET4KLqj+1jZoBHj72iosLh2D/DujKrPQ9a7SCc/+QQHVPObEEhYlCaDOYMFKwSBUTILGPToVj7DZjtBqTAI+equDesxWbTkvqzCd/D9M/Pt6HwFKSyiTftf29GR2abJWudnlVTD4mLb5/bGH2UvjlH+vYORCiIFlK8N44BROPV9FclP1amZjdNdiPHdACqsnKo78Wzv/wwBZ/Pag15gn1nwQs0nNxR2N1qYQCbx0S3CX8GHvUAdNUarygpEmkJX9rd81VFqH+XDjDuNzIdOzp3g7XJFmcMRoEQqPp2EUcNV8hiXmJHQA+3VvB8sHOuKg1V8f5NJ6G+WxNJY4qRtAdi7un8eIxCqbu485M8ck8rFdMFLQUycvzc8uOvWI4KCEqZHtluLxkTGQTvz7mMSEAACAASURBVIMxDGN3koZEOB07gf9AsFgZy9gDQyRwYAcOAVDVj7g8T4TkhXhYVx6OFstgStLhas9Kte7YpIsr0YA6VZm01jef2eg+oaNljHvFFbUug0Ao055hOEwBw1fa7c4xPEudsHBngklHKnjyRAWzR2fPiNaNcAs7Yb/IIk8oKFAgnSAeDxY/KsOoYqKCl9jZb2PpvuUid8JYYucQRjc18TglkDEBwOqikcL7oplWg/8IdzpLuG4bmCpk57OPGlNZBhcNrMRuvRyUh68qxvx73TWqNEQqa0BsNrVcYRn7fw8zGijdnV8d+b+foF6Jnd+b4JHgBRL7i6dHE5n1Yic9QVRVTOGGpyOxG4RY354sJfjN5SoePU1BOkHw4f7Ze6IBwOL93bqjsIy1WDfo0oQxrcWrbb/w13zafDB4v4mfFZh4nhIzdg68ca++1OsJkVGAuvLgVptUfoGRJ5eUX/oRAmS4amo61B3B39l0Elismd5I+NbBMn2gKbEHDH6h53zEDuvWsbsHuQy56thZRtFsSewBumMLs3ZXMOa8jSAe9UCAxM78tgy8rbu1oteoRiwZYbQv234E4tg5jSGN9wt2JmhNAOmd3Ood2wsoFGN3X751CEHfRycAyF09YvdzBZi3ZxnuOM/p41X9CNKM4TgXJsgzmLCChxXKWuSZRM25kqfLz77A69bzsRbSFeDK65meRdzPZD7zsfGUg861xmv77eVJw8cXl0HzcgbjPl8jhOKa1K/wunaEfat6rLsDrRMYcvxgqQ2kIXJDqmLYR3edq+BXWWySYjugxbADGbvPs9cPNyowrCuYphKU7dGIbac1RJqT+LR6gBTESuxW+aoK7LR/PVpNVRY/MU/6gTfPsIcr3H6BivG/TYBk3Jm+caiCJWM19Nq1OTAP/htf+qGKioMOws9vUHHV9dH1RGwoBVtiB/Dv83fDop3l9RdFYue9ojyMPWReVoC3tI9nEkvXEc1JHNUsd17wc3O08MqR0dghJYa/ehBtvLAYS+wcdK6HzRk6DKW93YbIsB2HSFrY465HgEV0OG5M/8K+1U3X8dkeRsKLf6PaLlz5Ut+F1cOyS89vRyrYGGGTlF0WvAM3cNOWjzbirUMNjxNWPcTDLs/8232fRqT7Rwt842EYAad/JJiPsiZvK9aMrZFxGWOB1mICZSd3/4p6oDRhPkuhxiHknx2nufZFaJKlnui2ohahsZwgWRKtob8YQ3Df+V47AwhC7L4OX86tF3L6ZK43hZ0kiJlQpA4TqbGGp9PiFaz1Diepi8ZJ0MZBT55wf49Lx870E76sDm88JYScQwhZSAjRCSHj8kWUDDrXoiIXN52EW2aVFqlmHtz7AlUMbzw9ItmCf56u4PybVeEAmzXWv+wgQ581kgioh76Jxyq4/QKDHn7QZAVCPBL7o6f5S4NBKqJumsH5Za5q/OAOkj3nH+4N6sJ/uxawW5cd9DZjN69F3+N4ATKSvkojH4dGWoKHmM71L3veFLyqqtm5QD1+qoLlQxjGbk+uFEF7/qJI7LWVQG13p8481RWasRt/WVWMHS6AEpzR4DZ8ayBQQgRWE3nHLB7h71rpB1ndsLuG2yPMda4S+3cAzgIwPQ+0BKK0yKMn8aQJq4q540yvGgcQq2J0s5yXRh+P0rFjTRUJ8UilUXXsMugKo2Pnki4bTLDEPKM0X8st3o99fX+CWp84KmGdNSb8xD2srVN7PDpHSnFosgUlmphp1Qx121JezBwLjasYlfr7JrISu84xdmuUCwNzmcQ+foqCNec1RGbsStKhUzYhatxORNt/XNBPVCU75bqfLSmfAuRBrUn01BwGy/dRGZN77FTOw8VWxTiVtsLc7t9jeDP41tYJIjF2EMeGUmoKjJHVmCF5TXsgJ95AKV1MKV2aL2KCcOQot7uLaPnNV/SdP1Xw+0u8o3FAdzOkIZdeHLLAuPfimBMx4r+vA1dOc54wq4iwxkfK/ZUUJ0zDRikUMVi+7J0OqPUnBpLdkH66/ZAjYFMfgn+e5rTROwc5m1/Y4lQAZZSiZ0YWEs89YCdkzsemgUfZ13fVbEVRgB97QiCxs/sFjB9Oev7zq3sAeqkeKmw0+811xzegYpdmYZ4WWPvAdzsTj6qKBVGyc673rEyZyTyfEvvvapMue4ZsVfm/g9yZ8oZqQr2qmGQxMP5GFf32bvB+D4BNkJ/3RwmwdzLtGns3Xq7i1gsUu/2jSuwHtLZgXIs8Et/M3Y1vYOtvTO8x0QrJEp1Lx07dA1yk0uBn0YXDCFYN9KaT6bmsxl08xPDY6Du20Zto0H72T9EwC+Z7QdZJRmLnwDJ2NhdVIHWQhB5q6ctK7JfW1uOumq2hNkbJnztvT9/L6WJyL4FACl1XOgh6VTiSax9Nt9VyRKW4+NdeJi/SsVu9SaR28VQAMb47zIEdG5nQr5n+Gnrs1SDO06LHZOy/u1TF7ecrHh9zFxlKds71lFNRsmUESexRpNIKJem65icNi8nNGONudWnsF6a/Uxh2j79nzvGk0wnBan0nKV0UwAW1La4+uKMbMYzGIZ0GeAzQNJzS5HjI8e+vOmAIrrxedTkS/HT0T6MVkiUCxxQh5CNCyHeCf2dEKYgQciUhZA4hZE5NTU1WxPKMHRKJne3AIzJiFyh75yl33+pg9RUEl/wmgbI+/lu0WenEHiA5SkDUxysmVSRmRIT7cd9ZCkacXO1fkF2e+SoFBmgZjGr1/+Zsg0LZLme8lwAViMxseQLGrjFSvGHEMiU8kkCyVKDCALVdK+3TdMzy7JWPYDSU7tmEjAKs6U+gAEhloeK2mFuQxJ5Rjba3VUXCxWN2a3+PKoY4RAVt/IvC8O4tusx1zfuWRw3Dy0rs1rtz6Sjv+/DaKnjI1LS2N5jgnfvPUvDI6eJ8g6olo6qorYzu0JAPBDJ2SulxlNI9Bf/eilIQpfQJSuk4Sum4fv1C7CAS5cFXvaBDUgJ3jUu+UOYVYw2qsMtPVhIM235hjaegANXcym6ZxK5wnXPRMILiinCbadjT6BUa7GYZtCTh/Ymre7hf43cB2rvsJfkthftYGx0KMh5Duj8SFPjDxSpeOlpBusi9RLbUabwfOwAkBqRxwe8SaCozekwYHbun7szGsSdkjnZLYufrp1ENF5c/DGQbdAjJnzcXAPw3caKrMIWTAmSxWnj6kr01Tzqnv3j7tQ4gJVg/Tz7QmcDYInRBW4v6/OzRCj7bU8LYAypOEwiPXneIwqBTqWIoNyBG9vV6S6haOAlD5kvKh3RdXrG/bz5FgobyK3/okdsCe4QlsSsUoNzAkKpiBPr90BMNI7Hr5gDwk8r9jKfd152F27Zuc9377c9V/OIXqnRQW7xSU8VcM80NWAqCNDe4gwZZCaXY1IfgrUOddtcBvKMd7PrWYadtMfITfKMSaruoF4SpXxGsiZWvn8/Kjs2qPBH4oinzK8oioNduTb7P+b0mUoldoqKxsOa0Row4qdptbzJ/qyLGToinnwDOZkVq/rP6rst4nKUqJgi27YTJ16N1KBBydXf8MSGkCsChACYTQt7PD1li8LMdETDnHk3RjD18Y9qM3fz73NC7fN9XXcZTi04fkGDp0m+ksTpev4VJFHUJq2NPEiXQtdkv7w1NB+Co5KOue8lSgq09HIWKx6/X/KslxIZBvt11EGjUrYoJwr3VWzG+x56ue5emf4vr0jeglRr6FUIAPxW6aNr5dgTxnFHLT65BqhhbYrdWMoq1okhgzJLFPhRFAN+nGAYbTYr0T8sLX7zx1Lo6oMW9mcizoigGSntmOGnXgNVeLI5uahYydh7WHgyRoTQ6Y6dooo7V16PugntlCABFWXo1RUWuXjFvUEqHUEpLKKUDKKUn5oswETyznYCx11W49XWybig1npq3wx6azXYl4ii/XRj1k00o6eGoJwJVMRLavtydSF0lLUnk8VMUbOztxGAp6xt8og5rRGxWnJCpPG64UsUnexHMkJxSY+YiDaEr0rHv0XM3+7dMYueb2VDFRJN8Bmoabu5/GE+RUW6qt5km46l6laFJAVAHr3rknnP9OwvxU+IC0DkffFvHnuUKIQyi1N7OKWaXVUDX1S3R2AS/T83qAz9sdhtZdc6gIFSPmL9n0d1dVTk4ncGJzclAxr5IH+YwdnbytaT4iPYLQsSrBwu6wAbYs8TnMNQ8onOpYriRoXLkT9uLYP4uipux9xwuzEuuY+f0rwESSpFg8PESrZqgSJQ6g0MPGB2saoSdBB74scEALLUL26UsOr8areBXVyXs7yjtmcGlN/Wzo1a++QOvtOOW2M2aEXz2pj4Ej5+m2uqgpb1kx+GIvy8odGpGKrF7rzP8gLI5QZSlinl4R8awY3Sjul2aNVGyq0KVUmhQ8PcfK/jIPKxDT/X37GfwOtRQF4l87Vg7Tx0GA5MG4xuLR4wIffJQaDA69h7FPaTJ3qraiDPrwx+uS6l7lFbonCebpBJkqziXJw/hn7qvUgKXV3aCeEY72VHFCBh7NmBXJB5HDLhXYgDQszRm7B7wyzzCSTpVfY0aZN2LZLp0hXgrHQC6lRmd3DlkwF+2YXWIfuy6coix9CyuzNhSd9DSr5cG6GnvPudisx7SjITha9NTnTpoEeyUZUMYJM16CSO7bKrsJTyNXTROytLFQomdZZwyxt495Y68RUEwLFHJ3YuGmw+8GVqT4V1hS8YCHRRhhoj1aNbuinNqVQjnZ78drgBAzQ1Kjv7XtLGY3GfklHdxx89DxKOOwKHYlPcceQ9at5xuXw/MOIHLdklnkGAqRSbUbukJ/OLsoz3z6oG8ysWeUXj1moTOCEJ0JkBiTyNh1zEr/FmkXFkbvOfDBeJdkbCwvpX9hh4l8kk0n+hcjJ3XsSuKq4daDcQy9oSEsYf1ikkpZb40/XnbdjZT9o8LvXZtxqgP/4Pibho2oJ+LXi9tBnbSACqQQkrM0ZPivFl40NGnAAB6V5Y6+skScRgGq9ykQgKNp15KuXuC0bj79hG4urbOVZ6R2rlIJ8T6x/IMv8ogOLNsmEsaJD51L8L4sePt1B8OM6JhFHfLeERFlpGF9iDndOxQDM+g/ztFPGn2qDD8MK06f/CnlXh/f4LaHs6s+eaZb+KxYx/zLXaXk8O7EbOSc+/S3tBqnSB376/fiOb1F2OXBkNFFezFZRyIvqFnpVFtTN/pxnsvSbKSS+zOA7bfrFGHe/IQqmJcgheFKtCxW9ke5rPZSIhECRI+A0XkFTOi+4hoZWSJTsXYeR27yHgKuAM1qbIYIpIOpivu3ZEa8ZcCDmQ6g73kFrQ1IYA6dA/U37wF62h/3zxt0iR9xooflWY+QrTDj/zkWeDyj5EoKrYz9ZPYCTVVMSEFvzAD3kKG6BhpnscpcjUDgOWjR6OsTwpqiTsgmKiVCSHYN+pAlND74c4HYcx5G1FU5ijJiOAdVufNxloJKlEhwHW/SLg2a7Ggph7fymrzgCI8faKKkf0d6W5w5WD8YMgPfMti1X3CcgLoZH9rjWNwzOZdzPckDebJm0Kn1M1gr3JHG5GeScrvbbDy5dJfPOo3AIA1iRHOO2ZxIsbO6+r9dOx8W/Y/PWAfyJ5nAZKdwCcOutj2q9+10bHLtEUAMKCTMXaPKoaToexllnn7uWMVKWMP1LFb286z8C7xg6ImhEs0FnsOdtw4RczTUcU494RZFZUCQw5w3RIZiCw6iinFVbX1wV72QW4/ghxSimbfdhvEnItkeTmGH78ViVKJ/lwCCsZAmSt4yZHVscPLKCyf9DcOdV7kKQmMcETcqpgik9Ffc/SuockWZyyH48duCiPCdy12zU5zFIrgfD5bzUYp6qlpszj+eKCYW/GK+oDgmgh2UlMCJBivkvV9gVd/oKDxh8bO3pRgTXUUOcTOR1EItNq9AYhVMXwVFFf6T5SkpALkiF8zN4CpP9Qw5LFHcf/xN9kSu1W3mTYI12uhczF2bsgM7eXWO9onCplfpepyVYxCDDUOm2N9GUBNpVm+IrL98ip3ZyMI1gcXm6oBhbh3raVrDSZdElXHzpZJCAbc8gdhmhGpDPZIpcKrYqShcr2Vl1YY47ETpI9LK6t0h5h7q7f6kpQvgcj+fmaVyH4tz4isODiiZ0EkyQ5WKUlECx8g+vaqncWbAfn4OMePHeBJowgYOwiw64+2eNIa30yhU+d7e196iYcoa1xVcqtvfrzxE6j1W2d3KROC149QQMvN8SAIBJdSHHfEP546BkcOHeMpTxS2WXApAAG6O1btYekMLhpYjW7HHAMA6NNs2Mf2rTMENS1m7GLwqphLDh/uuuZ17AkdUCWxNUxNMtYMMJrvvrMVXH6D6pHYZbhizHj7+K679rgSJ28cIewJm3u7b4Y5txVDDCmDEOCQXeTGU5mO/bXTX8OfDv6TfU1A3DrViy5y5ScbVMFQUJYR7Y705jCkbqgjrbkMkqyka/yuHOw2uLFqpkOS5jN+KWVmo/pRnwXXJ2nnQAyRHcPKUbRDkk8jQ/3AnQEYQa5c70Wm1yCQVWXNP2BX9DjfYcQ9RzUirXonkQd+uq8nN6lHmIAsCoKzDxjMSS1E+g17pbznKPxpvIrXLm51FXFOfQNThrNqd+8SNu69px/kS+yQnmXYf6jlHCFQtvm029I7b8fkQw91JzDVtneZ7q4Vuo7uzA6thFaOBavXYbC5+UTLMs5PNuhUjJ2X2Is5LwpLB2rp2BMaRUKmiiEEBASzdlfwy6tUfDVKAZg4HUES+y/3vgpz164HAJw+7npMqrvKydvnPUKA2TsZAdutSQUAGiscfapimdqpWL4XecWwzG/33rvjp7uLgw0JB5pVnJ2Fv/Z8qRnX+8NhByIt2tLDkZzacQjK05V2nhUYbD87f7cfe17vt1cDdjtzs339Kd3b/h1+jZBlKp/BzdZxD3MD5o4yw/DJMvN1/YB9eu8BqpVhz9ZgO8CCn1yJTXdfg019TMkd7r+hYSYfcYKzqqFEsfgPKIAB+9fjwpsTHoldtDqwvtclThHx/EgJ8IPhu5sStcl8FW9i2bjSFGDZEIKG7i6ycGjSqT9DYveqgQiAsS3PYDkdIs7cxJBuQwDBWQGyndQsqZVjjkB9OXcuovltyWLjL+VO6bHcHRNmDOJYYpfAq2PnFXXGn4zJGBNawDFUlrGKkaqp6RpoqwvkW5wC8xW+RYDpQ/bF+BtVrGFWv6/8jJGwAyS1QaY72rC0s+nJ7yBfVz2JdOzsxchjA9lJTU+Chilf4Jv+oyQ++e57hKSM3YImN+leboimZYkKnDrseIYORyfJ6tlXuAasQ+1VtXWo1HXs3ZqKpF/2h9sATlRn4mLruN4M4TNj+BAXVeliFSAE+w08EHcf8CaqMsPwaY8zhSX1GWNIo1pxCVr2cfTpVvtHZexWalYHTiW5EO6vCA5j58eQt7ON7TsWJ484GTqlzKThZexBQcAkWhH7XXvHsWDoX/tD7wH1Fs9o3XEYRvceDaoZY0dkPCU93BODa1JXvJsDiSn1W7vBeca+QB8BAJiRGWuWGTN2ITyMXfHqrwGg1axonUAqsbvfcOCR2KV8XcAgiSTXMx4DTrwbgKOKaS12L3QbSx1pwH5CgSLmxJyfHGAEwzqgpRXP7HQirqqt9/mS6HRbzwmCdexqlJ6jpNDKSPa9uxkGNYW46dFCWKod6Ypiv9YUvlxbhR6uTTC5GVF5hkcu+8gpGxQZ00tqzm4E11+lYtbORqhYYdRAApyauhuT+t8gLKv/Pg0Yc95G172Th5/sSOxRVTESbk38kvgWITCeEvE73Uu6gxCj59r914+xc3mEYuxgVDGeZwS/PXF3wVumNK2bM7FAYrf7epk79pRVRoIkQEAEjgeGqsk6WFznGPvaxHCMaXkGbxNjx/NHQw9AW6FTMXadD/zEkW810If7E7x1MMGbh8q9YgCgW7PXYGSXRQjOHXWuDzXermftQq3kdtth6EHAob/wvOUyjDLmz+KhA5Eo09D/iFLXwLAmBQrgwLIBrpDBYY+xDozaOOJIz5ftOvUjzHv8Gtc9VXFHJHSDl2zSaEGxhImI2A5PlkAfuuvxrjSF8opBr53tn8qPHkUjKqwCsaU3sQ3InkiVTNtEjegXWQXjvGhgpBM8zMVomSSEsilk2YnZrHi+MfsmBVRTqiaJhJexS8qy7GJ+p4u5VTHuPvHgefsJ3+ELpLphf2B5sGuFweAf6bMBmJuKiGDlYo4BmcS+8LaTcP7hY9CaKMFZp96Bp/c8Tfpt+UanYuxHDznadc1LNJY0l04QvHSMitZiggQn1e/N+D6P3HgY3qxyS0x2+FsC/PnQP8uJEXTASnMwj0typ6WzJ8pIOm6aOR5NLSnBbmdsQeXORa5y+O8NZonOe46kZPzYzjgU2c96jQAO+yUIdedXNHgwUv3dW0xVjpZXf6Dgtz+36prTNbYMQiuKvDRyEp001ILLlmBil6OAv+xwvsH668dDCcHLp76M3x/0e59EZlJBPsqgfT0Vna6VH/VLGGbnB/Y5BfVvzDBgiP+ajvI/05UpS2se5krjqGJEXJDPkGkji/kmEuA/hg0XzIKX2EVxcjxeMcyvk/YYKKbLetf6kTHDAQs2KOGgK1zvPJE5CzcfeDMmnjwRRYriVaWYHyGT2FWFIGGqhZNFpaCxKkaMgwYehAUXL8BOFcbyVyFuOZXvc9+uXmd7xaiZQXhlwyb8a3M1dkvdZrxPVYxMZ1zv8PE65JAnKALQZ2wDbj/P6q3eHZKAW3rOMBJ7UHwaVPT3uGr66diLlCKPzDbp7mNw1wTDE8JxhVQdAgNI4I7pxOd7EKwd4H3312P+hVTNcWiljipGKS8DCEH/m24CG+Hr8F374X0twpnoimh0+mPPvnviwjEXBqZz5kEnY3b1d9rO56J5zdXwnKFla9GccLiBjJ3fUW1PCBElfVt96Lw3Ux8Lcv3XnrQixtm87gp8uraKocNSxfAFCQpn2iJhSsWkqMjWQ1tw+rw71zCqGOO5NSN5VyHC9NwMUjzS2HS1uZdzz57khh3s2eI0fux47Nx9Z5QVK17vMcVwwLAjrgqYxv7D2iY2DI9OxdgtWMsxjwTL9UAVQCJh6HMrWo7BHqk0KilFKQzfU1GHEJ1/KYSPdwkA9N+7AQtG2Atz5jUnEcvY2a0QpNdw48dRNwvpoMf+yXPPj9wixgBolf/Q8Y/ihTNedudr0pkJodtNKO6RyLMmCzuVjQCgunTsUBMYs3gRep33U1faM/cbjKvSv/EtNzevmGAQc8m22PT8YdUiiqLYV8cPPQNacrj9zLGvWMyQ2uF6vYzbi1G9jLg1Rw450m6jbA9l8EToLfPGJxH2c1qE3myYBtEvApBrZwkKdX4mrPFZVOQhRqZjt1Ux/GN2NUOcgzuKJZFAPeAmsF4XXIDEU3/HtyMZl1tGFVMu6WGlRez2NCc9AKR9SDlpz4GY8ftjwtGaR2R3Mm57Q6ITs1WM3fbGgRu+AAAUFZs6B+KWzHkMqhiEjU0b7UN0+QOXvYjASiSSF3tXZ08oKKkEbq0zi3FC3Lt1rxSVlOJYdQimalWoKhoBYANoxn3iEmDGgLa+R0A2byhOE+frtCKjo/P7AVROwpLB+vQWFIvT+qiahMklJYYLFuVOdPzYAfhwkXuzjZIARrz2IsbPvNh8Qyyx87AY09aDhgLY4CovjOC9a69dMeuCWSgvKscj3zxivJe1IVi8AnDdE2R94h4DgJXOtXVSkU44a1Z/gZHSbLuSBMMwBUHdnNWh+34YiV1XCIb2LsOfTh2D5Znp2LTOW763QHOiJQTpdBpVVVVo6TUUD4590E6iPFIMrVXHqlQKd459AOlHjXeeLOuFxYuNePiapuPH556F9I9Ott+r6dsXw5IZPLjHQ2h6tgjlegsW/397Zx5fRXUv8O/vLllIICGBLCRAEkgMAhIQEBQsmwpuiGJFq/DqQnFfWq2Arfr6tK1aq32+T1tba322YiuK9dE+LRX0qc+NKk9pwX1DRSIquBBIbs77Y2buMnfm7snNvZzv53M/ycycOcucmd8553d+53c8CrZE+9B/6PQGgGB88SgqKqK+vh6/PzX/7Tkp2K0X3oMn4osWBXs/nsHFh3yPmS8Zfr6LC8wFNBLtl9wSEi/7RvHElAs579HzQkuZU+ixJ91rDNcvu3z91kfpHxJa4aZQwRf2GF8jjwa2ERAfe95fRGDP0Kg4wlUxjuWyzpm9tS5C/mLePmoIY4CFLQt5/4v3ufufdwPxFlqFjUqsUUD42tiIexOdKTBwtzlOQAja8vyrxRNZ/sDLrHru3YjzRc3N7H3B7LFH6PfDhJYtq90eoeXED3lu5jHwwfsR1+w5cytlP38/83pqqhg3PLat98BZx37DSePghuj7w+/rP7QjOgAEXS+svXAaXavNc34/qiuyQ+Vq7mjrsdvZVT8AMBaLnT29iWufKgylPXMl+IzjH0y5CbjEMffbtm2jf//+1NTX4NnlQSkfqrOMMbXVwXr2fwxd3YrhnZ2gGhhVb6hS9nV189EHHzBo92fggdcG1DO6vpxPOz7lgy8+oLywnLrPTd8yQ0a5lCIxlFLs3LmTbdu20djYmFIcOamKWXrQUgDKiisjzpfvm8O+9rkoFO90G462ik1VjJNgv+WUcea10Ao5+zZZSX1c5s3Rt8SPI+AWxMxX9VUh9UukxUWIrt1tqM7IZwKRu7Y49d5CBhLGf9WB0McYMHtghd5Crph0RfC8N6g7TeL5OI20EuilP7si/hZxTvrllHFzQxGmR3ZKxlugInW/CerY7Y8wXVVMIv4ggk89PKxd0xBUKxnlLmv4isIBLiNfM8/N1WEOrxwmT8M9iYbz0IK1PPJeqEG0X7e/t5e0XRi61hDyTDm9bkZEOMslcpfHS0dHB5WVlZHq0O6iiGOfCAEPUd4yHDcW7yFEhMrKSjo6nBvRRMjJHvuiQZGG3AAAHIZJREFU1kUsal1kHNQeBJ8Zw5vwCaHj9l1HKXs4028s4lGe6BWAAwqt4of3+p0njGa3VtlcGKSvigmn275ZZHQkNlWFsv2NMZnr8UdZxUTEbBOKZd2K4u5u44N2idYbUiA7EPbhmNfDPVqKWy/dRchXDwj5+/Dg9pGl9uU5JhmuHnJRxTg1+J8UDYVBI+H9v6KUihi3pJTTlDUxtvQcCjkgMAjYESGo7cEcrWLccBrB+nwgtu/ODPaqqkcIpd1Q1gBdgZDfnGBRjP8qi8o5tfV4vn6AYYJcVljG+I4OXiwqiqgjn21W/90p03i9XdGy7CwzmxLTnLSurIlPdr6Cz+ZTxG2EanUcSwtKocQxSEqk6wUyrR67iNwoIltF5CURWSMivT4FXDJ5Uig/1qQNwm5K+IBB9PMZw1sV9oKFL503bghVtsd8kexDxmPH1TK9OcyhUjIPvjLaS9/nr1zNE6c8ETwOuAn2sHQuHH8hxzUdx3Ejjou6HksGhE+exvpGrR7i5/PvDNrsujkX8MbswjiJNAFr5BAh18NfwfjP9OnAqIiXPuAtZq/yhVKKKQwTrLMYjuOscnvCyv/1mp/xxWvLuWP8asRfEhbeWcdebN9VyJbOD6f/kENqD6GmtCax/NqzH9XzjhSW//fWu9SoA2n/2kCqzvuXqPw+HjjIDO9iFeOEw/sgfn+UgLLiOqfz0qjwEHJfEOykmYYEHvGw4pAVYSNwcXw3vfbdrAr8XHz/f3D2EaMTKQV+XyHVVWN5RUWafoqEPYew16PIV0RrRath615WZ/zisGbNGkSErVu3JpSnVEhXFbMOGKOUOgh4FXB2G9iDVF1+Of810vBT7eST3NqxRBAu3Xcul3cuTSjelCZP3eSGvyj6XHdxxDZZlo69va4pIpinvzH5K34/FUUVXD/9euPlto0sBNjwnRmsvXAadsJVMWUOey6G76AE0H/8iXhc/ExfMekKzhl7TpQduxsRPdv+DrbGDmqZX3Qdy9sNJzvGd3rnVZQWhvL2vws3ctDeXwcXKA2Y3JJQvmLjPKHrEQ915Ybgrh8Yckc70F+P6nKwPHF4h85vO5/LPom9U8/4qvH8+shfJ7XxcfWK5TDnGuwpPnHFzKgeqgfwICweuBKZ+4NQfoEJHb/gnM5vm8fWO5bApLbT++D3R9nFWqvCPyd6R6jz913E890twbxg+8+WYphmL7zHbg+f3N64ZoTR8yIi+Ar8+EsCqFKh2B8avbk5GnRj1apVTJs2jXvvvTf5vCVIWoJdKfVXpZQ1nnoGiO2FpwcQn48PSqM9IFoc1XAU5447l8p9J7Cmezr3BWY46GNDPXa3ydOo4ZvT0DMFtbNFt1IcM/8GBt/9+4jzNd/7HoO/fRklhx0WJwahcVAJY+qiBUy4Kubc8edFXbfMtfxVDhuA2Ip5xoFncNGEi4I9Vyc9cGuNk8dHYMYK429EoxGtlvlR12m8NP5fHaNYefSB3H9uaFNq5S1kLwXUlhfTfMJ2hiw72jntZHBRxXjEw22zb+WMA89gRLmTXxJn/Xh447Zs3LLgQjan68nwuxNCdV2xeDHUWh4aQ/ENrejnOHnqhAh8wgD2maapdl8xsbPp9D1I1HdiebB02hfgz91T+IJI/+2F5R48vm6qzj41Knz412sReySZHkPKi/EVdlNc4GVkVQJbFTrwxRdf8NRTT3HHHXf0qGDPpI79TOAPGYwvYawVXZZQjrCp9fg4r+081v3vU4ChjgmZZEWbBgRXnsZN1anHbk2eJv9yBboV3eLBb/Oy5+3fn0HnnONwh60BipHhiB67w2a6u0qFITfeSMmh4W5JYz8B+wdk5ePSOS0snFjP3D853NTPQVOX5ETqOYc3OZ4XlOE4LFkf5o4nw61fInXswwYMi5hEPnVytBVS6F7jb9STPPom2LYRXkrvw35uYn9Of3BXdIIpKuej9chGPC91NzGFf8S52aWPaBfs5g5ewyujzXIjbrOiLRAOWLgdpkyIGa+FfSTp1hjdvn4nb+zohO4dlBRGi8Ev9xr91Yhr3QHo2mO8H/5Po+45cMgArj4utsrnwQcfZO7cubS0tFBRUcELL7zAhAkTYt6TCnF77CLyNxHZ7PCbHxZmJdAF/D5GPEtFZKOIbGxvT3xvxkRQtt62E9ZLO7WpkhsWmtYwDuE/H2iYTX1W6hrEIFaPPQUsHXtC/toBygyB0lVk6f3d75tcG+an2iX+suOOxVcZZlETRzZ4XHpGF89ppq481OuqLXPYMzYNc0c3wh1PFXhCjtPOP9fLzy8d5JCugZuRqRN2T6GvXzeP6xeMdc1TkdnIlNoFx+Rz4MRfut6XKL6obRvN78C+vsOlzhdNcm+UINRjd9xL1E6C7+0+M6qHLjo8eM5XG66iM9IMxuYar4u6zN7hsPttyjKrVq1i0SLD8GPRokWsWrUqzh2pEbfGlFJzYl0XkSXAscBsFWNMqZS6HbgdYOLEiZkx0DWxhnXFPuNvkZNvabO+L5nTzOD+lg1sWI/dvL5xVj3PFGxjY7P947BFGGvlaUqqGCufCQq38adD/1p27vbCpw/ETPKohqN4bV8nXfhJVHjWnH0sO+58AOUiwBPVsR9UH6Yacno9XHrsqdtwCw8teIjd1xmvbXu58JUvSY1jeI8do6HY170vSrD7zFVa4YIlXC0wdUQly+e1smjSMKbd555cqkUN6naLzTmcJHoWM1sHc9hJB0Wcs9++HWMz6y+JniPqP3cunz/8MAC+mhoGfct57sreqAQ3mg8737xhffR99hP2h+TxoGrHwafuE5DVE3bR7SLYl86qRCkf3XurOag+eiT50jZjHiTiWsdu+OQN8BU7L9KKw86dO1m/fj2bN29GRAgEAogIN9xwQ9pWMHbStYqZC3wXOF4p9VW88D2F1WOfOLycf50/milNFVFhLIEZYXzi4FBIeYWN5qYbKecnhQ/V6rEnrCMUgeY54V2bmMG9DmqnWJTPHE/Lgo+Y2ersAdPK53+OMlbifZaMqVcC6pe5Y1KzCAFj4+dwZha4z8E4YhPUlomdz2VC2SLy1TLMU7/1tRGU9XOeBH1x+DdZ0XlWylaNHvHwje948T98TzC3ZuJx8+eEfR7ptq4TYOGdbCZa/VX3k5uC/zc/toGiUaFFOQOOOSYs0sg4vwy2Ec71HugwRhFVXQFbuOjcK7M+3MwXK1q+dNyYI1usXr2axYsX88477/D222/z3nvv0djYyJNPPpnxtNK1irkN6A+sE5FNIvKLDOQpaawq9wssntrg2PqFTM9U9J3htq229yeZjy7RtmBoRTEXz26OOHfdgjE0V5VG2GwnlGay4ZJsr8qLnYWSJdg3DJ3AqK1b6PQnEHHcFi8Uh31HH9XtnI9Q0+zccD196tOcVjTU8Ro47/UZ2fDA5ZMu55nTnqHQWxgdFvhai6EOmzOqKqnFRRtHXMQ9gfiLr+zcd9x9XDzhYrzipdMvdBfYR6h2u3mnuon+9O19ii58MOZE5/tjvOx1P7mJUVu3RIUb9ts7ueqEW7n/+PujnINZ7Gufw/3H30+ztYlMjHRUUG3jHsbVjDgOTYNKaKm2GQGk2atetWoVCxZE7hh20kkncc8997jckTppTZ4qpZLcRr1nSGQC0ZrbcTcXz8BQyL5s1YUnroh2CjTjgCpmHOBglZJhMjXkS1QVE28BUELngT8ccx9v7HrVPR2XhVqlBaUx4515QBVvXn80OBvhIAge8VDidx+SjKkr4+0fGb3UrYm5AjHiTrEqWitaaa1o5eG3DFVIsFdqW+rqrzNGLpbK5sgv9wDwu67ZfDVkIXY7K7d3I6k6jBGuZMoUrGase88elxs8QYdo8ZjbMJd/7PwHtaXOLns3dY/gXb/zZHs8SotS89ESi8ceeyzq3EUXXZTxdCBHV57a+cL0seGtGOgaxmrVI3yyOKliTAExryHk7CdZMuTio2ewfZDFvmKOGH6ES2B33CZPo5KLWIWaeI/dzuiqEYyuijYxHGrak1cPKIIvSUlaxipLypteJEGq74ul8w9029UWRu+4cKTR7/J7/Dz29ccY8Pp6tv/3DVz1yZlc6YseGSZTUqsR8A6Oo+Zy80GebD05PKQlo5dwSuspoUVLNk7Y9wOOVAVR563nVlJQRN1AF9PcHCcvBPszQ8bw07aT+dkFF7qGcTQ9qzQFxfDDIj7gJxc9GXTIlMwkXobnPxKicUArXZ+3UluwKHZAK2+2TD73jedcbkivdRpZPpKFLQtdenu244GN8OlbIMLyea0cPNy9gbbTNLiUZ1fMpmr9n+FDl0B9uqVNHcvFQUCZgj3M3LFkypSIsJXFlTD2ZH7z3hj4nzcdhXiy7++Qm26i3/i2mGFc43Qzj4yOIUbc4irULZyc6/m9fsPHuq846cVFuUJeCHaF8NeGQ/AUOutAIXzyNKyia8fBJS8bpoPbnzPjUsHVquEkosJ4Tw0GutOViUlR4Clgz7Z/obAhesLYkWS/3hRbqzXz1wDQGQibvHITsEXWXpPGZGOyRM5LxMpv8mVJVXWVSIdgSpNhXjqrNTUVnOWULGq7uBhpx8qXW1m3VDYCUNYQqT4pO/YYp+D2SJ1Px78zI3S56F5LC1JbYJQr5KR3RztNgw39Z6xvMOizyv5ilw+LnDxNg6sCZ5qJ9F7XfWiFMbI4crT7/q2RZC5vMw4YzK2L4vTYnM6loGOPS7HZyy9w0oWn3tIm+14kE97SzU9rTtJqxyRWj92N4Bq+JIr1VWU18064idLavY5+j2LillC8Hvvs78NJd0BBv9jxxCHVyVNnsjAkT5G86LH//uwpbH5/F36v+8ty8PCBbHilnZoBsYdudpJ5LQLmh9abI/8h5cW8fM2R0Ytg3Mjgu/nbb06OGyZCiLs+F7H9TYFZVxmN9IEnxMpM0tGm3GPvhWHb/BHzeXHHiwztby00it9jryg1dM7lxdG6ZzfuWzaVR7d8BM1PQFmSXkOSaMRPHF/HRGvkOd3wV8OwqfDi76B6THLpmnS5+sNOh76v2ssLwT64fyEz4wxnz5sxkrljahhZFXuyxG2omsjnna3q7p/IDL5ZgEwvhEgwWQA85kIaT5lN1ZWJPPmL4ZBvOV9LpKVdshbuSn8Xebfnu27hOjoDnWnHH85JLSdxYvOJoTQT6LGfM72JypICFh6cuIAeMbiUEYNTVF0kIdhvPsVh9FdWBzO+m1raZLrHnjvkhWBPBI9HYgr1TAi8oN/qvvgueQvJdsZKpk+nesVyyk48yXaltxqbGOk0To84/M1Rv2Htm2tTSME5DWsD9kwT8d7WHQwTz4JD3Y0I/F4Pp0wa5no94/SE2i0JuvqYSwGv18vYsWNRSuH1ernttts49NBD49+YJHkr2P/4ram80f5F0vdFDaGTkIXdkogXvCxRMwZ2vJyx7dYSJXKRqRheCPsqI4+A19cBMKlmEpNqJsW5oY/h8cKxN2c7FxG428b3lmDP4PuegTwXFxezadMmAB555BGWL1/O448/nna8dvJWsE9urGByY4KWIhg+sE9uOZmzxp7leD2hOpUM6Ip7CHGzJ45Hmg1Bch9wTzU6Cca76B7De99+zsB+fj79KkNqo2zYAIfRMzr2zLB7924GDkzctDcZ8lawJ4vP4+P7U78fdT6ZSbCgKmZgIwwdCXyQodxlkISL04sfpMvH3/RfD7H3zbfSj7/UtBgqjrPBl6/A+GWA3h4ZZYq7zpxMS3UpU38Y7ZgrJbIs2F117P99JWx/ObnIVAA6vzIWXTmtRK4ZC/N+FDOKPXv20NbWRkdHBx9++CHr12foOdvQgj1BEjFjs7xMquJKOOsPcJe7S9deJ01f3b2CTRgWNjdT2NzsEjgJDr8CKppiW8xkiN5YqdqTWH5vMkYWBHv5iC/Z/W4xbUPLWXnMqPg39CLhqpinn36axYsXB709ZhIt2ONgWQMMKo3fk7M24qWPTdgAKXxgvdkA9PDH7yuAttN6Ng0bvWHumBNkQbDXLr+U2jcf48HFMXYdi9OzdmTfl/Dxq+Argqr0G4ypU6fy8ccf097eTpXT7mVpoAV7HC6e3cyUpkoOaap0DjA45JfZmjztk4LdIlEVQesx0DTTsA/XJEwy3h33B3rbvBaAaZcavz7O1q1bCQQCVFa6yJY00II9Dj6vh8NGuqwMvPAFKAlds/zCJ6tflRiuEDKGzfNfXAr7w+IHey4/4fSAmmjYXXfR9dH2jMWn0WRiZGnp2MGQE3fddRdeb+b91WjBng6VIb8mS6YO59m/mV6okuixN/3lL3jLBsQPmC5ZnsSKTZKNTgKUHBJ/VaxG09sEAoH4gTKAFuwZ4tr5Y+hoLeCtdT8JCvZHT340zKWqM4VNjb2RvRB92lqjL+dNo8kdtGDPINauMMr0tlfVr+c3zkgYNydofYE+PZpIjT75nDXpkUOvaV54d+wzxNumKYvkuhlerpCVyUJNL5E7dZvuZtY/EJGXzP1O/yoiQzKVsZwkF6xi+jJ50MvVDaimL5Buj/1GpdRBSqk2YC0QvXRzP8KuiumT9EnZmX/CUJs75jN9v27TEuxKqd1hhyXkQol7kj6siulpPfaoikys8OuDz02jyUHSnjwVkeuAxcAuYGbaOcphvAMMs8XSww/Pck5i0EPqjruPvpu9gb2p3Zysjb1GkxUy45Z7+/btXHLJJTz//PMUFhbS0NDALbfcQktLS/pZNIkr2EXkb4CTM+mVSqk/KaVWAitFZDlwAXC1SzxLgaUAw4b1oj/oXsRbXs7Ixx/D1wMrydKmh3vshd5CCr2pLrTKH1WM1rFrYqGUYsGCBSxZsoR7770XgE2bNvHRRx/1rmBXSs1JMK57gD/jItiVUrcDtwNMnDgxb7tm/upE9x7NFn350fflvCWHNnfUOLFhwwb8fj/Lli0LnrNWomaStFQxItKslHrNPDwe2Jp+ljQ9Ql9Wd+SRiaD2FeNMwYgR8QP1Ij9+7sds/SRJcaW6Dbe9eEKbbIfRWtHKdyfH3sZv8+bNHHzwwcmlmwLp6th/JCIHAN3AO8CyOOE1WaL/7Nl89eyz+IcOjR84W/TFRidJtCommqa//AXfoD6onsxj0hLsSin75pWaPsrAM06n7IT5wQnevkX+CUOtignR624zEiBez9qRzg5o32LsH1x9YErpjh49mtWrV6d0bzLolaf7CSLSR4W6RrP/MGvWLPbu3cuvfvWr4Lnnn38+4/ueasGuyT7WlnXezGxLl00GFBiN56BiF1fPmv0aEWHNmjWsW7eOESNGMHr0aK655hqGDMnson3tBEyTfY7/dxh+GAzNfVe7s4bN4t8O+zfmNc7LdlY0fZQhQ4bwxz/+sUfT0IJdk336VcDU87Kdi4wgIswfOT/b2dD0BDk0FaRVMRqNRpNnaMGu0Wg0eYYW7BqNRpMUfd+UVQt2jUaTNbwVFdnOQl6iJ081Gk1WaH7qSaQwVcdxmljoHrtGo8kKvspKvKWl2c5Gr+L1emlra2P06NGMGzeOm2++me4e2HFN99g1Go2mlyguLmbTpk0A7Nixg9NOO41du3Zx7bXXZjQd3WPXaDSahMisIXtVVRW33347t912W8Z9C+keu0aj2e/Yfv317N2SotteEfCXRF0uHNVKzYoVSUXZ1NREd3c3O3bsoDqDezlowa7pcZZ9bQTjh5VnOxsaTZ+kJzyBasGu6XGunNea7SxoNBEk27MGoGsv7Pin4ayuenRG8vHmm2/i9XqpqqrKSHwWWseu0Wg0WaC9vZ1ly5ZxwQUXBHfeyhS6x67RaDSJ4DHFZb/UXTLv2bOHtrY2Ojs78fl8nHHGGVx22WUZymAILdg1Go0mETxeGDI+rSgCgUCGMhObjAh2EfkOcCMwWCn1cSbi1Gg02ePWRW0MKtWrQnOVtAW7iAwFjgDeTT87Go2mLzC/rS7bWdCkQSYmT38KXEEuuDzTaDSa/YC0BLuIHA+8r5T6vwzlR6PRaHqMnrAZ7wnSzWdcVYyI/A2ocbi0ElgBHJlIQiKyFFgKMGzYsCSyqNFoNOlTVFTEzp07qayszLh5YSZRSrFz506KiopSjkNSbRlEZCzwKPCVeaoe+ACYrJTaHuveiRMnqo0bN6aUrkaj0aRCZ2cn27Zto6OjI9tZiUtRURH19fX4/f6I8yLyd6XUxHj3pzx5qpR6GQgulxKRt4GJ2ipGo9H0Rfx+P42NjdnORq+gV55qNBpNnpGxBUpKqYZMxaXRaDSa1NE9do1Go8kzUp48TStRkXbgnRRvHwTsb3p8Xeb9A13m/YN0yjxcKTU4XqCsCPZ0EJGNicwK5xO6zPsHusz7B71RZq2K0Wg0mjxDC3aNRqPJM3JRsN+e7QxkAV3m/QNd5v2DHi9zzunYNRqNRhObXOyxazQajSYGOSXYRWSuiLwiIq+LyJXZzk8mEJGhIrJBRLaIyD9E5GLzfIWIrBOR18y/A83zIiI/M5/BSyIyIbslSB0R8YrIiyKy1jxuFJFnzTL/QUQKzPOF5vHr5vWGbOY7VUSkXERWi8hWs76n5ns9i8il5nu9WURWiUhRvtWziPxGRHaIyOawc0nXq4gsMcO/JiJL0slTzgh2EfEC/wHMAw4EThWRA7Obq4zQBXxbKTUKmAKcb5brSuBRpVQzhrM1qyGbBzSbv6XAz3s/yxnjYmBL2PGPgZ+aZf4UOMs8fxbwqVJqJIb//x/3ai4zx63Aw0qpVmAcRtnztp5FpA64CMOH1BjACywi/+r5t8Bc27mk6lVEKoCrgUOAycDVVmOQEkqpnPgBU4FHwo6XA8uzna8eKOefMHakegWoNc/VAq+Y//8SODUsfDBcLv0wvIE+CswC1gKCsWjDZ69v4BFgqvm/zwwn2S5DkuUdALxlz3c+1zNQB7wHVJj1thY4Kh/rGWgANqdar8CpwC/DzkeES/aXMz12Qi+JxTbzXN5gDj3HA88C1UqpDwHMv5YnzXx5Drdg7LzVbR5XAp8ppbrM4/ByBctsXt9lhs8lmoB24E5T/fRrESkhj+tZKfU+cBPGtpkfYtTb38nverZItl4zWt+5JNidPOPnjUmPiJQC9wOXKKV2xwrqcC6nnoOIHAvsUEr9Pfy0Q1CVwLVcwQdMAH6ulBoPfEloeO5EzpfZVCXMBxqBIUAJhirCTj7VczzcypjRsueSYN8GDA07tjb2yHlExI8h1H+vlHrAPP2RiNSa12uBHeb5fHgOhwHHmz7878VQx9wClIuI5XE0vFzBMpvXy4BPejPDGWAbsE0p9ax5vBpD0OdzPc8B3lJKtSulOoEHgEPJ73q2SLZeM1rfuSTYnweazRn1AoxJmIeynKe0EREB7gC2KKVuDrv0EGDNjC/B0L1b5xebs+tTgF3WkC9XUEotV0rVK8PV8yJgvVLqG8AGYKEZzF5m61ksNMPnVE9OGbuKvSciB5inZgP/JI/rGUMFM0VE+pnvuVXmvK3nMJKt10eAI0VkoDnSOdI8lxrZnnRIcoLiaOBV4A1gZbbzk6EyTcMYcr0EbDJ/R2PoFh8FXjP/VpjhBcM66A3gZQyLg6yXI43yzwDWmv83Ac8BrwP3AYXm+SLz+HXzelO2851iWduAjWZdPwgMzPd6Bq4FtgKbgbuBwnyrZ2AVxhxCJ0bP+6xU6hU40yz768A308mTXnmq0Wg0eUYuqWI0Go1GkwBasGs0Gk2eoQW7RqPR5BlasGs0Gk2eoQW7RqPR5BlasGs0Gk2eoQW7RqPR5BlasGs0Gk2e8f8fF7NUTr321gAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# np.random.randn(1000,4) 随机生成1000行4列数据\n", "# list(\"ABCD\")会变为['A','B','C','D']\n", "data = pd.DataFrame(\n", " np.random.randn(1000,4),\n", " index=np.arange(1000),\n", " columns=list(\"ABCD\")\n", ")\n", "data.cumsum()\n", "data.plot()\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 103, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "ax = data.plot.scatter(x='A',y='B',color='DarkBlue',label='Class1')\n", "# 将之下这个 data 画在上一个 ax 上面\n", "data.plot.scatter(x='A',y='C',color='LightGreen',label='Class2',ax=ax)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 9.学习来源" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "https://morvanzhou.github.io/tutorials/data-manipulation/np-pd/" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.4" } }, "nbformat": 4, "nbformat_minor": 2 } ================================================ FILE: 3.pandas/3.pandas_beginner/student.csv ================================================ Student ID,name ,age,gender 1100,Kelly,22,Female 1101,Clo,21,Female 1102,Tilly,22,Female 1103,Tony,24,Male 1104,David,20,Male 1105,Catty,22,Female 1106,M,3,Female 1107,N,43,Male 1108,A,13,Male 1109,S,12,Male 1110,David,33,Male 1111,Dw,3,Female 1112,Q,23,Male 1113,W,21,Female ================================================ FILE: 3.pandas/4.Pandas50/Pandas50.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Pandas练习题50题" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ ">作者:王大毛,和鲸社区\n", ">\n", ">出处:https://www.kesci.com/home/project/5ddc974ef41512002cec1dca\n", ">\n", ">修改:黄海广" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Pandas 是基于 NumPy 的一种数据处理工具,该工具为了解决数据分析任务而创建。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的函数和方法。 这些练习着重DataFrame和Series对象的基本操作,包括数据的索引、分组、统计和清洗。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 基本操作\n", "### 1.导入 Pandas 库并简写为 pd,并输出版本号" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'0.22.0'" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import pandas as pd\n", "pd.__version__" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2. 从列表创建 Series" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 0\n", "1 1\n", "2 2\n", "3 3\n", "4 4\n", "dtype: int64" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr = [0, 1, 2, 3, 4]\n", "df = pd.Series(arr) # 如果不指定索引,则默认从 0 开始\n", "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3. 从字典创建 Series" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "a 1\n", "b 2\n", "c 3\n", "d 4\n", "e 5\n", "dtype: int64" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "d = {'a':1,'b':2,'c':3,'d':4,'e':5}\n", "df = pd.Series(d)\n", "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4. 从 NumPy 数组创建 DataFrame" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ABCD
2020-01-10 22:46:01.6420210.2770990.6650530.882637-0.598895
2020-01-11 22:46:01.6420210.365233-2.529804-0.6998490.159623
2020-01-12 22:46:01.642021-0.831850-2.099049-0.976407-0.342800
2020-01-13 22:46:01.6420210.6808001.6829990.144469-2.503013
2020-01-14 22:46:01.642021-0.4138800.876169-1.0478770.996865
2020-01-15 22:46:01.6420211.3739560.029732-0.549268-0.287584
\n", "
" ], "text/plain": [ " A B C D\n", "2020-01-10 22:46:01.642021 0.277099 0.665053 0.882637 -0.598895\n", "2020-01-11 22:46:01.642021 0.365233 -2.529804 -0.699849 0.159623\n", "2020-01-12 22:46:01.642021 -0.831850 -2.099049 -0.976407 -0.342800\n", "2020-01-13 22:46:01.642021 0.680800 1.682999 0.144469 -2.503013\n", "2020-01-14 22:46:01.642021 -0.413880 0.876169 -1.047877 0.996865\n", "2020-01-15 22:46:01.642021 1.373956 0.029732 -0.549268 -0.287584" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import numpy as np\n", "dates = pd.date_range('today', periods=6) # 定义时间序列作为 index\n", "num_arr = np.random.randn(6, 4) # 传入 numpy 随机数组\n", "columns = ['A', 'B', 'C', 'D'] # 将列表作为列名\n", "df = pd.DataFrame(num_arr, index=dates, columns=columns)\n", "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 5. 从CSV中创建 DataFrame,分隔符为“;”,编码格式为gbk" ] }, { "cell_type": "raw", "metadata": {}, "source": [ "df = pd.read_csv('test.csv', encoding='gbk', sep=';')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 6. 从字典对象创建DataFrame,并设置索引" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ageanimalpriorityvisits
a2.5catyes1
b3.0catyes3
c0.5snakeno2
dNaNdogyes3
e5.0dogno2
f2.0catno3
g4.5snakeno1
hNaNcatyes1
i7.0dogno2
j3.0dogno1
\n", "
" ], "text/plain": [ " age animal priority visits\n", "a 2.5 cat yes 1\n", "b 3.0 cat yes 3\n", "c 0.5 snake no 2\n", "d NaN dog yes 3\n", "e 5.0 dog no 2\n", "f 2.0 cat no 3\n", "g 4.5 snake no 1\n", "h NaN cat yes 1\n", "i 7.0 dog no 2\n", "j 3.0 dog no 1" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import numpy as np\n", "data = {\n", " 'animal':\n", " ['cat', 'cat', 'snake', 'dog', 'dog', 'cat', 'snake', 'cat', 'dog', 'dog'],\n", " 'age': [2.5, 3, 0.5, np.nan, 5, 2, 4.5, np.nan, 7, 3],\n", " 'visits': [1, 3, 2, 3, 2, 3, 1, 1, 2, 1],\n", " 'priority':\n", " ['yes', 'yes', 'no', 'yes', 'no', 'no', 'no', 'yes', 'no', 'no']\n", "}\n", "\n", "labels = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']\n", "df = pd.DataFrame(data, index=labels)\n", "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 7. 显示df的基础信息,包括行的数量;列名;每一列值的数量、类型" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Index: 10 entries, a to j\n", "Data columns (total 4 columns):\n", "age 8 non-null float64\n", "animal 10 non-null object\n", "priority 10 non-null object\n", "visits 10 non-null int64\n", "dtypes: float64(1), int64(1), object(2)\n", "memory usage: 400.0+ bytes\n" ] } ], "source": [ "df.info()\n", "# 方法二\n", "# df.describe()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 8. 展示df的前3行" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ageanimalpriorityvisits
a2.5catyes1
b3.0catyes3
c0.5snakeno2
\n", "
" ], "text/plain": [ " age animal priority visits\n", "a 2.5 cat yes 1\n", "b 3.0 cat yes 3\n", "c 0.5 snake no 2" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.iloc[:3]\n", "# 方法二\n", "#df.head(3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 9. 取出df的animal和age列" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
animalage
acat2.5
bcat3.0
csnake0.5
ddogNaN
edog5.0
fcat2.0
gsnake4.5
hcatNaN
idog7.0
jdog3.0
\n", "
" ], "text/plain": [ " animal age\n", "a cat 2.5\n", "b cat 3.0\n", "c snake 0.5\n", "d dog NaN\n", "e dog 5.0\n", "f cat 2.0\n", "g snake 4.5\n", "h cat NaN\n", "i dog 7.0\n", "j dog 3.0" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.loc[:, ['animal', 'age']]\n", "# 方法二\n", "# df[['animal', 'age']]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 10. 取出索引为[3, 4, 8]行的animal和age列" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
animalage
ddogNaN
edog5.0
idog7.0
\n", "
" ], "text/plain": [ " animal age\n", "d dog NaN\n", "e dog 5.0\n", "i dog 7.0" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.loc[df.index[[3, 4, 8]], ['animal', 'age']]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 11. 取出age值大于3的行" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ageanimalpriorityvisits
e5.0dogno2
g4.5snakeno1
i7.0dogno2
\n", "
" ], "text/plain": [ " age animal priority visits\n", "e 5.0 dog no 2\n", "g 4.5 snake no 1\n", "i 7.0 dog no 2" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[df['age'] > 3]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 12. 取出age值缺失的行" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ageanimalpriorityvisits
dNaNdogyes3
hNaNcatyes1
\n", "
" ], "text/plain": [ " age animal priority visits\n", "d NaN dog yes 3\n", "h NaN cat yes 1" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[df['age'].isnull()]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 13.取出age在2,4间的行(不含)" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ageanimalpriorityvisits
e5.0dogno2
g4.5snakeno1
i7.0dogno2
\n", "
" ], "text/plain": [ " age animal priority visits\n", "e 5.0 dog no 2\n", "g 4.5 snake no 1\n", "i 7.0 dog no 2" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[(df['age']>2) & (df['age']>4)]\n", "# 方法二\n", "# df[df['age'].between(2, 4)]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 14. f行的age改为1.5" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "df.loc['f', 'age'] = 1.5" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 15. 计算visits的总和" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "19" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['visits'].sum()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 16. 计算每个不同种类animal的age的平均数" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "animal\n", "cat 2.333333\n", "dog 5.000000\n", "snake 2.500000\n", "Name: age, dtype: float64" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.groupby('animal')['age'].mean()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 17. 在df中插入新行k,然后删除该行" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ageanimalpriorityvisits
a2.5catyes1
b3.0catyes3
c0.5snakeno2
dNaNdogyes3
e5.0dogno2
f1.5catno3
g4.5snakeno1
hNaNcatyes1
i7.0dogno2
j3.0dogno1
\n", "
" ], "text/plain": [ " age animal priority visits\n", "a 2.5 cat yes 1\n", "b 3.0 cat yes 3\n", "c 0.5 snake no 2\n", "d NaN dog yes 3\n", "e 5.0 dog no 2\n", "f 1.5 cat no 3\n", "g 4.5 snake no 1\n", "h NaN cat yes 1\n", "i 7.0 dog no 2\n", "j 3.0 dog no 1" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#插入\n", "df.loc['k'] = [5.5, 'dog', 'no', 2]\n", "# 删除\n", "df = df.drop('k')\n", "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 18. 计算df中每个种类animal的数量" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "dog 4\n", "cat 4\n", "snake 2\n", "Name: animal, dtype: int64" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['animal'].value_counts()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 19. 先按age降序排列,后按visits升序排列" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ageanimalpriorityvisits
i7.0dogno2
e5.0dogno2
g4.5snakeno1
j3.0dogno1
b3.0catyes3
a2.5catyes1
f1.5catno3
c0.5snakeno2
hNaNcatyes1
dNaNdogyes3
\n", "
" ], "text/plain": [ " age animal priority visits\n", "i 7.0 dog no 2\n", "e 5.0 dog no 2\n", "g 4.5 snake no 1\n", "j 3.0 dog no 1\n", "b 3.0 cat yes 3\n", "a 2.5 cat yes 1\n", "f 1.5 cat no 3\n", "c 0.5 snake no 2\n", "h NaN cat yes 1\n", "d NaN dog yes 3" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.sort_values(by=['age', 'visits'], ascending=[False, True])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 20. 将priority列中的yes, no替换为布尔值True, False" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ageanimalpriorityvisits
a2.5catTrue1
b3.0catTrue3
c0.5snakeFalse2
dNaNdogTrue3
e5.0dogFalse2
f1.5catFalse3
g4.5snakeFalse1
hNaNcatTrue1
i7.0dogFalse2
j3.0dogFalse1
\n", "
" ], "text/plain": [ " age animal priority visits\n", "a 2.5 cat True 1\n", "b 3.0 cat True 3\n", "c 0.5 snake False 2\n", "d NaN dog True 3\n", "e 5.0 dog False 2\n", "f 1.5 cat False 3\n", "g 4.5 snake False 1\n", "h NaN cat True 1\n", "i 7.0 dog False 2\n", "j 3.0 dog False 1" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['priority'] = df['priority'].map({'yes': True, 'no': False})\n", "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 21. 将animal列中的snake替换为python" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ageanimalpriorityvisits
a2.5catTrue1
b3.0catTrue3
c0.5pythonFalse2
dNaNdogTrue3
e5.0dogFalse2
f1.5catFalse3
g4.5pythonFalse1
hNaNcatTrue1
i7.0dogFalse2
j3.0dogFalse1
\n", "
" ], "text/plain": [ " age animal priority visits\n", "a 2.5 cat True 1\n", "b 3.0 cat True 3\n", "c 0.5 python False 2\n", "d NaN dog True 3\n", "e 5.0 dog False 2\n", "f 1.5 cat False 3\n", "g 4.5 python False 1\n", "h NaN cat True 1\n", "i 7.0 dog False 2\n", "j 3.0 dog False 1" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['animal'] = df['animal'].replace('snake', 'python')\n", "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 22. 对每种animal的每种不同数量visits,计算平均age,即,返回一个表格,行是aniaml种类,列是visits数量,表格值是行动物种类列访客数量的平均年龄" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
visits123
animal
cat2.5NaN2.25
dog3.06.0NaN
python4.50.5NaN
\n", "
" ], "text/plain": [ "visits 1 2 3\n", "animal \n", "cat 2.5 NaN 2.25\n", "dog 3.0 6.0 NaN\n", "python 4.5 0.5 NaN" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.pivot_table(index='animal', columns='visits', values='age', aggfunc='mean')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 进阶操作\n", "### 23. 有一列整数列A的DatraFrame,删除数值重复的行" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " A\n", "0 1\n", "1 2\n", "2 2\n", "3 3\n", "4 4\n", "5 5\n", "6 5\n", "7 5\n", "8 6\n", "9 7\n", "10 7\n", " A\n", "0 1\n", "1 2\n", "3 3\n", "4 4\n", "5 5\n", "8 6\n", "9 7\n" ] } ], "source": [ "df = pd.DataFrame({'A': [1, 2, 2, 3, 4, 5, 5, 5, 6, 7, 7]})\n", "print(df)\n", "df1 = df.loc[df['A'].shift() != df['A']]\n", "# 方法二\n", "# df1 = df.drop_duplicates(subset='A')\n", "print(df1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 24. 一个全数值DatraFrame,每个数字减去该行的平均数" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " 0 1 2\n", "0 0.465407 0.152497 0.861174\n", "1 0.623682 0.627339 0.495652\n", "2 0.835176 0.862376 0.693047\n", "3 0.319698 0.306709 0.654063\n", "4 0.234855 0.194232 0.438597\n", " 0 1 2\n", "0 -0.027619 -0.340529 0.368148\n", "1 0.041457 0.045115 -0.086572\n", "2 0.038310 0.065509 -0.103819\n", "3 -0.107125 -0.120114 0.227239\n", "4 -0.054373 -0.094996 0.149368\n" ] } ], "source": [ "df = pd.DataFrame(np.random.random(size=(5, 3)))\n", "print(df)\n", "df1 = df.sub(df.mean(axis=1), axis=0)\n", "print(df1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 25. 一个有5列的DataFrame,求哪一列的和最小" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " a b c d e\n", "0 0.653658 0.730994 0.223025 0.456730 0.288283\n", "1 0.937546 0.640995 0.197359 0.671524 0.006035\n", "2 0.392762 0.174955 0.053928 0.318634 0.464534\n", "3 0.741499 0.197861 0.988105 0.633780 0.914250\n", "4 0.469285 0.309043 0.162127 0.032480 0.863017\n" ] }, { "data": { "text/plain": [ "'c'" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.DataFrame(np.random.random(size=(5, 5)), columns=list('abcde'))\n", "print(df)\n", "df.sum().idxmin()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 26. 给定DataFrame,求A列每个值的前3大的B的值的和" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " A B\n", "0 a 12\n", "1 a 345\n", "2 a 3\n", "3 b 1\n", "4 b 45\n", "5 c 14\n", "6 a 4\n", "7 a 52\n", "8 b 54\n", "9 c 23\n", "10 c 235\n", "11 c 21\n", "12 b 57\n", "13 b 3\n", "14 c 87\n", "A\n", "a 409\n", "b 156\n", "c 345\n", "Name: B, dtype: int64\n" ] } ], "source": [ "df = pd.DataFrame({'A': list('aaabbcaabcccbbc'), \n", " 'B': [12,345,3,1,45,14,4,52,54,23,235,21,57,3,87]})\n", "print(df)\n", "df1 = df.groupby('A')['B'].nlargest(3).sum(level=0)\n", "print(df1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 27. 给定DataFrame,有列A, B,A的值在1-100(含),对A列每10步长,求对应的B的和" ] }, { "cell_type": "code", "execution_count": 32, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " A B\n", "0 1 1\n", "1 2 2\n", "2 11 11\n", "3 11 11\n", "4 33 33\n", "5 34 34\n", "6 35 35\n", "7 40 40\n", "8 79 79\n", "9 99 99\n", "A\n", "(0, 10] 3\n", "(10, 20] 22\n", "(20, 30] 0\n", "(30, 40] 142\n", "(40, 50] 0\n", "(50, 60] 0\n", "(60, 70] 0\n", "(70, 80] 79\n", "(80, 90] 0\n", "(90, 100] 99\n", "Name: B, dtype: int64\n" ] } ], "source": [ "df = pd.DataFrame({\n", " 'A': [1, 2, 11, 11, 33, 34, 35, 40, 79, 99],\n", " 'B': [1, 2, 11, 11, 33, 34, 35, 40, 79, 99]\n", "})\n", "print(df)\n", "df1 = df.groupby(pd.cut(df['A'], np.arange(0, 101, 10)))['B'].sum()\n", "print(df1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 28. 给定DataFrame,计算每个元素至左边最近的0(或者至开头)的距离,生成新列y" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " X Y\n", "0 7 1.0\n", "1 2 2.0\n", "2 0 0.0\n", "3 3 1.0\n", "4 4 2.0\n", "5 2 3.0\n", "6 5 4.0\n", "7 0 0.0\n", "8 3 1.0\n", "9 4 2.0\n" ] } ], "source": [ "df = pd.DataFrame({'X': [7, 2, 0, 3, 4, 2, 5, 0, 3, 4]})\n", "# 方法一\n", "x = (df['X'] != 0).cumsum()\n", "y = x != x.shift()\n", "df['Y'] = y.groupby((y != y.shift()).cumsum()).cumsum()\n", "print(df)" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " X Y\n", "0 7 1\n", "1 2 2\n", "2 0 0\n", "3 3 1\n", "4 4 2\n", "5 2 3\n", "6 5 4\n", "7 0 0\n", "8 3 1\n", "9 4 2\n" ] } ], "source": [ "# 方法二\n", "df['Y'] = df.groupby((df['X'] == 0).cumsum()).cumcount()\n", "first_zero_idx = (df['X'] == 0).idxmax()\n", "df['Y'].iloc[0:first_zero_idx] += 1\n", "print(df)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 29. 一个全数值的DataFrame,返回最大3个值的坐标" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " 0 1 2\n", "0 0.974321 0.454025 0.018815\n", "1 0.323491 0.468609 0.834424\n", "2 0.340960 0.826835 0.503252\n", "3 0.812414 0.202745 0.965168\n", "4 0.633172 0.270281 0.915212\n" ] }, { "data": { "text/plain": [ "[(2, 4), (2, 3), (0, 0)]" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.DataFrame(np.random.random(size=(5, 3)))\n", "print(df)\n", "df.unstack().sort_values()[-3:].index.tolist()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 30. 给定DataFrame,将负值代替为同组的平均值" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " grps vals\n", "0 a -12\n", "1 a 345\n", "2 a 3\n", "3 b 1\n", "4 b 45\n", "5 c 14\n", "6 a 4\n", "7 a -52\n", "8 b 54\n", "9 c 23\n", "10 c -235\n", "11 c 21\n", "12 b 57\n", "13 b 3\n", "14 c 87\n", " grps vals\n", "0 a 117.333333\n", "1 a 345.000000\n", "2 a 3.000000\n", "3 b 1.000000\n", "4 b 45.000000\n", "5 c 14.000000\n", "6 a 4.000000\n", "7 a 117.333333\n", "8 b 54.000000\n", "9 c 23.000000\n", "10 c 36.250000\n", "11 c 21.000000\n", "12 b 57.000000\n", "13 b 3.000000\n", "14 c 87.000000\n" ] } ], "source": [ "df = pd.DataFrame({\n", " 'grps':\n", " list('aaabbcaabcccbbc'),\n", " 'vals': [-12, 345, 3, 1, 45, 14, 4, -52, 54, 23, -235, 21, 57, 3, 87]\n", "})\n", "print(df)\n", "\n", "\n", "def replace(group):\n", " mask = group < 0\n", " group[mask] = group[~mask].mean()\n", " return group\n", "\n", "\n", "df['vals'] = df.groupby(['grps'])['vals'].transform(replace)\n", "print(df)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 31. 计算3位滑动窗口的平均值,忽略NAN" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " group value\n", "0 a 1.0\n", "1 a 2.0\n", "2 b 3.0\n", "3 b NaN\n", "4 a 2.0\n", "5 b 3.0\n", "6 b NaN\n", "7 b 1.0\n", "8 a 7.0\n", "9 b 3.0\n", "10 a NaN\n", "11 b 8.0\n" ] }, { "data": { "text/plain": [ "0 1.000000\n", "1 1.500000\n", "2 3.000000\n", "3 3.000000\n", "4 1.666667\n", "5 3.000000\n", "6 3.000000\n", "7 2.000000\n", "8 3.666667\n", "9 2.000000\n", "10 4.500000\n", "11 4.000000\n", "Name: value, dtype: float64" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.DataFrame({\n", " 'group': list('aabbabbbabab'),\n", " 'value': [1, 2, 3, np.nan, 2, 3, np.nan, 1, 7, 3, np.nan, 8]\n", "})\n", "print(df)\n", "\n", "g1 = df.groupby(['group'])['value']\n", "g2 = df.fillna(0).groupby(['group'])['value']\n", "\n", "s = g2.rolling(3, min_periods=1).sum() / g1.rolling(3, min_periods=1).count()\n", "s.reset_index(level=0, drop=True).sort_index()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Series 和 Datetime索引\n", "### 32. 创建Series s,将2015所有工作日作为随机值的索引" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2015-01-01 0.503458\n", "2015-01-02 0.194185\n", "2015-01-05 0.550930\n", "2015-01-06 0.174309\n", "2015-01-07 0.316911\n", "2015-01-08 0.288385\n", "2015-01-09 0.293285\n", "2015-01-12 0.340436\n", "2015-01-13 0.630009\n", "2015-01-14 0.076130\n", "Freq: B, dtype: float64" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dti = pd.date_range(start='2015-01-01', end='2015-12-31', freq='B') \n", "s = pd.Series(np.random.rand(len(dti)), index=dti)\n", "\n", "s.head(10)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 33. 所有礼拜三的值求和" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "27.272318047689705" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s[s.index.weekday == 2].sum()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 34. 求每个自然月的平均数" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2015-01-31 0.375417\n", "2015-02-28 0.551560\n", "2015-03-31 0.540772\n", "2015-04-30 0.450957\n", "2015-05-31 0.369119\n", "2015-06-30 0.588625\n", "2015-07-31 0.584358\n", "2015-08-31 0.609751\n", "2015-09-30 0.511285\n", "2015-10-31 0.555546\n", "2015-11-30 0.528777\n", "2015-12-31 0.574317\n", "Freq: M, dtype: float64" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s.resample('M').mean()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 35. 每连续4个月为一组,求最大值所在的日期" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2015-01-31 2015-01-15\n", "2015-05-31 2015-02-04\n", "2015-09-30 2015-06-02\n", "2016-01-31 2015-12-08\n", "dtype: datetime64[ns]" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s.groupby(pd.Grouper(freq='4M')).idxmax()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 36. 创建2015-2016每月第三个星期四的序列" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AirlineFlightNumberFrom_ToRecentDelays
0KLM(!)10045.0LoNDon_paris[23, 47]
1<Air France> (12)NaNMAdrid_miLAN[]
2(British Airways. )10065.0londON_StockhOlm[24, 43, 87]
312. Air FranceNaNBudapest_PaRis[13]
4\"Swiss Air\"10085.0Brussels_londOn[67, 32]
\n", "
" ], "text/plain": [ " Airline FlightNumber From_To RecentDelays\n", "0 KLM(!) 10045.0 LoNDon_paris [23, 47]\n", "1 (12) NaN MAdrid_miLAN []\n", "2 (British Airways. ) 10065.0 londON_StockhOlm [24, 43, 87]\n", "3 12. Air France NaN Budapest_PaRis [13]\n", "4 \"Swiss Air\" 10085.0 Brussels_londOn [67, 32]" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.date_range('2015-01-01', '2016-12-31', freq='WOM-3THU')\n", "#数据清洗\n", "df = pd.DataFrame({'From_To': ['LoNDon_paris', 'MAdrid_miLAN', 'londON_StockhOlm', \n", " 'Budapest_PaRis', 'Brussels_londOn'],\n", " 'FlightNumber': [10045, np.nan, 10065, np.nan, 10085],\n", " 'RecentDelays': [[23, 47], [], [24, 43, 87], [13], [67, 32]],\n", " 'Airline': ['KLM(!)', ' (12)', '(British Airways. )', \n", " '12. Air France', '\"Swiss Air\"']})\n", "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 37. FlightNumber列中有些值缺失了,他们本来应该是每一行增加10,填充缺失的数值,并且令数据类型为整数" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AirlineFlightNumberFrom_ToRecentDelays
0KLM(!)10045LoNDon_paris[23, 47]
1<Air France> (12)10055MAdrid_miLAN[]
2(British Airways. )10065londON_StockhOlm[24, 43, 87]
312. Air France10075Budapest_PaRis[13]
4\"Swiss Air\"10085Brussels_londOn[67, 32]
\n", "
" ], "text/plain": [ " Airline FlightNumber From_To RecentDelays\n", "0 KLM(!) 10045 LoNDon_paris [23, 47]\n", "1 (12) 10055 MAdrid_miLAN []\n", "2 (British Airways. ) 10065 londON_StockhOlm [24, 43, 87]\n", "3 12. Air France 10075 Budapest_PaRis [13]\n", "4 \"Swiss Air\" 10085 Brussels_londOn [67, 32]" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['FlightNumber'] = df['FlightNumber'].interpolate().astype(int)\n", "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 38. 将From_To列从_分开,分成From, To两列,并删除原始列" ] }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AirlineFlightNumberRecentDelaysFromTo
0KLM(!)10045[23, 47]LoNDonparis
1<Air France> (12)10055[]MAdridmiLAN
2(British Airways. )10065[24, 43, 87]londONStockhOlm
312. Air France10075[13]BudapestPaRis
4\"Swiss Air\"10085[67, 32]BrusselslondOn
\n", "
" ], "text/plain": [ " Airline FlightNumber RecentDelays From To\n", "0 KLM(!) 10045 [23, 47] LoNDon paris\n", "1 (12) 10055 [] MAdrid miLAN\n", "2 (British Airways. ) 10065 [24, 43, 87] londON StockhOlm\n", "3 12. Air France 10075 [13] Budapest PaRis\n", "4 \"Swiss Air\" 10085 [67, 32] Brussels londOn" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" } ], "source": [ "temp = df.From_To.str.split('_', expand=True)\n", "temp.columns = ['From', 'To']\n", "df = df.join(temp)\n", "df = df.drop('From_To', axis=1)\n", "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 39. 将From, To大小写统一首字母大写其余小写" ] }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AirlineFlightNumberRecentDelaysFromTo
0KLM(!)10045[23, 47]LondonParis
1<Air France> (12)10055[]MadridMilan
2(British Airways. )10065[24, 43, 87]LondonStockholm
312. Air France10075[13]BudapestParis
4\"Swiss Air\"10085[67, 32]BrusselsLondon
\n", "
" ], "text/plain": [ " Airline FlightNumber RecentDelays From To\n", "0 KLM(!) 10045 [23, 47] London Paris\n", "1 (12) 10055 [] Madrid Milan\n", "2 (British Airways. ) 10065 [24, 43, 87] London Stockholm\n", "3 12. Air France 10075 [13] Budapest Paris\n", "4 \"Swiss Air\" 10085 [67, 32] Brussels London" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['From'] = df['From'].str.capitalize()\n", "df['To'] = df['To'].str.capitalize()\n", "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 40. Airline列,有一些多余的标点符号,需要提取出正确的航司名称。举例:'(British Airways. )' 应该改为 'British Airways'." ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AirlineFlightNumberRecentDelaysFromTo
0KLM10045[23, 47]LondonParis
1Air France10055[]MadridMilan
2British Airways10065[24, 43, 87]LondonStockholm
3Air France10075[13]BudapestParis
4Swiss Air10085[67, 32]BrusselsLondon
\n", "
" ], "text/plain": [ " Airline FlightNumber RecentDelays From To\n", "0 KLM 10045 [23, 47] London Paris\n", "1 Air France 10055 [] Madrid Milan\n", "2 British Airways 10065 [24, 43, 87] London Stockholm\n", "3 Air France 10075 [13] Budapest Paris\n", "4 Swiss Air 10085 [67, 32] Brussels London" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['Airline'] = df['Airline'].str.extract(\n", " '([a-zA-Z\\s]+)', expand=False).str.strip()\n", "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 41. Airline列,数据被以列表的形式录入,但是我们希望每个数字被录入成单独一列,delay_1, delay_2, ...没有的用NAN替代。" ] }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
AirlineFlightNumberFromTodelay_1delay_2delay_3
0KLM10045LondonParis23.047.0NaN
1Air France10055MadridMilanNaNNaNNaN
2British Airways10065LondonStockholm24.043.087.0
3Air France10075BudapestParis13.0NaNNaN
4Swiss Air10085BrusselsLondon67.032.0NaN
\n", "
" ], "text/plain": [ " Airline FlightNumber From To delay_1 delay_2 \\\n", "0 KLM 10045 London Paris 23.0 47.0 \n", "1 Air France 10055 Madrid Milan NaN NaN \n", "2 British Airways 10065 London Stockholm 24.0 43.0 \n", "3 Air France 10075 Budapest Paris 13.0 NaN \n", "4 Swiss Air 10085 Brussels London 67.0 32.0 \n", "\n", " delay_3 \n", "0 NaN \n", "1 NaN \n", "2 87.0 \n", "3 NaN \n", "4 NaN " ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "delays = df['RecentDelays'].apply(pd.Series)\n", "delays.columns = ['delay_{}'.format(n) for n in range(1, len(delays.columns)+1)]\n", "df = df.drop('RecentDelays', axis=1).join(delays)\n", "df" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 层次化索引\n", "### 42. 用 letters = ['A', 'B', 'C']和 numbers = list(range(10))的组合作为系列随机值的层次化索引" ] }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "A 0 0.250785\n", " 1 0.146978\n", " 2 0.596062\n", " 3 0.064608\n", "B 0 0.709660\n", " 1 0.515778\n", " 2 0.483163\n", " 3 0.524490\n", "C 0 0.360434\n", " 1 0.987620\n", " 2 0.527151\n", " 3 0.636960\n", "dtype: float64" ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "letters = ['A', 'B', 'C']\n", "numbers = list(range(4))\n", "\n", "mi = pd.MultiIndex.from_product([letters, numbers])\n", "s = pd.Series(np.random.rand(12), index=mi)\n", "s" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 43. 检查s是否是字典顺序排序的" ] }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s.index.is_lexsorted()\n", "# 方法二\n", "# s.index.lexsort_depth == s.index.nlevels" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 44. 选择二级索引为1, 3的行" ] }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "A 1 0.146978\n", " 3 0.064608\n", "B 1 0.515778\n", " 3 0.524490\n", "C 1 0.987620\n", " 3 0.636960\n", "dtype: float64" ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s.loc[:, [1, 3]]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 45. 对s进行切片操作,取一级索引至B,二级索引从2开始到最后" ] }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "A 2 0.596062\n", " 3 0.064608\n", "B 2 0.483163\n", " 3 0.524490\n", "dtype: float64" ] }, "execution_count": 51, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s.loc[pd.IndexSlice[:'B', 2:]]\n", "# 方法二\n", "# s.loc[slice(None, 'B'), slice(2, None)]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 46. 计算每个一级索引的和(A, B, C每一个的和)" ] }, { "cell_type": "code", "execution_count": 52, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "A 1.058433\n", "B 2.233091\n", "C 2.512164\n", "dtype: float64" ] }, "execution_count": 52, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s.sum(level=0)\n", "#方法二\n", "#s.unstack().sum(axis=0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 47. 交换索引等级,新的Series是字典顺序吗?不是的话请排序" ] }, { "cell_type": "code", "execution_count": 53, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0 A 0.250785\n", "1 A 0.146978\n", "2 A 0.596062\n", "3 A 0.064608\n", "0 B 0.709660\n", "1 B 0.515778\n", "2 B 0.483163\n", "3 B 0.524490\n", "0 C 0.360434\n", "1 C 0.987620\n", "2 C 0.527151\n", "3 C 0.636960\n", "dtype: float64\n", "False\n", "0 A 0.250785\n", " B 0.709660\n", " C 0.360434\n", "1 A 0.146978\n", " B 0.515778\n", " C 0.987620\n", "2 A 0.596062\n", " B 0.483163\n", " C 0.527151\n", "3 A 0.064608\n", " B 0.524490\n", " C 0.636960\n", "dtype: float64\n" ] } ], "source": [ "new_s = s.swaplevel(0, 1)\n", "print(new_s)\n", "print(new_s.index.is_lexsorted())\n", "new_s = new_s.sort_index()\n", "print(new_s)" ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [], "source": [ "## 可视化\n", "import matplotlib.pyplot as plt\n", "df = pd.DataFrame({\"xs\": [1, 5, 2, 8, 1], \"ys\": [4, 2, 1, 9, 6]})\n", "plt.style.use('ggplot')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 48. 画出df的散点图" ] }, { "cell_type": "code", "execution_count": 55, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 55, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "df.plot.scatter(\"xs\", \"ys\", color = \"black\", marker = \"x\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 49. 可视化指定4维DataFrame" ] }, { "cell_type": "code", "execution_count": 56, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 56, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "df = pd.DataFrame({\n", " \"productivity\": [5, 2, 3, 1, 4, 5, 6, 7, 8, 3, 4, 8, 9],\n", " \"hours_in\": [1, 9, 6, 5, 3, 9, 2, 9, 1, 7, 4, 2, 2],\n", " \"happiness\": [2, 1, 3, 2, 3, 1, 2, 3, 1, 2, 2, 1, 3],\n", " \"caffienated\": [0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0]\n", "})\n", "\n", "df.plot.scatter(\n", " \"hours_in\", \"productivity\", s=df.happiness * 100, c=df.caffienated)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 50. 在同一个图中可视化2组数据,共用X轴,但y轴不同" ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(-1, 12)" ] }, "execution_count": 57, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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/jw33ngjd911F48++ig7duxg9erV2du1b9+e559/vtCff6DpZSVVJtlzKHmxashiWRauuyZcHv9wTvsf/GnevHn07t2bwYMHk5SUxN69e/n222+5/vrriY2NpWLFigwZMiR7+yFDhrBy5Urg8roO58+f55tvvmHs2LH06dOHKVOmcOzYsex9Bg0aRERERJGxtGnThvHjx7Ns2TIiIwv+TNuvXz9cLhetWrXi+PHjAHz11VcMGjQIl8tFnTp1uOGGGwrc99ixY8TGxuZ6Lue5Zdm1axeNGzemUaNGAAwdOjTX67169SIqKopatWoRFxeXHUdecXFxHDlypPCTDrBiVQ7GmN8D9+FM5rQNuBvn3tpFQC1gMzBKRHRujDDjVA1JXq8asjj9D5NxPzcZ97yZuMY/FnbrPxT1Cd8X1q9fz+eff867775LTEwMw4YNy55C+0q/51tuuYVnn32WU6dOsXXrVrp168aFCxeoVq1ark/NORX3dt0FCxawceNGVq1axcyZM7M/yedUsWLF7O9Leot+dHR09vmVNLacsqYih9zTkeeVlpZGdHR0iY/vT0W+y4wxDXEGTXQWkXZABDASZ/j1SyLSEjgF3OvLQFXwya4a4r1fNeRkNW6BZe6FbV9jr37HZ+2oy86ePUv16tWJiYlh165dbN68GYCOHTuyYcMGTp48SXp6Ou+99172PpUrV6ZDhw5MmzaN3r17ExERQdWqVUlISODdd98FnD/aP/xQ8BTtlStX5ty5c/med7vdJCUl0a1bNx577DFSUlKylxwtSpcuXXj//fdxu90cP36cDRs2FLhdy5Yt2bdvX5HHa968Ofv3789evjSrUipMQee1Z88eWrduXfQJBFBxP4JFAjHGmEigEnAY6Aks9bw+Hxh6hX1ViMquGgaP9EnVkJPVYwB0ugF7+XzsXUWO/Fdl1KNHDzIzM+nduzfPP/8811xzDQB169bl4YcfZsiQIYwcOZKrrroq135Dhgxh+fLluS7JzJ49m0WLFtG7d29uvvlmVq1aVWCbffr04aOPPqJPnz58+eWX2c9nZmYyYcIEevXqRd++fbn//vupXr16sc5j4MCB1K9fn549ezJlyhQ6duxItWr5p4bv1avXFRNHTjExMTzzzDPceeedDB06lLi4uAKPl1OtWrXo0qULPXv25KmnngKcyqxXr17FOodAKdYI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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "df = pd.DataFrame({\n", " \"revenue\": [57, 68, 63, 71, 72, 90, 80, 62, 59, 51, 47, 52],\n", " \"advertising\":\n", " [2.1, 1.9, 2.7, 3.0, 3.6, 3.2, 2.7, 2.4, 1.8, 1.6, 1.3, 1.9],\n", " \"month\":\n", " range(12)\n", "})\n", "\n", "ax = df.plot.bar(\"month\", \"revenue\", color=\"green\")\n", "df.plot.line(\"month\", \"advertising\", secondary_y=True, ax=ax)\n", "ax.set_xlim((-1, 12))" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.4" } }, "nbformat": 4, "nbformat_minor": 2 } ================================================ FILE: 3.pandas/4.Pandas50/README.md ================================================ # Pandas练习题50题 >作者:王大毛,和鲸社区 > >出处:https://www.kesci.com/home/project/5ddc974ef41512002cec1dca > >修改:黄海广 Pandas 是基于 NumPy 的一种数据处理工具,该工具为了解决数据分析任务而创建。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的函数和方法。 这些练习着重DataFrame和Series对象的基本操作,包括数据的索引、分组、统计和清洗。 ================================================ FILE: 3.pandas/README.md ================================================ # Pandas简介 Pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。你很快就会发现,它是使Python成为强大而高效的数据分析环境的重要因素之一。 ## 一、《十分钟搞定pandas》 **[10-Minutes-to-pandas](1.10-Minutes-to-pandas)**,这是十分钟搞定pandas [*10 minutes in pandas*](http://pandas.pydata.org/pandas-docs/stable/10min.html)的中文翻译。 ## 二、《pandas练习题》 **[Pandas_Exercises](2.Pandas_Exercises)**,这个是pandas的练习题。 ## 三、《pandas入门教程-2天学会pandas》 **[pandas_beginner](3.pandas_beginner)** - - ## 目录 - 0.导语 - 1.Series - 2.DataFrame 2.1 DataFrame的简单运用 - 3.pandas选择数据 3.1 实战筛选 3.2 筛选总结 - 4.Pandas设置值 4.1 创建数据 4.2 根据位置设置loc和iloc 4.3 根据条件设置 4.4 按行或列设置 4.5 添加Series序列(长度必须对齐) 4.6 设定某行某列为特定值 4.7 修改一整行数据 - 5.Pandas处理丢失数据 5.1 创建含NaN的矩阵 5.2 删除掉有NaN的行或列 5.3 替换NaN值为0或者其他 5.4 是否有缺失数据NaN - 6.Pandas导入导出 6.1 导入数据 6.2 导出数据 - 7.Pandas合并操作 7.1 Pandas合并concat 7.2.Pandas 合并 merge * 7.2.1 定义资料集并打印出 * 7.2.2 依据key column合并,并打印 * 7.2.3 两列合并 * 7.2.4 Indicator设置合并列名称 * 7.2.5 依据index合并 * 7.2.6 解决overlapping的问题 - 8.Pandas plot出图 - 9.学习来源 ## 四、《Pandas50题》 **[Pandas50](4.Pandas50)**,这个是pandas的练习题50题。 ================================================ FILE: 4.scipy/1.scipy-intro.ipynb ================================================ { "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import pylab as pl" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import matplotlib as mpl\n", "mpl.rcParams['font.sans-serif'] = ['SimHei']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# SciPy-数值计算库" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'1.0.0'" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import scipy\n", "scipy.__version__" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 常数和特殊函数" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "299792458.0\n", "6.62607004e-34\n" ] } ], "source": [ "from scipy import constants as C\n", "print (C.c) # 真空中的光速\n", "print (C.h) # 普朗克常数" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(9.10938356e-31, 'kg', 1.1e-38)" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "C.physical_constants[\"electron mass\"]" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1609.3439999999998\n", "0.0254\n", "0.001\n", "0.45359236999999997\n" ] } ], "source": [ "# 1英里等于多少米, 1英寸等于多少米, 1克等于多少千克, 1磅等于多少千克\n", "print(C.mile)\n", "print(C.inch)\n", "print(C.gram)\n", "print(C.pound)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "import scipy.special as S" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1.0\n", "0.0\n", "1e-20\n" ] } ], "source": [ "print (1 + 1e-20)\n", "print (np.log(1+1e-20))\n", "print (S.log1p(1e-20))" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[(200, 4), (200, 4), (200, 4), (200, 4)]\n" ] } ], "source": [ "m = np.linspace(0.1, 0.9, 4)\n", "u = np.linspace(-10, 10, 200)\n", "results = S.ellipj(u[:, None], m[None, :])\n", "\n", "print([y.shape for y in results])" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#%figonly=使用广播计算得到的`ellipj()`返回值\n", "fig, axes = pl.subplots(2, 2, figsize=(12, 4))\n", "labels = [\"$sn$\", \"$cn$\", \"$dn$\", \"$\\phi$\"]\n", "for ax, y, label in zip(axes.ravel(), results, labels):\n", " ax.plot(u, y)\n", " ax.set_ylabel(label)\n", " ax.margins(0, 0.1)\n", " \n", "axes[1, 1].legend([\"$m={:g}$\".format(m_) for m_ in m], loc=\"best\", ncol=2);" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.4" } }, "nbformat": 4, "nbformat_minor": 1 } ================================================ FILE: 4.scipy/10.scipy-spatial.ipynb ================================================ { "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "group_control": { "group": 0 } }, "outputs": [], "source": [ "import numpy as np\n", "import pylab as pl\n", "from scipy import spatial" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import matplotlib as mpl\n", "mpl.rcParams['font.sans-serif'] = ['SimHei']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 空间算法库-spatial" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 计算最近旁点" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "group_control": { "group": 0 } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.5244435681885733 0.4982156075770372\n" ] } ], "source": [ "x = np.sort(np.random.rand(100))\n", "idx = np.searchsorted(x, 0.5)\n", "print (x[idx], x[idx - 1]) #距离0.5最近的数是这两个数中的一个" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "group_control": { "group": 0 } }, "outputs": [], "source": [ "from scipy import spatial\n", "np.random.seed(42)\n", "N = 100\n", "points = np.random.uniform(-1, 1, (N, 2))\n", "kd = spatial.cKDTree(points)\n", "\n", "targets = np.array([(0, 0), (0.5, 0.5), (-0.5, 0.5), (0.5, -0.5), (-0.5, -0.5)])\n", "dist, idx = kd.query(targets, 3)\n" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "group_control": { "group": 0 } }, "outputs": [ { "data": { "text/plain": [ "array([list([48]), list([37, 78]), list([22, 79, 92]), list([6, 35, 58]),\n", " list([7, 42, 55, 83])], dtype=object)" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "r = 0.2\n", "idx2 = kd.query_ball_point(targets, r)\n", "idx2" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "group_control": { "group": 0 } }, "outputs": [ { "data": { "text/plain": [ "{(1, 46),\n", " (3, 21),\n", " (3, 82),\n", " (3, 95),\n", " (5, 16),\n", " (9, 30),\n", " (10, 87),\n", " (11, 42),\n", " (11, 97),\n", " (18, 41),\n", " (29, 74),\n", " (32, 51),\n", " (37, 78),\n", " (39, 61),\n", " (41, 61),\n", " (50, 84),\n", " (55, 83),\n", " (73, 81)}" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "idx3 = kd.query_pairs(0.1) - kd.query_pairs(0.08)\n", "idx3" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "group_control": { "group": 0 } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#%figonly=用cKDTree寻找近旁点\n", "x, y = points.T\n", "colors = \"r\", \"b\", \"g\", \"y\", \"k\"\n", "\n", "fig, (ax1, ax2, ax3) = pl.subplots(1, 3, figsize=(12, 4))\n", "\n", "for ax in ax1, ax2, ax3:\n", " ax.set_aspect(\"equal\")\n", " ax.plot(x, y, \"o\", markersize=4)\n", " \n", "for ax in ax1, ax2:\n", " for i in range(len(targets)):\n", " c = colors[i]\n", " tx, ty = targets[i]\n", " ax.plot([tx], [ty], \"*\", markersize=10, color=c)\n", "\n", "for i in range(len(targets)):\n", " nx, ny = points[idx[i]].T\n", " ax1.plot(nx, ny, \"o\", markersize=10, markerfacecolor=\"None\", \n", " markeredgecolor=colors[i], markeredgewidth=1)\n", " \n", " nx, ny = points[idx2[i]].T\n", " ax2.plot(nx, ny, \"o\", markersize=10, markerfacecolor=\"None\", \n", " markeredgecolor=colors[i], markeredgewidth=1)\n", " \n", " ax2.add_artist(pl.Circle(targets[i], r, fill=None, linestyle=\"dashed\"))\n", " \n", "for pidx1, pidx2 in idx3:\n", " sx, sy = points[pidx1]\n", " ex, ey = points[pidx2]\n", " ax3.plot([sx, ex], [sy, ey], \"r\", linewidth=2, alpha=0.6)\n", " \n", "ax1.set_xlabel(u\"搜索最近的3个近旁点\")\n", "ax2.set_xlabel(u\"搜索距离在0.2之内的所有近旁点\")\n", "ax3.set_xlabel(u\"搜索所有距离在0.08到0.1之间的点对\");" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "group_control": { "group": 0 } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(100, 100)\n", "(100, 5)\n" ] } ], "source": [ "from scipy.spatial import distance\n", "dist1 = distance.squareform(distance.pdist(points))\n", "dist2 = distance.cdist(points, targets)\n", "print(dist1.shape)\n", "print(dist2.shape)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "group_control": { "group": 0 } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0.15188266 0.09595807 0.05009422 0.11180181 0.19015485]\n", "[0.15188266 0.09595807 0.05009422 0.11180181 0.19015485]\n" ] } ], "source": [ "print (dist[:, 0]) # cKDTree.query()返回的与targets最近的距离\n", "print (np.min(dist2, axis=0))" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "group_control": { "group": 0 } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(22, 92) 0.005346210248158245\n" ] } ], "source": [ "dist1[np.diag_indices(len(points))] = np.inf\n", "nearest_pair = np.unravel_index(np.argmin(dist1), dist1.shape)\n", "print (nearest_pair, dist1[nearest_pair])" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "group_control": { "group": 0 } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[22 92] 0.005346210248158245\n" ] } ], "source": [ "dist, idx = kd.query(points, 2)\n", "print (idx[np.argmin(dist[:, 1])], np.min(dist[:, 1]))" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "group_control": { "group": 0 } }, "outputs": [], "source": [ "N = 1000000\n", "start = np.random.uniform(0, 100, N)\n", "span = np.random.uniform(0.01, 1, N)\n", "span = np.clip(span, 2, 100)\n", "end = start + span" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "group_control": { "group": 0 } }, "outputs": [], "source": [ "def naive_count_at(start, end, time):\n", " mask = (start < time) & (end > time)\n", " return np.sum(mask)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "group_control": { "group": 0 } }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAfsAAAFzCAYAAAA5aKBnAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzs3Xl8VNX9//HXISSQsIUQ1pCwEwg7IgJKRQQRBWsVS12Lyw+rtt9qW6u4tQoFBRVsLVSUKmpVcKmVTUBAcUFRBLeEsMkWdkLCkkBCcn5/JGD2ZTIzd+7M+/l4+HBy7yyfm4R87jnnc84x1lpEREQkeNVyOgARERHxLSV7ERGRIKdkLyIiEuSU7EVERIKckr2IiEiQU7IXEREJckr2IiIiQc5vyd4Y09wY83GJYwuMMb0LH4cXfv2pMeYWf8UlIiIS7PyS7I0xjYG5QL0ix64HtlprNxQe+h2wzlp7PjDGGNPAH7GJiIgEu9p++pw8YCzwPwBjTAzwFDDLGHORtXYVMAS4v/D5q4F+wKqib2KMGQ+MB6gbGXVOfPuOfgleJJDY/Hwa1A2nVi2NwomEmnXr1h2y1jat7uv8kuyttUcBjDFnDt0DvAk8B0wpbMXXA9IKz6cDzct4n9nAbIDO3XvZmfOX+TZwkQA1LKnUPw8RCQHGmB2evM6ppkEf4J/W2n3AfApa9ceByMLz9VHxoEiZ3nv9RWbOnOl0GCLiIk4l1C1A+8LH/YAdwDrggsJjvYDt/g9LJPB9tPQ95s+f73QYIuIi/hqzL2kq8IIx5kEgC7gKiAEWG2MGA0nAFw7FJiIiElT8muyttUMK/78HuKzE6WPGmOEUtO4fsdbm+TM2ERGRYOVUy75MhTcB6p8UERHxIhXBiYiIBLmAatmLSOWeeum/mnonItWilr2IiEiQU7IXcZk3X5zJk08+6XQYIuIiSvYiLvP5R8tZuHCh02GIiIso2YuIiAQ5JXsREZEgp2QvIiIS5DT1TsRl6tSpS2RkHafDEBEXUbIXcZnJz72uefYiUi3qxhcREQlySvYiLvPqrKeZOHGi02GIiIso2Yu4zPovPmbFihVOhyEiLqJkLyIiEuSU7EVERIKckr2IiEiQ09Q7EZdp2CiGJg01z15Eqk7JXsRl/vLMHM2zF0e9uz6NaUtT2ZORTavoSO4dkciVfeKcDksqoGQvIiJV9u76NCa88x3ZuXkApGVkM+Gd7wDKTfi6OXCexuxFXGbO9L8xYcIEp8OQEDVtaerZRH9Gdm4e05amlvn8MzcHaRnZWH66OXh3fZofopUz1LIXcZnkb75ib1SE02FIiNqTkV2t4xXdHJxp3avl73tq2YuISJW1io6s1vHKbg7U8vcPJXsREamye0ckEhkeVuxYZHgY945ILPP5ld0cVHdYQDyjZC8iIlV2ZZ84plzVg7joSAwQFx3JlKt6lNvtXtnNQXWHBcQzGrMXcZmmzVvRolFdp8MQL3LbmPWVfeKqHN+Z55V3fa2iI0krI7GX1yMgnjHWWqdj8Ejn7r3szPnLnA5DxBGaZx88Sk5lg4KWb0Wt5WAS6tdfXcaYddbaftV9nbrxRUQcFOpj1tUdFhDP+K0b3xjTHHjLWju4yLHuwHRr7XBjTDjwDhADzLHW/ttfsYm4ycwpD7OwSRQzZsxwOhSpgTNd92V1YUNojVlXZ1hAPOOXlr0xpjEwF6hX5JgBngbCCw/9DlhnrT0fGGOMaeCP2ETcZmvq92zYsMHpMKQGik43K4/GrMWb/NWNnweMBY4WOXYzsKrI10OA+YWPVwOlxiSMMeONMV8ZY77KTE/3UagiIr5VVtd9URVNZRPxhF+SvbX2qLU288zXxpgmwA3Ak0WeVg84s4pCOlCqAslaO9ta289a269RTIwvQxYR8ZmKuug1Zi2+4NTUu8eBCdba3ILefACOA5FAJlC/8GsRkaBT3nSzuOhIPr1/qAMRSbBzqhr/QuAJY8yHQG9jzCRgHXBB4flewHZnQhMJbK3bdKBz585OhyE1UN1V6ERqypGWvbX27F8qY8yH1tqHjDFtgMXGmMFAEvCFE7GJBLp7Hn1S8+xdrrKFZkS8za/J3lo7pLxj1todxpjhFLTuH7HWll+9IiLick5ON3Pbin1ScwG1XK61dg8/VeSLSBmm/+VPzG8cyezZs50ORVyo5Ip1Z3aZA7ya8HVDEVi0gp6Iy+zesZVNmzY5HYa4lD9W7NO2tYFHyV5EJIT4Y5e5UF8COBAp2YuIhJDK9pf3Bm1bG3iU7EVEQog/pv3544ZCqkfJXsRlOiR2p3fv3k6HIS7lj13mtI5A4NF+9iIupHn2EuhUje8bnu5nH1BT70REJDho29rAomQv4jKP33cXLzWqy6uvvup0KBJC1FJ3NyV7EZc5uH8Pp49FOB2GuFh1E7e/FuIR31GyFxFxIU9b2p4k7ormzSvZu4Oq8UVEXKYmK9R5suCN5s27n5K9iIjL1GSFOk8St+bNu5+SvYjLJPXqx8CBA50OQxxUk5a2J4lb8+bdT8lexGVuvedBpkyZ4nQY4qCatLQ9Sdz+WIhHfEsFeiIiRbhhitm9IxKLFdlB1VvaZ66luteoefPuphX0RFzm0d/fSrOGdXj77bedDiXolKxUh4Ik6nQrtqwbEKh+wvZ2DEr+/qcV9ERCxNHMdMJyNc/eFwJxill5U+WmXNWDT+8f6mgMoHn2bqExexGRQoE4xSwQ9oYPhBikZtSyFxEp1Co6krQyEruTU8xqcgPira73QLwJkupRy15EpFAgTjHztPK+JgvveCsGCRxK9iIu0+e8wVx88cVOhxGUAnGKmac3IN7seg/EmyCpHnXji7jMDXf8QfvZ+1CgTTHzdKqcN7vePY1BAoeSvYhIgPPkBqRRZDgZ2bmljnva9R5oN0FSPerGF3GZB26/lpEjRzodhgSwd9encSLndKnj4bWMut5DlFr2Ii5z6tRJssPynQ5DAti0pank5pVeMK1+3do+a51r0Z3ApmQvIhJkyhuXz8gq3a3vDVp0J/CpG19EJMhUNFXu3fVpnP/4Strdv4jzH1/p0VS8krToTuDzW7I3xjQ3xnxc+DjBGPOhMWalMWa2KRBujFlgjPnUGHOLv+ISEQk25U2Vu6hLU6/NvS9Ki+4EPr8ke2NMY2AuUK/w0O3AHdbaoUA80AP4HbDOWns+MMYY08AfsYm4zYALhzNq1Cinw5AAUrK1DpS5XsCqjQd90gLXoju+l3M6n7mfbff49f4as88DxgL/A7DWPljkXBPgEDAEuL/w2GqgH7Cq6JsYY8YD4wGatWzt04BFAtU1N9+pefZyVnU2yrln3oYy36OmLfCabLkrFbPWsiLlAH9bnMKPh054/D5+adlba49aazNLHjfGjAV+sNbuoaDVf6YvKR0o9dfMWjvbWtvPWtuvUUyMT2MWEXGD6oyXl9fSrmVMjcbwA3HlwWCQsvcoN8z5gtte/opaBl4cd67H7+VYNb4xpj3wJ2BY4aHjQCSQCdQv/FpESvjjuF/QOCqCDz/80OlQJABUZ7y8rBY4QJ4tmKZXkyp6LbrjPYeOn+KpZZuY9+VOGkaG8+gV3bjuvATCwzxvnzuS7AvH8F8HbinS4l8HXAC8BfQCPnciNhERN6nOTn0ll72tZczZRH/GmV4BJW7/O3U6jxc/3c6zK7dwMjePcYPa8fuLO9EoKrzG7+1Uy/5+IAH4hzEG4C8UFPAtNsYMBpKALxyKTUTENao7Xl60Bd7u/kVlPkdV9P5lreX97/cxZclGdqZnMaxrMyZc1pUOTet77TP8muyttUMK/38fcF/J88aY4RS07h+x1uaVPC8iztIqaYGnJpvUVKdXQHzj+7RMHluYzNof00ls3oBXbz2PCzrFev1zAmoFvcJCvflOxyEipWmVtMDl6Xi5quids//oSaYtTeXtr3cTExXB337RnbH94qldg3H5igRUsheRyl044gq6tGzo98+tqOpbyd6dtHWt/53MzeP51duY9dFWTudZxv+sPXdd1JGGdWs+Ll8RJXsRl7ni2psdmWevVdKCk6ro/cNay3vf7GHq+6mkZWQzsnsL7h/ZhTZN6lX+Yi9QshdxmZPZWWRlZREVFeXXz9X4rn+pPiJ4rN95hIkLk/l6ZwbdWjXkqV/2YkD7Jn6NQclexGUevON6R+bZa3zXf1QfERz2ZGQz9f2NvLthD00b1GHqmJ5c3bc1YbWM32NRsheRKgn28V1ftKQ9fU/VR7hbVs5p/vXRNmav3oq18NuLOnLHkA7Uq+NcylWyF5EqC9bxXV+0pGvynqqPcKf8fMs769OYtnQj+4+eYnSvVtx3aSKtG/t3yK0sSvYiEvJ80ZKu7D0ravWrPsJ9vtyezsSFyXy7O5Ne8dHMvL4v57QJnD1clOxFJOT5oiVd0XtW1upXfYR77ErP4vElG1n03V5aNKzLjLG9uaJXK2o5MC5fESV7EZe55Odj6RbXyK+fGeyV4b5oSVf0npW1+oO9PiIYHDuZy8wPtzLnkx8JM4Z7hnVm/M/aExkR5nRoZTK2xCYIbtG5ey87c/4yp8MQcYQ/59mXbIVCQSvTTVuYVnazUt41Xn1OHKs2HvQo4Vb0fbtn3gbK+strgB8fv9zTyxQ/yMu3vPnVLp5ctolDx09xVd84/jyiCy0a1fXL5xtj1llr+1X3dWrZi7hM5pHDHDoURmys99fPLovbK8OrUihXVkv6oi5NeXtdmsdFexW1zqctTdWYvAt9tvUQExemkLL3KP3aNGbOr/vRKz7a6bCqRMlexGUeu+c2v86zd3tleFVvVkrONDj/8ZVlvu6v7/1Q5Zuc8mYvaEzeXX48dILJi1NYnryfuOhInr2uD5f3aEnhrq2uoGQvIhVye2W4pzcr5Z3PyM7l3fVpNerV0Ji8O2Rm5/KPFZuZu2Y7EWG1uHdEIrde0I664YE5Ll8RJXsRqZDbW6Ge3qyU9zrAK0MYwbpmQTA4nZfP62t3Mv2DzRzJyuGX58TzxxGdadbAP+PyvqBkLyIVcnsr1NOblXtHJHL3vA1lnqvKEEawz2AIVh9tOsikhclsPnCcAe1jeHhUEt1a+Xf2iy8o2YtIpdzcCvX0ZuXKPnE8uuAHjmTlljpXWa+A1rZ3ny0HjvG3RSmsSj1ImyZRPHfjOVyS1NxV4/IVUbIXcZnRY39Nj9buqACuLl+1hj29WfnL6G4e9Qq4fQZDKDlyIodnVmzmlc93EBURxoOXdeWmQW2oU9t94/IVUbIXcZkhI690ZD97XwvE1rCnvQJun8EQCnJO5/PK5zv4+4rNHDuZy3XnJXDPsM40qV/H6dB8QslexGUO7E1jV4Mc4uPjnQ7FqwK1NexJr4DbZzAEM2stKzce4G+LUth26ASDO8Xy0OVJJLZo4HRoPlXL6QBEpHqemPBbbrzxRqfD8Lpgag3fOyKRyBLTs9w0gyFYbdx3lBvnrOXWuV+BgRfHncvLt/QP+kQPatmLSIDwV2vYH1Xybp/BEGwOHT/F08s38cbanTSoG85fRydx/YA2hIeFTntXyV5EAoI/5vP7sy7AzTMYgsWp03m89Ol2nl25hezcPH49qC2/v7gT0VERTofmd0r2IhIQ/NEaDtS6APEuay1Lf9jH5MUb2ZmexcVdmvHA5V3p0LS+06E5RsleRAKGr1vDwVQXIGX7Pi2TiQuT+eLHdBKbN+CVW/szuFNTp8NynJK9iMuM+fUd9E5wbp69UyvDeeNzVSUfvA4cPcm0pam89fVuGkdFMOnK7vzq3Hhqh9C4fEWU7EVcZuBFlzg2z96pufDe+lwn1/nX8rm+cTI3jzmf/Mg/V20hNy+f8YPbc9fQjjSsG+50aAFFyV7EZXb9uIXUsAwSE/0/jcupMe+/vveDVz7XqSr5QFwwyO2stSz4di9PLNlIWkY2I7o1Z8LIrrSNred0aAHJb8neGNMceMtaO9gYEw68A8QAc6y1/y7rmL9iE3GTGY/ey1w/7mdflBNj3u+uTyMju/T69J5+rhNV8ioM9K4NuzKYuDCZdTuOkNSyIU9e04uBHZo4HVZA88tghjGmMTAXOHPL9TtgnbX2fGCMMaZBOcdEJICUN7btyzHvaUtTyz3nlrF2FQZ6x97MbO6Zt4Er//kpO9OzmHp1Txb87gIl+irwV8s+DxgL/K/w6yHA/YWPVwP9yjm2yk/xiUgVODHmXVFCrOxzA2WcXIWBNZOVc5rnPtrGc6u3km/hros6cMeQjtSvo5HoqvLLd8paexQoulVgPSCt8HE60LycY8UYY8YD4wGatWztu4BFpEy+GvOuKCmXlygbR4VX+LmBNE7uZGGgm+XnW97dkMbU91PZd/Qko3q25L5LuxAfE+V0aK7j1G3RcSASyATqF35d1rFirLWzgdkAnbv3sv4KVkR+4u0x78qScnmJ8i+ju1X4voE0Tq7lc6vvq+3pPLYwmW93Z9KrdSOeva4P/drGOB2WazmV7NcBFwBvAb2Az8s5JiIlXH/7PfRt09jpMLymsqRcnURZtIegvNaAU+PkWj63analZ/H4+xtZ9O1eWjSsy/Sxvfh5rzhq1TKVv1jK5VSynwssNsYMBpKALyjowi95TERK6DvwZz6ZZ+/U+HZViteqkihL9hCUR+Pkgen4qdPMXLWFFz75kVoGfn9xJ26/sD1RERqX9wa/fhettUMK/7/DGDOcgpb8I9baPKCsYyJSwpaU74nN2Uvv3r299p5Ojm97q3itrB6CkjROHnjy8i1vrdvFtKWbOHT8FFf1iePeSxNp2Ug3Zd7k2C2TtXYPML+yYyJS3KwnHuYNL8+zd3J821vFaxV1zxvQOHkAWrP1MBMXJpO89yjntGnMC7/uR+9455aCDmbqHxERR+eBe6t4rbwegrjoSD69f6hXYhXv2H7oBJMXp7AseT9x0ZH849o+jOrZsuiMLfEyJXsRcXweuDeK1zS9LfAdPZnLsyu38OKnPxIRVot7RyRy6wXtqBse5nRoQU/JXkSCIlFqelvgOp2Xz+tf7mL68k0cycrhmnNa86dLEmnWsK7ToYUMJXsRn7EUjBaX93Xg8CRRBsrqdEVpelvgWb3pIJMWJbNp/3HOaxfDw6OS6B7XyOmwQo6SvYgvvP4ae/ccZnqbn5GelUtMVDj37FhNy1ZN4NrravTWt/z+Ac5t5/3FRaqTKANpdToJTFsOHGfy4hRWbjxAQkwU/7rhHEZ0a65xeYco2Yt4nWXvnsO0/Gg5wztmMq/XCIZ/toCWW9ay98LhtKxhC79bn3MZ5NB+9meUV73/6IIfAq61L/6VkZXDjA828+rnO4gMD+OBy7rw60FtqVNb4/JOUrIX8TrD9DY/Y3jHTIZvWcvwLWsBWN6xP8vb/IypNezK/2H9l0RlxDBo0CBvBOuR8qr0j2TlciSrYDtatfZDS25ePq9+voMZH2zm2Mlcru2fwD3DOxNbv47ToQlK9iI+kZ6VW9CiL0z0APN6jYCssvdlr45/PzOZ/zq0n/0Z5VXvl6Q924OftZZVqQeYtCiFbQdPMLhTLA9e3pUuLRo6HZoUoWQv4gMxUeEM/2xBsWNjv1nK8kGjHYrIu8qq3i9PWkY2be9fRJgx5FlLnLr3g0bqvmNMWpTMx5sP0T62Hv8e14+LEptpXD4AKdmLeJ0tKMbbspblHfszr9cIxn6zlOFb1hZWIfckUKvyq6qs6v0Tp06TkV1+z0WeLdiaRt377nf4+CmeXr6J19fupEHdcB4ZlcSNA9sQHlbL6dCkHEr2Il5naNmqCXsvHM7yNj+DrFyWDxpN97hGBdX4Lkz05U2zK5qsq7oRDah7361Onc5j7mfb+ceKLWTl5nHTwLbcPawT0VERTocmlVCyF/GFa6+jJbZEMZ47W/RVnWZXsrVf3hazZzi11axUn7WWpT/sZ8qSFHYczmJol2Y8cFlXOjar73RoUkVK9iI+UzKxeyfR33HfRAZ0aFLquK8WuanOJjlFW/vnP76ywiI+bTXrDt+nZTJpUTKfb0unc/P6vHxLf37WuanTYUk1KdmLuEzHrt3pXWKevS8XufF0k5yKivjcthRvKDpw7CRPLk3lzXW7aRwVwcQru3PtufHU1ri8KynZi7jM12tWw57GDBs27OwxX25R6+kmOUW79dMyslWN7xInc/OY88mPzFy1hZy8fG67oB2/HdqJRpHhTocmNaBkL+Iy/3luOoujIoole19uUVuTTXK0Vr17WGtZ+O1eHl+ykbSMbC5Jas4Dl3WlbWw9p0MTL1CyFwkCVW19ezKur93kgt83uzKYuDCZr3YcoWvLhky7pieDOsQ6HZZ4kZK9uJB7dpPzl6q0visb16/oRkAt9OC0NzObae+n8s76NGLr1+GJq3sw5px4wmqF9r+nYKRkL+7iw93k3Kwqre+KxvUB7WIXQrJyTjN79Tb+9dFW8i3cOaQDd17Ukfp1lBKClX6y4iK+3E3O/b0FlbW+KxrX92WBnwSO/HzL/75J44klqew7epLLe7bk/ku7EB8T5XRo4mNK9uIiPtpNzmW9BXf/ZRqDOlZ/PLWicX1fFvhVha/WCJCfrNuRzmMLkvlmdyY9WzfiH9f14dy2MU6HJX6iCZPiKmd2kytqXq8RpHu8m1yR3oLPFoC1Bb0FHy1n757DUOk6cP4X364jiYnVn6N+74hEIsOL7yl+Zly/vGl0/lj45kwtQVrhqntnhhDeXZ/m888OBbuPZPHb177m6llr2Hf0JE9d04t37zxfiT7EqGUvruL93eR8u/e8L6xZtYzsrdGMHl29a65sXN/T6XU1VdMhBPUKlO34qdPM+nALz3/8I7UM/N/FnfjNhe2JitCf/VCkn7q4iG92k/Pl3vNlq1l9wFtzZ7EiKqLayR7KH9f3xvQ6T5NueUvqVrTUbtHPVGFhcXn5lrfX7WbaslQOHjvFlb1b8edLu2h54hCnZC8u4pvd5Py693wA1wfUZHpdTZLumZX1yjpeGRUWFvf5tsNMXJjMD3uO0jchmtk3nkOfhMZOhyUBQMle3MXru8n5c+95X84mcFZNkm5Zib6i40U5XVgYKHYcPsGUxRt5/4d9xEVH8vdr+zC6Z0tMFW6YJDQo2YsLeXM3OV/vPV80gRumJwx2VX1AVdUk6caVM0sgrgrdzp6u2x8sjp7M5Z8rt/Dip9upHWb40yWduW1we+qWKMQUUbIX8dXe8yW77CNrM3zNQrLD6xZ7mm/rA/yjJkm3Jmvv1+S1bnY6L583vtzF9OWbSM/KYUzf1tw7IpFmDetW/mIJSY4ke2NMY+A/QDNgnbX2dmPMHCAJWGStneREXBLKvL33fPEu++zwOvTeu5mEjH3sjG5R7JnVrQ+4b8qzDA6w/cRrulkOeFYcGIrr9n+8+SCTFqaQuv8Y/dvFMHdUUuGQk0j5nGrZ3wj8x1r7H2PMa8aYPwNh1tqBxph/G2M6WWs3OxSbiBcUn9J3xrE6UWcT/pn/V7c+oFnLOOLjm1f6PH+qadKtSXFgqKzbv/XgcSYvSmHFxgPEx0Tyrxv6MqJbC43LS5U4lewPA92NMdFAPJAJzC88twy4ACiV7I0x44HxAM1atvZPpCIeKmtKX4NTWQAkZOxjecf+vNlrBI8e+rxa9QEfLnmXw99FM3bsWF+E7bFQSbr+lpGVwzMrNvPKmh3UDQ9jwsgujDu/LXVqa1xeqs6pZP8JcDnwf0AKEAGcWS4rHehb1oustbOB2QCdu/cKvKXNRIooa0pfUfN6jQBjaPmHu8AUXcyy4qr8BfPm8klURMAle/Gu3Lx8/vP5Dmas2MzR7Fx+1T+BPwzvTGz9Ok6HJi7kVLL/C/Aba+1RY8wfgL8Bzxeeq4+W8RXXKzGlr+clPLLyBRIy9p19xthvlkJUPfY+vSYg592LM6y1fJh6kEmLktl68AQXdIzloVFd6dKiodOhiYs5lewbAz2MMZ8D5wGPU9B1/znQC0h1KC4JGk7vYldkSl/CYMauWXh2jH5Dy85E5p5k+Ja1pDePI+bbtKCbdy+e2bT/GBMXJvPx5kO0j63HnF/3Y2iXZhqXlxpzKtlPAV4E2gBrgOnAx8aYVsBIYIBDcUkwKGPK2z07Py7SWvZTEi06pe90MnvjGvFswmDSs08TExVO97hGfH/kNDSIC7p591I9h4+fYvoHm3jti53Ur1Obh0clceOANkTUVieneIcjyd5auxboVvSYMWYIMByYaq3NdCIuCQYlp7zVpffeTbQsLIhbXntDicTva4UJu5y5/A+/vK5gpz2/rcsvgSTndD5zP9vO31duJisnj5sGtuX3F3eicb0Ip0OTIBMwi+pYa4/wU0W+iIcM3x85TW7hlLYzjtWJIrt2HYavWehgN/mZzzrzucajdfkfmf4CFyY281mU4nvWWpYl72fK4hS2H87iosSmPHh5Vzo2a+B0aBKkAibZi3iuaNK2cOJEsUI4KJjydsXGjwF/d5OXuKF47TX27i0cYjiRww3fL2fIlrVsi2nF5IturdK6/I0aNyE2NtYPsYsv/LAnk0kLU1iz7TCdmtVn7i39uTDAFkmS4KNkL+5Wxi5yww1k1qlHo1MnynyJ37rJy6gduH/Vx7Tc/1NBXsLBnQDsbBoPUKV1+Zf+9w12r23EuHHjyjyv/d0D04FjJ3l62SbmfbWL6MhwJv68G9f2T6B2mMblxfeU7MXFyt5Frmj3fVl8tn1tZbGtWUjM/rSzq+adLcjr0J/l543ihTG9Cl9b8Up6y/43jy+jIspM9trfPfCczM1jzic/MnPVFnLy8rn1/Hb87uJONIoMdzo0CSFK9uJixZekPZM8t8W0onZeHgmZ+88+81idKFa1O4fI06d8tH1t1WI7M+f+hXd+2v5hXu+SPQ2ex6T93QOHtZbF3+1jypIUdh/JZnhScx64rCvtYus5HZqEIPUfiaudWZK2qK2NW5OQuZ/lHfvzXtefsTO6BQ1OZRF5+hTLB44qKM7zyva11Y9tXs9LGPvtsmLHxn6zlJgo77TytL97YPh2dwa/fG4Nd732NfXr1Oa1287j+Zv6KdGLY9SyF1crq5q9w5HdfJh4HsvPG0V6Vi6f9BvGPTs/ZnirJgy/pjcF6zb5vjivrNjOrKK3vGMbnfTHAAAgAElEQVR/5vUaUaWCvOoI9f3dnbYv8yRTl27kna/TiK0fweNX9eCafvGE1dKaCeKsCpO9MSahvHPW2p3eD0ekOkosSVskeUb26MaQMUWTZ9EE758q/PJiS28ex/KBoyD7dJUK8qojVPd3d1p2Th6zV2/jXx9tJS/f8psLO3DXRR1oUFfj8hIYKmvZP1r4/65AA+AboAdwCujnw7hEqqDIkrRtfgZZuRUkT3+3rCqIrWUTpl7Tu8hzq9ei/9us/zC0a9lb3Ibi/u5Oys+3vPfNHp54fyN7M09yeY+W3D+yC/ExUU6HJlKMsbbyzeOMMcuBEdbafGNMGLDMWnuxz6OrQOfuvezM+csqf6KEAKfXwa+Ib2IblhRY+9mHonU7jvDYwmS+2ZVBj7hGPDwqif7tYpwOS4KcMWadtbbaje2qjtlHAZcbY76lYJlb3bZKACmZPAMl0YMvYnvv9RfZ1LIhd955Z43fS6pv95Esnng/lQXf7KFZgzo8eU0vruoTRy2Ny0sAq2qyvx74M3AnsAO4wWcRSQgI5JZ44Pto6Xt8GxWhZO9nJ06dZtaHW3n+420A/N/Qjtx+YQfq1VGdswS+qv6W7gVeAc7szhAHbPVJRBLcyljxrmr7t+sG4Yyj2afZfiiLdvcv0pi8H+TnW976ejfTlqZy8Ngpft67FX++tAtxmuEgLlLVZL8C2AjspOAvrAVW+yooCVZlr3hX6cY0Ht8gBJ/Ptx1m/9GT5FuLRSvk+doX2w4zcVEy36cdpU9CNM/deA59Exo7HZZItVU12edba2/zaSQSAspfVa78jWk8vEEol7t7CN5Zn0Z+iaJarZDnfTsPZzFlSQpLvt9Hq0Z1eeZXvbmiVyuMcc/vikhRVU32y40xjwNzgROgefbimTOrylV9/3ZPbhDKUaMegsC4SUg/kVPmca2Q5x1HT+byz5VbePHT7dQOM/xxeGduG9yeyIgwp0MTqZHKFtXpaa39FmhPwdK6fy489UtA6z5KtXmyf3v1bxDKUoMeAq8MI3jnZiGmXgRc93ip41ohr2by8i1vfLmTp5dt4vCJHMac05p7RyTSvGFdp0MT8YrKWvYzgKHW2puNMSuttUMBjDFtfR2YBKPyV5WraLnYqt0gVJZMPe0h8MIwghdrDq7qE8fLa3aQk5d/9phWyKuZTzYfYtKiZDbuO0b/tjG8dHMSPVo3cjosEa/ydM5I5SvxiJRSnRXvzqjCDcLrr1cpmXrWQ1DTYQTv1hwMaN+ET955kY37jmF6jlY1fg1sO3icyYtT+CDlAPExkcy6vi+Xdm+hcXkJSpUl+xbGmOso+GtU9LGW73JUYIwfe+Ta62iJLZEkK1outrIbBKqcTD0ZQoCq3iSU9zOp+c1Cyffd+/2ntI2K4MPH/1XJa6UsmVm5PLNiMy+v2U7d8DDuH9mFcYPaUjdc4/ISvCpL9vOATmU8nu+ziKRiQTENrZqrylVyg1C1ZOrZEAJU4Sahkp+JxzUH5bwv+w9Au9YVv1ZKyc3L57UvdjL9g00czc5l7LkJ/GF4Z5o2qON0aCI+V2Gyt9Y+WtF58TdvT0Nzk/JvEKqWTD0ZQoBKbxJsj0p/Jp71KJT/s87JqU5hogCsSj3ApIXJbD14gvM7NuGhy5Po2rKh02GJ+I3WeXQVL05DCyJVTqbVGkL4qRu+Zasm7P3ZMJa3vbD0TYKpVcnPBA97FMr/We9OXa1xtCratP8YkxalsHrTQdrF1uP5m/oxrGszjctLyFGydxnvTEMLNDWpQahu93wVhhBKdZ934x6zmqm5P8BNZ4ZKfnrfin8mnvYolP++pzetITJSU+0qkn4ih+nLN/Ha2p3Uiwjjocu7ctPAtkTUruV0aCKOULJ3GU+LzAJWjWsQPE+mZavqUMlP71vpz6TaRYmVvO+4ySx55JJqXldoyDmdz8trtvPMis1k5eRx/XkJ3D2sc8H6BCIhTMneVTwvMgtMXqpB8DCZlq26QyVV/ZlUd6vbymoFhoO6os+y1rI8eT+TF6ew/XAWF3ZuykOXd6VT8wZOhyYSEJTsXcXbrVhv8qQr3ps1CN7bN756QyW++pmU/74rtq5j+6RJPPzwwx6+d3BJ3nOUSYuS+WzrYTo2q8+LN5/LRYnNnA5LJKAo2buNV1uxXlKDrvhArEGo9lCJr34m5bzv+nFXsX3FipBP9gePneLp5am88eUuoiPDeezn3bi2fwLhYRqXFynJ8WRvjJkJLLHWLjDGzAGSgEXW2kkOhxbAvNeKrbmadcX7rgbB06I/T4dKfPUzCaSfdWA4mZvHi59u55+rtnAyN49bzm/H/w3tRKOocKdDEwlYjiZ7Y8xgoEVhor8KCLPWDjTG/NsY08lau9nJ+KQqatIV76MahBoV/QXyUElos9ay5Pt9TF6cwu4j2Qzr2pwHLutC+6b1nQ5NJOA5luyNMeHA88BiY8zPgSH8tDLfMuACYHOJ14wHxgM0a6kVxAKF513xvkisVelpgApb/YE4VBLivtudycSFyazdnk6XFg34z23ncX7HWKfDEnENJ1v2NwHJwFTgd8BdwJzCc+lA35IvsNbOBmYDdO7eS5vxBIgadcXXOLGW7p6vsKehipvmBHL3ecNGMTRpGBpLvO4/epKp76fy9te7aVIvgsm/6MHYc+MJqxU4Pw8RN3Ay2fcBZltr9xljXgUGAWdWCqkPqMrGFbzRFe9hYi2nu/6Cg6fK7mk4kcPeQ+5fbvgvz8xhWFJwr6GXnZPH8x9vY9aHW8nLt9x+YXvuuqgjDetqXF7EE04m+y1A+8LH/YC2FHTdfw70AlKdCUuqx6kx7vK76xsmDmDshqXFnn2mp2F6PS03HMistbz3zR4eX7KRvZknuaxHC+6/tCsJTaKcDk3E1ZxM9nOAfxtjfgWEUzBm/54xphUwEhjgYGxSHY6McZdfGBiOZfjWsnsaHo4dEHBT/aprzvS/sSK2HlOmTHE6FK/6eucRHluQzIZdGXSPa8iMsb05r30Tp8MSCQqOJXtr7THgmqLHjDFDgOHAVGttphNxiaf8P8ZdXmHgFSkfldvTEBMewfBPS9QXbFjK8vPds9xw8jdfsTcqeJZ/TcvI5oklG3nvmz00a1CHaWN6cnXf1tTSuLyI1zg+z74oa+0RfqrIF6lQRYWBV4zpWUZPAzz8u3tosGMbyzv0Z17vEYzdsJThW9cy4PQhGDMdN4zZB4sTp07zr4+2Mnv1NgB+N7Qjv7mwA/XqBNSfJZGgoH9V4lJVKQwsygC2+JdF/y9+k59vefvr3UxbmsqBY6e4olcr7hvZhbho7eQn4itK9hKAqrL6nSeFgYaJF97M8M8WlC7QGzRaBXp+sPbHdCYuTOa7tEx6x0cz64ZzOKdNY6fDEgl6SvZBr6zESRnHAiTRVWf1Ow8KAwNxLf7qatq8FS0a1XU6jGrZlZ7FlCUpLP5uHy0b1eWZX/VmdM9WGpcX8RMl+2BWRuJ8+KMXAZh44c0e7h/vS56ss1+9wkDfrcXvP/c/8U/XzLM/djKXZ1dt4cVPthNWy/CH4Z35f4PbExkR5nRoIiFFyT5olZ04G+woKIYa/ukC5vUuL5k61dL35pa3ZfHRWvxSSl6+Zf5Xu3hqWSqHjudwdd/W3Dsi0XU9EiLBQsk+aJWfOLEwfOtahm8tOLYzugWTYgeQ//I6x1v6vu1mD45NbmZOeZiFTaKYMWOG06GU6dMth5i4MJmN+45xbtvG/HvcufRsHe10WCIhTck+iJWbOOFsogdIyNjHNd8sDYjlY33ezR4Em9xsTf2e9ACcZ//joRP8bVEKH6Tsp3XjSGZe35eR3VtgjHu+tyLBSsk+iJWXOCmxhdDO6BZ+Xj62vGp7f3WzB+4mN26UmZXL31du5uU126lTO4w/X5rILee3o264xuVFAoWSfdAqP3ECPy0qU+TYGT6tTq+k2j4YutlDxem8fF5bu5PpyzeRkZ3Lr86N5w/DE2naIDR25BNxEyX7oFX2+PSA3EMABcvDZuXyZq8RJB7aSULGvrOv9F11eomiwZ6XFB82sPlldLNbirfoA2iaYAj7MPUAkxalsOXAcQa2b8LDo5JIatXQ6bBEpBxK9sGsrPHpMdMBCo9Z9j71LC0z9vmpOr38osE3Ywfw6NP/LF4YWJ059yGkdZsOxDV2ZrW5zfuPMWlRCh9tOkjbJlHMvvEchic117i8SIBTsg96FY1P+786PT0rt6BFX7RosOcljP1maYnCQDyYcx8a7nn0Sb/Ps08/kcOMDzbxny92EhURxkOXd+WmgW2JqF3Lr3GIiGeU7EOdn6vTyyoafOGdSUDpwkDfzrmXqsg5nc/La7bz9xWbOZGTx3X9E7hneGdi6gXebAARKZ9uywX/VacXFA0OLywavO2qh4qdndfzEtKLFAaemTpY0XNKTS0IAdP/8ifGjx/v08+w1rI8eT8jZqxm0qIUeic0ZsnvBzPxyu5K9CIupJa9+NFPwwZvxg4omAZYxNhvlxUrDCyrF+CRlS8w6eL/x20vfxWyY/i7d2zlxEHfJdyUvUeZtCiZT7ccpkPTerx487lclNjMZ58nIr6nZC/+de11tLT5BcV4Z6YF9ryEsd8uK7U9bbGpgz0v4ZGVL5CQsY+HVjzPY0Nv0xi+lx08doqnl6cy78tdNIwM59ErunHdeQmEh6kDUMTtlOyDRlW2hQ0QplaVCgNLPmfSxf+Ph1Y8T0LGvnLH+aX6Tp3O48VPt/Psyi2czM1j3KB2/N/FHYkOwFX6RMQzSvbBwI1T1Apb+FNNkVaj7QFFvy5RPHjby1/x2NDbziZ6cN/2tIHEWsuS7/cxZUkKu9KzGda1GRMu60qHpvWdDk1EvEzJ3vU82RY2AFT5BuWn2INhe1pv6JDYnYQmUTV6j+92ZzJxYTJrt6eT2LwBr956Hhd0ivVShCISaJTsXc/X28L6gic3KNqe9ow7J0z0eJ79/qMnmbY0lbe/3k1MVAR/+0V3xvaLp7bG5UWCmpJ9EPDttrC+4MkNSnBsT+uUk7l5PL96G7M+2srpPMv4we25a2hHGtYNdzo0EfEDJfsgULPubX8V9hV/3/QTOdW/QQmC7Wm94fH77uKlRnV59dVXK32utZb3vtnDE0s2sifzJJd2a8GEy7rQpkk9P0QqIoFCyd71atC97a/CvjI+54bvl5NwcGexp1XtBkXb0x7cv4fTxyqvlP965xEmLkxm/c4MurVqyNNjezOgfRM/RCgigUbJ3vU87d72V2Ff2Z8zpJytdkNt/N0X9mRk88T7G/nfhj00bVCHqWN6cnXf1oTV0vdUJFQp2QcDj7q3C8bNfxPzQ6lx8/B9R2n5+uteat2XPT6/LaYVO5vGs/y8URp/95ITp07z3Edbmf3xNqyF317Ukd8M6UD9OvpnLhLq9FcgaFS/ezv9RA5bG7emffqenw5aGJL6BXtbNPRa676sAsLJF90KwAtjehV5plr0nsjPt7yzPo1pSzey/+gpRvdqxX2XJtK6cc2m54lI8FCyD2Ex9SJK5dbhW9eyvIN3p+1VvYBQib4qknr1o21sQYHdl9vTmbgwmW93Z9IrPpqZ1/flnDYxDkcoIoHG0WRvjGkOvG+t7WOMmQMkAYustZMqeanUWPHCvqKtbkxBq98XnxPK8+O95dZ7HiSxRQPu+s/XLPpuLy0a1mXG2N5c0asVtTQuLyJlcLpl/yQQaYy5Cgiz1g40xvzbGNPJWru5ohfu/nErfxz3i2LHLhxxBVdcezMns7N48I7rS73mkp+PZcQvfkXmkcM8ds9tpc6PHvtrhoy8kgN703hiwm9LnR/z6zsYeNEl7PpxCzMevbfU+etvv4e+A3/GlpTvmfXEw6XO3/L7B+jW51x+WP8l/35mcqnzd9w3kY5du/P1mtX857nppc7f/ZdpxLfryJpVy3hr7qxS5++b8izNWsbx4ZJ3WTBvbqnzj0x/gUaNm7D0v2+w7H/zYP8BMo6fxK59h/ezj/G3lp2pWyuMXRtXczh1NX9cVXx61lMv/ReAJ598kk9XLSM3L5/wsFrE1q9D0+j6TH7udQBenfU067/4+KcX7j9AhKlN3qDRkJXL3BMHee/EPiI+eAO+WwlA0+atuP+JfwIwc8rDbE39vthnt27TgXsefRIo2OJ1946txc53SOzOnRMmAgVT0w7u31PsfFKvftx6z4MAPPr7WzmamV7sfJ/zBnPDHX8A4IHbr+XUqZPFzg+4cDjX3HwnQKnfO/Df796WzZuZ/vpiTiWch7H5RO9ZS8TeL6nf/35q1Ypjw4YN3H333aVeP3nyZAYNGsRnn33GAw88UOr8jBkz6N27Nx988AGTJpW+137uuedITExkwYIFPPXUU6XOv/LKK8THxzNv3jxmzSr9u/nWW28RGxvLSy+9xEsvvVTq/OLFi4mKimLmzJnMnz+/1PkPP/wQKPjdW7hwYbFzkZGRLFmyBICJEyeyYsWKYuebNGnC22+/DcCECRNYs2ZNsfOtW7c+O43x7rvvZsOGDcXOd+7cmdmzZwMwfvx4Nm3aVOx87969mTFjBgA33HADu3fvLnZ+4MCBTJkyBYCrr76aw4cPFzt/8cUX8/DDBX8vRo4cSXZ2drHzo0aN4k9/+hMAQ4YMoaRf/vKX3HnnnWRlZXHZZZeVOj9u3DjGjRvHoUOHGDNmTKnzd9xxB2PHjmXXrl3ceOONpc7/8Y9/ZPTo0aSmpnL77beXOv/QQw8xbNgw/e458LtXHY4le2PMUOAEsA8YApz5Li8DLgBKJXtjzHhgPECdOnVoXGKjji4tGzIsqTlZWVmlzgF0i2vEsKTmHDoUVub5Hq2jGZbUnF0NcphdxvneCQXnU8MymFvG+b5tGjMsqTmxOXt5o4zz57aLYVBSc6IyYvhvGecHdGhC76TmsKcxi8s4P6hjLImJzcneGs2KMs4P7tyU+PjmHP4umk/KOH9hYjNiY2PZvbYRX0ZFQLvW1E1OJfLgPvbVb8KdV97PXz96mQu+XsDWZi2IjEos9vphSc15d30aX+88Qm5ePgC5efnsP3qSxg3rnV3VbU2z+mwv+vntWhf80j9yCQATJnzCmrB9xd67RaO6Z1+/sEkU6SXij2scefb8/MaRpbZ4TWgSdfb8S43qlpqa1jb2p/hmNaxDWG7x8x2a1T97/qn6dcgOyy92vlPzBmfPl/W74+vfvZ7x0Rw6fop/rT/Oqbbnk7v5E9od/Y7aucdLPVdEpCRjrfX/hxoTASwFfgG8C2wF/m6t/cYYcwnQ11r7eEXv0a9fP/vVV1/5Pthg99e/snXTbm7qcS17Mk/SqlFdXv7udTp0bg1//Wupp5//+ErSMrJLHY+LjuTT+4f6IeDQ89mWQ0xclELK3qP0a9OYtIV/p86JfWdbHCISOowx66y1/ar7Oqda9vcDM621GcYYgONAZOG5+oAW6vaXv/6VDtbyqSky1muHgil77HdPGYm+ouPiuR8PnWDy4hSWJ+8nLjqSZ6/rw+U9WnLRvNJdoSIiFXEq2Q8Dhhpj7gJ6AwnALuBzoBeQ6lBcoalkYi8n0QO0io4ss2XfKjqyjGeLJzKzc/nHis3MXbOdiLBa3DsikVsvaEfd8DCnQxMRl3Ik2Vtrf3bmsTHmQ+AK4GNjTCtgJDDAibikcveOSGTCO9+RnZt39lhkeBj3jkis4FVSFafz8nl97U6eXr6JjOxcfnlOPH8c0ZlmDeo6HZqIuJzT1fhYa4cAGGOGAMOBqdbaTCdjcpN316cxbWkqezKyaRUdyb0jErmyT5zPPu/Me1f0mf6OKRh8tOkgkxYms/nAcQa0j+HhUUl0a9WozOdefPHFfo5ORNzOkQI9b1CBXkFSLauVPeWqHo4l10CMKZBtOXCMSYtS+DD1IG2aRPHAZV25JKk5poKhFBEJXW4r0BMvmLY0tVhSBcjOzWPa0lTHEmsgxhSIjpzIYcYHm3j1i51ERYTx4GVduWlQG+rU1ri8iHifkr2LBWJlfCDGFEhyTufzyuc7eOaDTRw/dZrrzkvgnmGdaVK/TpXfY+TIkQBnF/MQEamMkr2LBWJlfCDGFAistaxIOcDkxSlsO3SCwZ1ieejyJBJbNKj2e5VcYU1EpDKaz+5i945IJLLEdCynK+MDMSanbdx3lBvnrOW2l78CAy+OO5eXb+nvUaIXEfGEWvYuVpXKeMXknEPHT/H08k28sXYnDeqG89fRSVw/oA3hYbrHFhH/UrJ3uSv7xAVcIg3EmPzp1Ok8Xvp0O8+u3EJ2bh43DWzL3cM6EV3GmvciIv6gZC/iJdZa3v9+H1OWbGRnehYXd2nGA5d3pUPT+l79nFGjRnn1/UQk+CnZi3jB92mZPLYwmbU/ppPYvAGv3NqfwZ2a+uSzzmx3KiJSVUr2IjVw4OhJpi1N5a2vd9M4KoJJV3bnV+fGU1vj8iISQJTsRTxwMjePFz7exswPt5Kbl8//G9yeuy7qSKPIcJ9/9pAhQwC0xa2IVJmSvUg1WGtZ8O1enliykbSMbEZ0a86EkV1pG1vP6dBERMqlZC9SRet3HmHiwmS+3plBUsuGPHlNLwZ2aOJ0WCIilVKyD0Ladc679mRkM/X9jby7YQ+x9esw9eqeXH1Oa8JqabMaEXEHJfsgU3LXubSMbCa88x2AEn41ZeWc5l8fbWP26q3kW7jrog7cMaQj9evon42IuIv+agUZ7TpXc/n5lv+uT2Pq0o3sP3qKUT1bct+lXYiPiXI6NAB++ctfOh2CiLiMkn2Q0a5zNfPV9nQeW5jMt7sz6dW6Ef+8ri/92sY4HVYxd955p9MhiIjLKNkHGe0655ld6Vk8/v5GFn27lxYN6zJ9bC9+3iuOWgE4Lp+VlQVAVFRg9DSISOBTsg8y945ILDZmD9p1riLHT51m5qotvPDJj9Qy8PuLO3H7he2JigjcfxqXXXYZoHn2IlJ1gfsXTTyiXeeqJi/f8uZXu3hy2SYOHT/FVX3iuPfSRFo2Ug+IiAQfJfsgFOq7zlXms62HmLgwhZS9RzmnTWNe+HU/esdHOx2WiIjPKNlLyNh+6ASTF6ewLHk/cdGR/OPaPozq2RJjAm9cXkTEm5TsJehlZufy7MrNvPTZdiLCanHviERuvaAddcPDnA5NRMQvlOwlaJ3Oy+f1L3cxffkmjmTlcM05rfnTJYk0a1jX6dBqZNy4cU6HICIuo2QvQWn1poNMWpTMpv3HOa9dDA+PSqJ7XCOnw/IKJXsRqS4lewkqWw4cZ/LiFFZuPEBCTBT/uuEcRnRrHlTj8ocOHQIgNjbW4UhExC2U7CUoHDmRwzMrNvPq5zuIDA/jgcu68OtBbalTO/jG5ceMGQNonr2IVJ2Svbhabl4+r36+gxkfbObYyVyu7Z/APcM7E1u/jtOhiYgEDMeSvTGmEfAGEAacAMYCs4AkYJG1dpJTsUngs9aycuMB/rY4hW0HT3BBx1geGtWVLi0aOh2aiEjAcbJlfz3wtLV2uTFmFvArIMxaO9AY829jTCdr7WYH45MAlbrvGJMWJfPx5kO0j63HnF/3Y2iXZkE1Li8i4k2OJXtr7cwiXzYFbgBmFH69DLgAULKXsw4fP8XTyzfx+tqdNKgbziOjkrhxYBvCw2o5HZqISEBzfMzeGDMQaAxsB9IKD6cDfct47nhgPEBCQoKfIhSnnTqdx9zPtvOPFVvIys3jpoFt+f3FnWhcL8Lp0Bxxxx13OB2CiLiMo8neGBMD/AO4GvgDcGYXkvpAqeaatXY2MBugX79+1k9hikOstSz9YT9TlqSw43AWFyU25cHLu9KxWQOnQ3PU2LFjnQ5BRFzGyQK9COBNYIK1docxZh0FXfefA72AVKdiE+d9n5bJxIXJfPFjOp2a1WfuLf25sHNTp8MKCLt27QIgPj7e4UhExC2cbNnfSkFX/YPGmAeBF4EbjTGtgJHAAAdjE4ccOHqSJ5el8ua63URHhjPxyu5ce248tTUuf9aNN94IaJ69iFSdkwV6syiYaneWMeY9YDgw1Vqb6Uhg4oiTuXnM+eRHZq7aQk5ePrdd0I7fDu1Eo8hwp0MTEXE9xwv0irLWHgHmOx2H+I+1loXf7uXxJRtJy8jmkqTmPHBZV9rG1nM6NBGRoBFQyV5Cy4ZdGUxcmMy6HUfo2rIh067pyaAOWu9dRMTblOzF7/ZmZjP1/VT+uz6N2Pp1eOLqHow5J56wWloUR0TEF5TsxW+yck7z3EfbeG71VvIt3DmkA3de1JH6dfRrWB1//OMfnQ5BRFxGf2XF5/LzLe9uSGPq+6nsO3qSy3u25P5LuxAfE+V0aK40evRop0MQEZdRshefWrcjnccWJPPN7kx6tm7EP67rw7ltY5wOy9VSUwuWoEhMTHQ4EhFxCyV78YndR7J4fMlGFn67l+YN6/DUNb34RZ84amlcvsZuv/12QPPsRaTqlOzFq46fOs2sD7fw/Mc/UsvA/13cid9c2J6oCP2qiYg4RX+BxSvy8i1vr9vNtGWpHDx2iit7t+LPl3ahVXRk5S8WERGfUrKXGluz9TATFyaTvPcofROimX3jOfRJaOx0WCIiUkjJXjy24/AJJi9OYekP+4mLjuTv1/ZhdM+WGKNxeRGRQKJkL9V29GQuz67cwouf/kh4WC3+dElnbhvcnrrhYU6HFhIeeughp0MQEZdRspcqO52Xzxtf7mL68k2kZ+Uwpm9r7h2RSLOGdZ0OLaQMGzbM6RBExGWU7KVKPt58kIkLk9m0/zj928Uwd1QS3eMaOR1WSNqwYQMAvXv3djgSEXELJXup0JYDx5m8OIWVGw8QHxPJv27oy4huLTQu76C7774b0Dx7Eak6JXspU0ZWDjM+2Myrn++gbngYE0Z2Ydz5balTW+PyIiJuo2QvxeTm5fPq5zuY8cFmjp3M5Vf9E/jD8M7E1q/jdGgiIuIhJXsBwFrLqtQDTFqUwraDJzi/YxMeHpVEl/Y6BuwAAAomSURBVBYNnQ5NRERqSMleSN13jEmLkvl48yHax9bjhZv6cXHXZhqXFxEJEkr2Iezw8VNM/2ATr32xk/p1avPwqCRuHNCGiNq1nA5NKjB58mSnQxARl1GyD0GnTucx97Pt/GPlFrJy8rhxQBvuHtaZxvUinA5NqmDQoEFOhyAiLqNkH0KstSxL3s/kxSnsOJzFkMSmPHR5Vzo2a+B0aFINn332GaCkLyJVp2QfIn7Yk8nEhcl8vi2dTs3q89LN5zIksZnTYYkHHnjgAUDz7EWk6pTsg9yBYyd5aukm5q/bRXRkOBN/3o1r+ydQO0zj8iIioULJPkidzM1jzic/MnPVFnLy8rn1/Hb8bmgnGkWFOx2aiIj4mZJ9kLHWsui7vUxZvJG0jGyGJzXngcu60i62ntOhiYiIQ5Tsg8i3uzN4bEEyX+04QpcWDXjttvMY1DHW6bBERMRhSvZBYF/mSaYu3cg7X6cRWz+Cx6/qwTX94gmrpUVxgtGMGTOcDkFEXEbJ3sWyc/KYvXob//poK3n5lt9c2IG7LupAg7oalw9m2tpWRKor4JK9MWYOkAQsstZOcjqeQJSfb/nfN2lMfT+VvZknubxHS+4f2YX4mCinQxM/+OCDDwAYNmyYw5GIiFsEVLI3xlwFhFlrBxpj/m2M6WSt3ex0XIHEWsv1L3zBmm2H6RHXiGd+1Yf+7WKcDkv8aNKkgntgJXsRqaqASvbAEGB+4eNlwAXA2WRvjBkPjAdISEjwd2wBwRjDJd2ac/U5rbmqTxy1NC4vIiKVCLRkXw9IK3ycDvQtetJaOxuYDdCvXz/r39ACx83nt3M6BBERcZFAW0btOBBZ+Lg+gRefiIiI6wRaMl1HQdc9QC9gu3OhiIiIBIdA68Z/F/jYGNMKGAkMcDgekYDz3HPPOR2CiLhMQCV7a+1RY8wQYDgw1Vqb6XBIIgEnMTHR6RBExGUCKtkDWGuP8FNFvoiUsGDBAgBGjx7tcCQi4hYBl+xFpGJPPfUUoGQvIlUXaAV6IiIi4mVK9iIiIkFOyV5ERCTIKdmLiIgEORXoibjMK6+84nQIIuIySvYiLhMfH+90CCLiMurGF3GZefPmMW/ePKfDEBEXUctexGVmzZoFwNixYx2ORETcQi17ERGRIKdkLyIiEuSU7EVERIKckr2IiEiQU4GeiMu89dZbTocgIi6jZC/iMrGxsU6HICIuo258EZd56aWXeOmll5wOQ0RcRMlexGWU7EWkupTsRUREgpySvYiISJBTshcREQlySvYiIiJBTlPvRFxm8eLFTocgIi6jZC/iMlFRUU6HICIuo258EZeZOXMmM2fOdDoMEXERJXsRl5k/fz7z5893OgwRcRElexERkSDn9TF7Y8wHFbzvbmvtDd7+TBERESmfLwr0HrfWflDWCWPMlcaYRsAbQBhwAhhrrc0xxswBkoBF1tpJPohLREQkJDnRjX898LS19hJgH3CpMeYqIMxaOxBob4zp5EBcIiIiQcnvU++stUXLiJsCB4DrgDMVR8uAC4DNJV9rjBkPjC/88pQx5nsfhhroYoFDTgfhoJC/fmNMqF5/yP/s0fWH8vUnevIix+bZG2MGAo2ttZ8bY/4fkFZ4Kh3oW9ZrrLWzgdmFr//KWtvPL8EGIF2/rj9Urz+Urx10/bp+85Unr3Mk2RtjYoB/AFcXHjoORBY+ro9mCYiIiHiN35OqMSYCeBOYYK3dUXh4HQVd9wC9gO3+jktERCRYOdGyv5WCbvoHjTEPArOAd4GPjTGtgJHAgCq8z2zfhegKuv7QFsrXH8rXDrp+Xb8HjLXWq1EYY96koPCuLBustXeX87rGwHBgtbV2n1eDEhERCWFeT/YiIiISWFQIJyIiEuQCMtkbYz4wxnxYzn+vOh2f04wxc4wxa4wxDzkdiz8YYxoZY5YYY5YZY/5rjIkIte8BgDGmuTFmfeHjULz+mcaY0YWPQ+L6jTGNjTGLjTFfGWOeKzwWKtfe3BjzceHjcGPMAmPMp8aYW8o7FkxKXH9CYf5baYyZbQpU6/oDMtlTsOTukLL+A94q648/hMY/ghBdbbDkqou/IvS+BwBPApGh+DtgjBkMtLDWLgix678R+E/hvPIGxpg/EwLXXljDNReoV3jod8A6a+35wBhjTINyjgWFMq7/duAOa+1QIB7oQTWvP1CTfWVCecndIZRebTCoWWtnWmuXF37ZFLiBEPseGGOGUrCXxD5C7HfAGBMOPA9sN8b8nNC6/sNAd2NMNAV/5NsRGteeB4wFjhZ+PYSfrns10K+cY8Gi2PVbax+01qYUnmtCwQqCQ/5/e3cPYkcVBXD8fwhKMGlMIzZGAqYQ1BVEG1HBQKqIaTQREjSmEAKCoLAKIlgYsUkhRAjEDzAIIhYWJkLExQ+i2CjEL0ylKGiTRBQTRI7FvQ/GxyzhbXb37Zv7/8HC25m9wzt3Ps7OnZkzTBD/TCb7noP/77RzANjA/6sNXjPF77KqRlUXgZ9pqA/qyNWzwHyd1No2sBf4FngJuB04QDvxfwpsBh4HvgOupIHYM/OPzDzfmdS3zQ92P+iJH4CIeBD4JjN/ZcL4ZzLZj3RL7jLgFT+myWqDnaqL+2ivD+aBw5l5rv7eWvy3AkfqI7lvUs5iWon/OeCxzHwe+J7yHpFWYu/q2+ab2g8iYgvwJDB6fH2i+Ge2c8YO/tDOim+u2mBP1cXW+mAbcCAiFoA5YAdtxX8G2FI/3wZcTzvxXw3cFBHrgDuAF2kn9q6+fb6Z40C9hv8WsK9zxj9R/FN7Ec7luETJ3c8pgf8wpa+30pZSbXDWjVddfA3Y00ofZOZdo8814d9HW9vAUeDViNgFXEG5ZPdeI/EfpGzvm4FTwCHaWvcjbwDv1xs1bwS+oIzkjk8bqnngOuDliIAy4tPXJ4tak0V1ImJbZp5cZN79wLXAC8DXdfIrwHHgE+BD6k7Qd81jCKw2aB8Yf7vxtxp7/QfnTuCD0bG9b1pLJol/rSZ7S+5KkrRM1mSylyRJy2eoN7FJkqTKZC9J0sCZ7CVJGriZfPRO0vKJiA2UYjWbgJ8oFetuAcjMr5awvLmltpW0Mjyzl7QHOJWZdwMXKYVr5urPUlxOW0krwLvxpcbV18Y+A+zNzB8j4iCws87+JTPvjYiNwDuUstRnMvOR2nYB+BK4OTO397VdzVgk9TPZSyIiHqC8bOcj4AnK2T6Z+XqdfwOwFTgJnAB2ZeZvEXEBeCgz3+0s6+FuW0nT5zC+1LiayE9Qht5HrxAe9w+wHzhGubY/eg/F6W6il7Q2mewl7Qd2Zua/wGlgPfA3cBVAlGLcj1KG8XcDf3Xa/tmzvPG2kqbMYXypcbW+9jEggPOUhL4eeJtyBv90/dPDwFlgHfBUZn4WEQuZec/Y8jZ122bmx6sRh6TFmewlSRo4h/ElSRo4k70kSQNnspckaeBM9pIkDZzJXpKkgTPZS5I0cP8BxhaplhIGiBUAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#%figonly=使用二维K-d树搜索指定区间的在线用户\n", "def _():\n", " N = 100\n", " start = np.random.uniform(0, 100, N)\n", " span = np.random.normal(40, 10, N)\n", " span = np.clip(span, 2, 100)\n", " end = start + span\n", "\n", " time = 40\n", " \n", " fig, ax = pl.subplots(figsize=(8, 6))\n", " ax.scatter(start, end)\n", " mask = (start < time) & (end > time)\n", " start2, end2 = start[mask], end[mask]\n", " ax.scatter(start2, end2, marker=\"x\", color=\"red\")\n", " rect = pl.Rectangle((-20, 40), 60, 120, alpha=0.3)\n", " ax.add_patch(rect)\n", " ax.axhline(time, color=\"k\", ls=\"--\")\n", " ax.axvline(time, color=\"k\", ls=\"--\")\n", " ax.set_xlabel(\"Start\")\n", " ax.set_ylabel(\"End\")\n", " ax.set_xlim(-20, 120)\n", " ax.set_ylim(-20, 160)\n", " ax.plot([0, 120], [0, 120])\n", "\n", "_()" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "group_control": { "group": 0 } }, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "class KdSearch(object):\n", " def __init__(self, start, end, leafsize=10):\n", " self.tree = spatial.cKDTree(np.c_[start, end], leafsize=leafsize)\n", " self.max_time = np.max(end)\n", " \n", " def count_at(self, time):\n", " max_time = self.max_time\n", " to_search = spatial.cKDTree([[time - max_time, time + max_time]])\n", " return self.tree.count_neighbors(to_search, max_time, p=np.inf)\n", " \n", "naive_count_at(start, end, 40) == KdSearch(start, end).count_at(40)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "> **QUESTION**\n", "\n", "> 请读者研究点数`N`和`leafsize`参数与创建K-d树和搜索时间之间的关系。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 凸包" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "group_control": { "group": 0 } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[2 5]\n", " [2 6]\n", " [0 5]\n", " [1 6]\n", " [1 0]]\n", "[5 2 6 1 0]\n" ] } ], "source": [ "np.random.seed(42)\n", "points2d = np.random.rand(10, 2)\n", "ch2d = spatial.ConvexHull(points2d)\n", "print(ch2d.simplices)\n", "print(ch2d.vertices)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "group_control": { "group": 0 } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#%fig=二维平面上的凸包\n", "poly = pl.Polygon(points2d[ch2d.vertices], fill=None, lw=2, color=\"r\", alpha=0.5)\n", "ax = pl.subplot(aspect=\"equal\")\n", "pl.plot(points2d[:, 0], points2d[:, 1], \"go\")\n", "for i, pos in enumerate(points2d):\n", " pl.text(pos[0], pos[1], str(i), color=\"blue\")\n", "ax.add_artist(poly);" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "group_control": { "group": 0 } }, "outputs": [ { "data": { "text/plain": [ "(38, 3)" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.random.seed(42)\n", "points3d = np.random.rand(40, 3)\n", "ch3d = spatial.ConvexHull(points3d)\n", "ch3d.simplices.shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 沃罗诺伊图" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "group_control": { "group": 0 } }, "outputs": [], "source": [ "points2d = np.array([[0.2, 0.1], [0.5, 0.5], [0.8, 0.1],\n", " [0.5, 0.8], [0.3, 0.6], [0.7, 0.6], [0.5, 0.35]])\n", "vo = spatial.Voronoi(points2d)" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "group_control": { "group": 0 } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[0.5 0.045 ]\n", " [0.245 0.351 ]\n", " [0.755 0.351 ]\n", " [0.3375 0.425 ]\n", " [0.6625 0.425 ]\n", " [0.45 0.65 ]\n", " [0.55 0.65 ]]\n", "[[-1, 0, 1], [-1, 0, 2], [], [6, 4, 3, 5], [5, -1, 1, 3], [4, 2, 0, 1, 3], [6, -1, 2, 4], [6, -1, 5]]\n", "[[-1, 0], [0, 1], [-1, 1], [0, 2], [-1, 2], [3, 5], [3, 4], [4, 6], [5, 6], [1, 3], [-1, 5], [2, 4], [-1, 6]]\n" ] } ], "source": [ "print(vo.vertices); print(vo.regions); print(vo.ridge_vertices)" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "group_control": { "group": 0 } }, "outputs": [], "source": [ "bound = np.array([[-100, -100], [-100, 100], \n", " [ 100, 100], [ 100, -100]])\n", "vo2 = spatial.Voronoi(np.vstack((points2d, bound)))" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "group_control": { "group": 0 } }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\scipy\\spatial\\_plotutils.py:20: MatplotlibDeprecationWarning: The ishold function was deprecated in version 2.0.\n", " was_held = ax.ishold()\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#%figonly=沃罗诺伊图将空间分割为多个区域\n", "fig, (ax1, ax2) = pl.subplots(1, 2, figsize=(9, 4.5))\n", "ax1.set_aspect(\"equal\")\n", "ax2.set_aspect(\"equal\")\n", "spatial.voronoi_plot_2d(vo, ax=ax1)\n", "for i, v in enumerate(vo.vertices):\n", " ax1.text(v[0], v[1], str(i), color=\"red\")\n", " \n", "for i, p in enumerate(points2d):\n", " ax1.text(p[0], p[1], str(i), color=\"blue\")\n", "\n", "n = len(points2d)\n", "color = pl.cm.rainbow(np.linspace(0, 1, n))\n", "for i in range(n):\n", " idx = vo2.point_region[i]\n", " region = vo2.regions[idx]\n", " poly = pl.Polygon(vo2.vertices[region], facecolor=color[i], alpha=0.5, zorder=0)\n", " ax2.add_artist(poly)\n", "ax2.scatter(points2d[:, 0], points2d[:, 1], s=40, c=color, linewidths=2, edgecolors=\"k\")\n", "ax2.plot(vo2.vertices[:, 0], vo2.vertices[:, 1], \"ro\", ms=6)\n", "\n", "for ax in ax1, ax2:\n", " ax.set_xlim(0, 1)\n", " ax.set_ylim(0, 1)" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "group_control": { "group": 0 } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0 3 1 7 4 6 5]\n", "[6, -1, 2, 4]\n" ] } ], "source": [ "print (vo.point_region)\n", "print (vo.regions[6])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 德劳内三角化" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "group_control": { "group": 0 } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[8 5 7]\n", " [1 5 3]\n", " [5 6 7]\n", " [6 0 7]\n", " [0 6 2]\n", " [6 1 2]\n", " [1 6 5]\n", " [9 5 8]\n", " [4 9 8]\n", " [5 9 3]\n", " [9 4 3]]\n", "[[104.58977484 127.03566055]\n", " [235.1285 198.68143374]\n", " [107.83960707 155.53682482]\n", " [ 71.22104881 228.39479887]\n", " [110.3105 291.17642838]\n", " [201.40695449 227.68436282]\n", " [201.61895891 226.21958623]\n", " [152.96231864 93.25060083]\n", " [205.40381294 -90.5480267 ]\n", " [235.1285 127.45701644]\n", " [267.91709907 107.6135 ]]\n" ] } ], "source": [ "x = np.array([46.445, 263.251, 174.176, 280.899, 280.899, \n", " 189.358, 135.521, 29.638, 101.907, 226.665])\n", "y = np.array([287.865, 250.891, 287.865, 160.975, 54.252,\n", " 160.975, 232.404, 179.187, 35.765, 71.361])\n", "points2d = np.c_[x, y]\n", "dy = spatial.Delaunay(points2d)\n", "vo = spatial.Voronoi(points2d) \n", "print(dy.simplices)\n", "print(vo.vertices)" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "group_control": { "group": 0 } }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\scipy\\spatial\\_plotutils.py:20: MatplotlibDeprecationWarning: The ishold function was deprecated in version 2.0.\n", " was_held = ax.ishold()\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAQUAAAD6CAYAAACoJVLpAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzsnXdcVeUbwL8HEHDvQe6VpZE5cpuomVpZlvpzlFmaI620stIsteHMvQeSe+REy51bHKiguEEUEVT2Hnc9vz8OIMgF7r1cQMvv53M+F85517njOe/7vM9QRIRnPOMZz0jFpqAH8IxnPOPJ4plQeMYznpGBZ0LhGc94RgaeCYVnPOMZGXgmFJ7xjGdk4JlQeMYznpEBk4SCoihlFEXppChKubwe0DOe8YyCJUehoChKaeAvoBlwWFGU8oqirFAU5ZSiKD+mK5fp3DOe8YynD1NmCi8DX4vIJGAf0AGwFZGWQC1FUeoqivL+4+fybsjPeMYz8hK7nAqIyFEARVFeQ50tlAH+TLm8H2gDNDJyzjd9O4qiDAGGABQtWrTJCy+8YIXhW45GoyEkJIQqVaoU6Dj+KxgMBgBsbJ6psfKL8+fPh4lIeXPr5SgUABRFUYDeQCQgQFDKpQigMVDUyLkMiMgyYBlA06ZN5dy5c+aO1apERkZy9uxZOnfuXKDj+K+QkJDA+fPnadu2bUEP5T+DoigBltQzSWyLygjgEtAKKJxyqVhKG3FGzj3RFC1alE6dOhX0MP4zxMTEsHTp0oIexjNMwBRF4/eKonyU8m8pYCrq8gCgIXAHOG/k3BPNsmXLGD16dEEP4z9DpUqVWLt2bUEP4xkmYMoTfRnQX1GUY4AtsCPl/1nA/4C/szj3RPP5558zc+bMgh7Gf4ovv/ySyMhIs+o8ePCAyMhIRIQFCxYgIpw/fx5XV1dAFe4XL17EYDDg5uaGiBAdHU1ERERe3MJ/ghyFgohEikgnEXlNRIaLSDTgApwG2otItIjEPH4uLwdtDc6cOcO1a9dyLKfRaHB3dwfg8OHDLFu2DID333+fU6dOERwcTIMGDQBwc3Nj9uzZAPz+++8EBQWRlJREQIBFSzvjnDoFU6aor08Zbdu2xcHBIcvrN2/eJDk5mWvXrvH1118THx/PvHnz+P3337l79y7Xrl1jwIABlCxZktu3bzNz5kyqVKnCzJkzOX/+PB4eHsybN4+///6bn376idDQUMaPH4+/vz8ajYaoqKh8vNunGBHJ96NJkyZSkGy/cE8a/rhTqn//l7Sa8o9sv3BPRES0Wq34+fmJiMj48eNl69atotPppE+fPqLT6cTX11dOnz4tIiKhoaGSlJQker1eIiMj084FBQWJiMjKlSslLCxMfHx8pHv37iIisnz5cjl48KCIiBgMBvMH7uEhUriwiK2t+urhkav3IT/ZfuGetJryj9R47D2/ceOG7N+/X0RE3n33Xfn8888lNDRUfvvtN/nwww9FRGThwoXi4+MjWq1WduzYISIiwcHB4u/vLyIinp6eEh0dLaGhoTJnzhwREVm6dKksWLBA3N3dZcCAAXL06FFxcXGRpKQkOX36tNy/fz+/34J8BzgnFvw+FSmAICsFufuwwyuIsdt8SNTq084VshHGdapB80q2jBkzBnd3d+7cuUOpUqUoVaqU1fo+deoUFStWpEyZMrRo0YKrV68SHh5OyZIlsbe3z7mBKVPgp59ArwdbW/j1Vxg71mrjyyuMvee2oueHTtV5uaSGhQsX8tJLLzF69GjmzJnDoEGDKFq0KIqioG585Y5t27bx7rvvsnv3bjZt2kSDBg0oW7Ysb7/9Njt37mTYsGG57uNJRFGU8yLS1Ox6/zWh0HrqIYKiEjOdL28bj2cLj3wbx8PIeCqWLsrv285TyNaGUe82SjuXJdfvw4/bQKcHO1v47X14wSnfxmwprc+1ISi5cKbzEh+O78w+RERE4ODgQOnSpfN8LHq9HltbW4YNG0b//v3Zv38/Li4uREZG0qRJE6pXr57nY8gvLBUKJtkp/JswJhAAwvRF4Hr+6UcrAjyEb+urS7iQc3fptCwY71FVSdYLhQtloe4ZXBFuJULtwsAFuJ5vQ7aYoKTXwcgD36ZoWezt7alUqVK+jcXW1haAJUuWAODg4MCxY8ews7MjIiKCDh06EBsbS8OGDfNtTE8a/xmh4OfnR506dShppyNal/m2n3NIhi+9wKFYvo9NASoA3hMM2NjYMKhfPz766CO6dOmS72OxFiLCpUuXaNiwISXGbiFGMs8UnlPCwP1zePVTeO6VAhglNG3alKZNmyIiDB8+nAoVKnDs2DHq1q2LVqulZMmSBTKuguSJNzLKLSJCcnIyH3zwATExMfzcoymF7TI+tgrb6PlW7wqLWsCNPQU00kcmwG5ubrz++uscOHCA8ePHF9h4LEVEiIqKYsiQIQz4oDe/FNmMI5oMZQrbKXxbJwgub4Vl7WB5R/DeANqkAhmzoigsXryYd955h6pVqzJ37lyaN29OdPQTv5Fmdf7VQuHMmTP07dsXBwcHTp8+TYkSJejeqDJTWitUJhQFqFyqMFN6NaH7kAlgXww29IFNH0J0UI7t5xWOjo7Y2dnRrFkzevXqhcFgwN3dnYLQ/5jLsWPH6NatG7du3eLY0aN890oc3TnE0BcNFCX50XveoyHdB/0AX1+DLtMgKRp2DINZL8KB8RB5p8DuYeTIkYwZM4YtW7bw/vvv8/PPP+Pr65tzxX8J/0pF4/Xr10lISODll18mKCgos/LIYwGaPT+wqPgYRn33w6PzOg2cWgBHp4ONLXT4CZoNVv8uQEJCQhg/fjwLFy5EUZQn0qnoxo0bxMfH8+KLL7J27Vpq165Nh9LB4D4COv1KSN0+3L59m+bNmxtvQARuHwVPV7i+G8QAdTvBq4OhTscC+QxEhKCgIE6fPk1ERASdO3emUqVK2dpaPElYqmh88r5dVuD69evcvHkTOzs749rkcF8KFStLaHQ8Gk26aa2dPbT9GoafgmotYO/3sLwDBHvl3+CNUKFCBZYsWYKiKLRu3ZqgoIKbxWTF2bNnGTx4MBcvXmTw4MF0aFQL9nwP1dtAyxHY2NjQtGk2309FgVou0HstjPKB176FYG9Y3wvmNYITcyA+PL9uJ2VIClWqVOGtt97i2rVrLFmyhA0bNuTrGAoES4wbcnvklfHSpEmTZOPGjTkXdOsq4vpG9mUMBhGfrSK/1xWZWEpk93ciidHWGWguuHdPNfq5fPmy6PX6Ah6NyPz582X06NGSlJQkMTEx6km9TmRFZ5HJVUQiA0REpE+fPmlGSiajTVY/A7euIhNKiPxSXmTbUJFAT/XzyWd0Op107NhR1q1bJ+fOncv3/s0FC42X/hUzhfDwcDQaDX369DFNYx/mC+XqsnTpUqZOnWq8jKLAS+/DiLPQdCCcWQoLm8PVnepUt4CoXLkyIsIPP/zA7du3C2wciYmJ6PV62rZtS3x8PBERERQvXly9eHIu3D0Fb/4OpaoBsGHDBvO9Uu3s1c/gk93w2Slo3B+u7QLXjqpy8sIa0CRY+c6yxtbWlj/++IMiRYpw8eJF9Hp9zpWeRiyRJLk9rD1TGDZsmGzbts20wgkR6lPnxBwJDQ2VqKgo0+oFeoosaqXWXdc77QlYkBgMBlmwYIGEhobme99ffvmltGjRQh4+fJjxQrC3yM9lRTb1T3uaBwYGiqurq3U6TooRObtcZEFz9bOYUlVkz1iRMD/rtG8ivXv3lnHjxsmqVavytV9z4L84U/D19eXBgwcsWLCA9957z7RKYX7qa7nnKVeuHOfOncuoV8iKKk1hyBHo9KuqEFvYHDzmg15n6fCtgk6ny9ddiZiYGCIiIpg0aRJTpkyhXLl0sXy1ibBtCBQpC2/PUWdbKWO0hrkyAA7FVbuG4afg491QuyOcXQrzG8Oa91QDtHz4TDZs2MCgQYP+lR6ZT7VQ2L17N8eOHUuzUjOJ8JStpXLPA7Bx40bu379vWl3bQtD6SxhxBmq2g/0/wjIXuFcwJtuKojBy5EhKlSrFiBEj8uXLuWLFCpo0aUJISAguLi4Zd0L++QVCr0P3hVCkTNrpKlWqMHDgQOsORFGgRmvo9Qd8dRXa/wihN2BjP5jbEI7NgLgQ6/aZoXuFmjVrEhMTw1dffcWuXbvyrK98x5LpRW6P3C4fgoKCxMNSD8EDE9TprU6bqzGIwSBydafIjBdEJpQU+etrkUQTlyJ5wJYtW0Sn0+VZ+1qtVnx8fESv10twcHDmArcOq9P5v0dnOJ2YmChVqlSRpKSkPBtbGjqt+pms7KaO5eeyIpsHitzxyFPF5J07d+SHH35I85Z9UuC/tHzw9fXl7NmzllUO84UytcBWNXWOiIigW7du5k/BFQVe7Aafn4Xmw+CcGyx4FS5vKxBFZI8ePQgKCmLEiBF5spzw9PTk7bff5tChQzg5PeaElRgJ2z9TZ1+v/5zhkqOjI1evXs2fvX1bO/UzGbATRniqywzfA/BHF1jSRv2MkuOs3m21atWoWrUqXbp04d69e1ZvP9+xRJLk9rB0pmAwGOTAgQMW1U1j/qsiG/plaPPEiROWxTdIT9AFkSVt1SfUmvdFwv1z154FaDQa2bNnj9XbDQwMlOTkZImLizP+Pm0eKPJzGZF75zNdWrVqlYSEhFh9TCaTHCdybqXI4tbqZzOpsjqbCblu9a7Onj0r06ZNy/13yUrwX5gpREZG4ubmZppi0Bh6HUT4Q7lHaSkURaFJkyacOHEid4N7rhF8egi6TIW7p1U/iuOzQK/NXbtmUKhQIbp06cLOnTvZtGmTVdpMTk7mtddeY8SIEWkxDjLgswUub4F2Y6BypiDe+Pv7U6hQIauMxSLsi0KTATD0OAw6AC+8CedXwsJmsPJtuLLDap9RvXr10Gg0ls08nyQskSS5PSyZKfj6+kpiYqLZ9TIQ5qc+LbzWZTgdGhoqvXv3tp6Ej7qnzkYmlFC3zgJOWaddE7l06ZJ4eXnlup3ExETRarWi1WqNb91GBapbgss7GtXRJCQk5HoMeUJcqMixmSKzXlI/oxn1RA5PEYk2oisxE4PBIKtWrZKjR49aYaC5g3/7TGHRokUcPnw4d42E3VRfy2ZMYFWuXDk2btxovW2zkpWhzzrouxE0ceDWGXZ+CQn5s3Xl7OxMgwYNWLRoUa4MbCZPnkyNGjWMuxAbDLDjM3X29d7SNB1NKiJCy5YtuXPnjsX95xlFy6nm7CO9oe8mqNgAjkyB2Q3gz4/g9jGL9UKpptGrV6/GwyP/gvZYFUskSW4Pc2cK8fHxZpXPkhNz1SdDQkSmS/fv35fWrVtb33Q4KVZk7w8iE0uLTKslcnFTvpjo6vV6+emnnyQ62nLTbK1WKzdv3jR+0WOh+l6e+yPL+k/sTMEY4bdE9o0TmVpdva/5r4qcXmqxafuJEydk8+bN1h2jmWDhTOGJFwoBAQHSqFEj6/xYd4wQmV47y8upQVvzhPuXRJZ1UL9wq97JNwu8hw8fyu3bt82qEx8fLw0aNMjaCvHhVdUPYV1vowJOo9HIiBEjrCfM8xNNgrq8XOqifla/OYnsGiXy4LJZzcTGxkr37t1l6dKleTTQnLFUKDzxy4dq1apx7Ngx67gLh/mmGS0Zo1atWkyfPp24OOtvW1HJGQbthzdnQNAFWNRSddHWJVu/r3Ts2LGD/fv3m1WnSJEiTJkyhZYtW2a+qNPAtsGqZeE789KsFtMjIrRq1YrChTNHW3riKVQYXukHQw7D4EPQ4D3wXg+LW4FbF1WxqstZ0V2sWDGWL1/OgwcPiImJyYeBW48nWihs3LgRV1dXihWzUoi0cN8MOw+PoygKRYsWJSEhj5xsbGzV+Ayfe6pa8MOT1P3zO7nc+ciGIUOGMGTIEJN1C0FBQQwfPpy2bdtSv379zAWOTIYHPvDOfChWIdPlhIQEvL296devn/V0NAVF5SaqdebX1+CN3yD2AWwdBLPrwz+/QlRgttXLlStHfHw8K1asyKcBW4cnWii0adOGVq1aWaexhAhICM+kZHycESNGAGpmojyjeCXotRI+2KrOFFa+BTuG51m8gAsXLtCtWzeTysbGxuLv72/8Bx3gocY1aPyRKtSM4O/vz8qVK3Mx2vzHy8uL+/fvo9Vq+eEHNejO4cOHmTdvHgBT5i7Fu0hbkoec4g/HwVDlVRIOzUQ/2xk2fgC3DqmKVyP88ssvrF+/nvDw/I0FkRueWKFw6NAh7OzsjD+tLCEso89DdqxatYp9+/ZZp9/sqPs6DD8Nbb6CS5tgQVPwWmd1i8hXXnmFVatW5VguJCSEYsWKsXfv3sy7DUkxsH0olK4OnScbrR8ZGZm26/GkcuHCBbRaLZ6ennz66acA7Nu3jxs3bmBnZ0fp0qUxGAzUqlUrbfnUokULKlWqRJJGw5UwoO8GVpT8ih9vOsPd08wa/iYhUxrCqYWqdWc6HBwcmD59OtOmTcvvW7UcSxQRuT1MUTROnjxZvL29LdWxZOb8alVxFH7L5CpxcXHW6z8nHlwRce2kjtHtTZGQG1ZtPiYmRiZOnJitLcZPP/0klStXNq7U3f6ZGmwm4HSW9fv16yf79u2zxnCtio+Pj+zevVtERHr16iX+/v4SExOT9c6Kiej1ehFtksz7/hOJWdBeDvQvIiNbFhHZMUISbz16nyIiIqRfv35y4sSJXPVnLvybdh/yJKLQvh9FfimnRgUygfDwcKlfv74kJydbfyxZoderW3xTqqrOPP/8JqLJpcFWWtN6mT17tmg0mmzLGb1+xV0VVgd/ybKewWCQ5OTkJ8bE12AwyG+//SaxsbHi6ekp69aty7lSLon3Oy1+Sz8S+a2SvFbdVrzHNxON5xrRJcbJ9E2HpeFPOzOlzctLLBUKpqSiL6koyh5FUfYrirJdURR7RVHuKopyJOVwTin3s6IonoqiLMzt7OW9997j5MmTuW0mI+F+UKa2yQFAy5Qpw9mzZylUqFD+RdixsYEmH8Pn51St97Hpqtbb/4gVmrZh1KhRWWZ9njZtGu+8805mk+TYh7BrJDi9Ai5jjNa9du0anTt3plChQgWuXPT19WXdunUoikL58uVJTEykadOm9OvXL8/7LlK7ObWHrIJvrrN35SxeLqvjr9+H0K1HD1Z4xRClsUFQExKN3ebDDq8nL9YmmKZT+ACYJSJvAA+AMcAGEXFJOXwURWkCtAGaASGKoryem0GtXr2aZs2a5aaJzITdzHbnwRhFixZl2bJl/Pbbb9YdS04UqwA9lkP/HYDA6nfV4CVxoblqNjY2lnbt2hn1HWnXrh09e/bMeFJEjcasTYD3l6nxJHi8iPDCCy/g6upaoALBz8+PsLAw7Ozs0u5vyJAhlC9fPv8H41iSwm2Ho3zwJ+8N+oZI5z4kScaHUaJWz+/7buT/2EwgxwxRIpJea1QeCATeVhSlPeADDAXaAVtFRBRF2Qd0BQ5aMqDt27fj7OxMnTp1LKluHL1WzSNQv7vZVVOfMCKS/1/62u3V2ITHZ8KJ2XBzH3T6BRr1V2cVZlK8eHGuXLmSyebDz8+P5ORkPvroo4wVzrmB3wHoOh3K18vUnsFgoHPnzqxYsYJq1aqZPR5rYDCoWbVWrlxJ27Zt6dy5MzVr1synzvUQfQ8ibkH4LdXZLvyW+n9kABhUR6sHrDVaPTiLFIYFjclp4xRFaQmUBg4Af4jIfUVRVgNvAkWBWylFI0hJlfhY/SHAECDbL1B4eDg6nZXDaUXcBoPO7JkCkBaMtHv37vz66684Oztbd2w5UcgROowD557w11ew60vVmKbbHKjwotnNPXjwgGXLljFx4sS0c2vXrmXv3r2cPn36UcEwPzWyVO0Oau6FxxARbGxsWLBgAVWrVrXkznKNXq+nRYsW7Nq1K+9mcwYDxN5P98NPeQ2/pT5o9OmMzwoVUWN1VKivxnUoUxvK1ua5NVEExWXeUapU0oHY2NhHAW+fEExKBqMoShlgP9ADeCAiySnnvwQKAQbgvohsVBSlMTBMRIZk1V5WyWDy7Gl87S/Y9IFqoVa5iUVN+Pn5Ubt2bXQ6XcG5AouoAmH/j5AcA62+gNe+A/siJjeRmJjI5s2bM88K0qPXwoo31Cff8FNQ4rlMRUaPHk2bNm3o3t382VduiYuLw93dnQ8++IDg4GCeey7z+MxCBOIeZvzRR9yCcH/1PdCle6LbOqg//LK1072qP36KO2W28EyIYMfcUYyNfo9E7NNOFy5ky1sVorG9dyHPtivzLOu0oij2wGZgrIgEKIryp6Iok4DLQHdgMqAB/gdsBBoCd8wdCMCsWbNITk5OMyCxGqlxGXMwXMqOOnXqkJycTLNmzThy5Ei+pE3PhKJAow/g+S5w4Cd1SXF5G7w1S7V5MIHChQvTv39/oqOjKVmyJF5eXvTr149Lly49EnbHZkDwBdXA6jGBoNfrMRgMjBo1irJly1r5Bk1Dq9Xi4+ODXq83XSCIQHxY5id+xC11JqlJZ9puUwhK11B/6LVcoGytRz/8ElVMX7rptfDnR3TXnYVOg/ndU0NwZCIO2iim9G5P90aV0et74u/vz+7du/n888/NfCfyBlOWD4OAxsA4RVHGAYeBNajJkneKyEFFUWyAKYqizAW6pBxmM3LkyLzxOwjzhWKVwLFErppxcHDg4MGDlC5dmocPH1KxYqZVUv5QtCx0XwQN+6pLinU9oMH70GWKai2ZA2vXruXMmTMsWLCAChUq8Omnnz4SCPfOwbHf4eXe6g7IY8yZMwedTsf3339v7bvKET8/P8aNG8fGjRuzzteREJFxbR/ul/L3bUhOlyxWsVUNscrUhuqtU370KT/+klUzuYJbxN6xcOc4vLeU7g3b0r0jaF3f5MOl53lzqmoibWtrS6FChdIUoqk6koLEarkkFUUpDLwFXBAR/+zKGls+aDQa3N3d6dWrl1XGkwHXTmDnAB//ZZXmIiMj6dixIydPnix4px9dsmp6fHymeo+vT4AmA7N9mqVfpp0+fZomTZqoQkETD0vagl4Dn50Ex0dWjSEhIWi12rTZgaOjY97e12NER0dTvHhxvL29aVy/dmbFXupreotCxUb9gaef4qe+lqpmdDfFapxzUwV2qy/hjV8fnd83jlmz56J5bSxjfhiXocqFCxeYOHEiO3futMoQ8mz5YCoikghssbR+VFQUJ06csL5QEFG3I19632pNli5dGk9PT2xsbFixYgX9+/fH3t4+54p5gZ0DuHz/SBH59zdqSvduc1TPTCMoisLSpUvp2bMnXbp0YfPmzWr2pv0/qj+0AbsyCASALVu2YGtry9ChQ/PjrtQAqyk/9hvep/h08lqOff0SjSP8YWdYxrIlqqhP+frd0/3w66gzAbsCSAZ75wTs/hbqdILXJ2a85vQKFYvoCUoIy1StUaNGLFq0CBEhOjqaUqVK5ctwH8dqQiG3VKhQgblz51q/4fgwSIoyyefBHGxtbUlKSsLPzw+DwVAwW5bpKVsbPnIHn83qtHVpO2g5HFzGqnEKHyM5OZmkpCSioqLUEzf3q0+3lp9DzbZp5Xbs2EGpUqUYPny49cesSYDI24897VOe/nGqQ5p/pIF6pW048FFFFFt71REr/VO/TE3V3flJIfIObOqvKiF7rshsLOfUkLbVbNkt0Zm+M6lRmw4ePIibmxvr16/P37GnjsNaywdzMLZ8+PXXX2nWrBmdO3e2bmcBHvBHV9Uj0URlnLmICB07dsTNzY0aNWrkSR9mkRABByfChVXq9PnNGVAvs5pn48aNnDhxggXTJqrxHYqWV+MI2DkQHh5OmTJlOHr0KCVLlqRRo0aWjUWXrK7nMyn4/CHmMYu+ohXSPelrEWFbgbe+nMHRI0ewL1YAil1zSY6FFZ0h5h4MPqzey+MY9DClKu/uKsKqveeynA0kJyej0+nQ6XSZndNMpMCXD7mld+/eFt98tqTGZbTARsFUFEVh+fLlVK9enWPHjlGnTh2LtsmCg4OpWLEiDx8+5PLly7zxxhu4urpSv359WrVqRf/+/XFzc+PixYucPXuW4cOHc/jwYerUqUOVKlW4f/++2m+RMmoAlFRF5Ibe6r55l2lq/Ehg//79rFixghYtWqhmzElR0H972nT7k08+Ydy4cbi4uOQ8cJ0GogKMb+lFBwLpHjyFy6g/lhptM2/rpVME3759mxo1auDh+WGBm06bhMEA24epGbI+3GJcIIA6c3B6mbCwMyQkJGQpFBwcHJg3bx52dnZ89dVXeTjwzDwxQsHBwSFvTFLDfMHOUX1i5iG1a6tfgnPnzuHg4ECZMmXQ6/UULZp56q7T6QgICKB27dps2LABOzs7evXqxVtvvcXevXuJjIzEy8uLN954g+effz4tX+Obb76Jra0tZcqU4YUXXgDA29ubEiVKUKpUKVxcXLh58yZ//fUXERERfPTRRwR0WUPlu9uxOzkTbh2GDj9Bs8FElKhNrMt3rI1N5pB3bb5t1JEupeowfOBAFi9ezNatWzPaY+h1EH03Ze/+VkbtflQgSDr/EMeS6o+8WnMo0y/D05/Cpj3xR44cyaRJk/LfWMxSjkyB63+pgrd2h+zLOjVkTMsz7Ni+jeEjst6G/Prrr7GxsSEiIoIyZcpkWc7aPBHLBxHhxRdfxMvLy/ra/HX/U6epn1nZwSoH3N3d2blzZ4aoO2vXrqVp06aUKlWKXr16cfz4cS5fvoydnV3aj9wa3Lx5k/j4eBo1asTrr7/O0qVLsY0N5uiiUQx4zo8dxfoyJqobSekMR+1tYHqPl+HaHt5sUh372LtZmu2qFYoZ1+qXqa3OVCx8usfGxgJqOLOnYoYAqq3Ilk9U8/N35ud8797rWfbjQEq8M4U+Q7KfBYgIbdu2xc3NjeefN08v9lQvHxRF4fr163nTeNhNeO6VvGk7G9555x26du2Kp6cn3bp1IyAgIC11WqVKlTh+/DgAL730ktX7Tv/lOXhQdUHx9TWgtP4SmhTjB9dYkh7bUdQY4Pcthzjp8C2kJObOymyXMrVVp608+NFu2rSJwMBAfv7555wLPwkEe6tRs6q2gLdmmvaeODWkUnGF4jZRORZVFIVDhw5hb2+PXq83L5lVp66RAAAgAElEQVSyhTwRQiE4OJjdu3enRcKxGrpkda3rnAe2D1mQqlHu27cvQ4cOpVmzZsybNw8HBwdu3LiBwWCw6qzAVOrWrUvdunVJigknweGU0TLBUha6zc3ebDcPMRgMfPrpp9b3fckrYh+qWa6LlIXea03f/ixXj7rlizBw5gpOfZqz8LO3t+fkyZPMnj2bLVss3vU3mSciHJvBYMibmAUR/iAGq29HZuDUKZgyBfHw4MaNG7Rv3x6AuXPn4uLiQtGiRfnf//4HwODBg3FxcSE0NJRXX30VESEiIiJffgTb/lzPrT/HEza1MQ6Jxl2wyxWxU+M51Gyrmjfno0DQ6XQ0a9aMkJAQ7OyeiGdV9uiSYdOHqrFU3w1QzAx9mK0dvvrKvFrZ9Pts0aIFixcvtmCg5vNECIUqVarkjVFMWlxGK7php+fUKejYEf24cejbt6duWFja3nLFihUzrYkrVqxIxYoVKVeuHJs3b0ZRFObPn5/2Yc+ePZvk5GRyq+e5evUqycnJXLlyhdFfjQSP+cRsHUXC4VlUeaER096pReFCGaehDrYw9s36uLu7M2aM8WAqeYmdnR3u7u5UqJA5QrRRUoQxp4zPevIUEXVX595Z6L4YnF42u4kOLq9R2S4SbbJpIf5tbW0pX748gwcPJiAgwOz+zMKScE25PR4Px3bmzBn58MMPTQwyZQZHf1fDiCXFWr1pjUYju1q1EoOtrQior5MnW9SWwWAQrVYrP/zwgxgMBnFzc5Mvv/xSREQmTpwoV65ckfj4eHFzcxMRkb/++kvu3r0rMTExMjmlzw0bNsisWbNERKRHjx7ie+WSRO2bLsc/e+5RApp0OS2X7r0gNb9co4YHG7tatk8bJJIcL4mJiXLr1i3RarXy/fff5z5/pwlcu3ZNfvvtN9MreHiI2NuLKIr66uGRd4Mz2v8C9T09ZNnnLSISdnCBDGxUSBLvXTGr3rFjx0xOsoOF4dieiHlagwYN8sYfPswXSlQGByvljQDCwsK4fPkyLi4u2L3+Onh5gUaDYm8PpuzpG0FRFOzs7Jg0aRIAAwYMoEePHgC0bt2acuXKkZCQgL+/6lLi5+dHjRo1qFChQtpU+7XXXkOr1YI2kS3fdIDdPSDuIW2at1OtGqtnTOzyXuMqjO33Ot7e3lRNvgFrt8AeBxzfXUitWrVITEykVq1aODg4cObMGerWrZtn22IlS5akaVMzlOSrV0Nq9CiNRv3fWOKavMDvoGoO/uI70M5yp7CLEfZUKKLgGHkdKpsesbxt27ZcuHCBYsWKmb0bYTKWSJLcHo/PFJKSkuTyZfPScpnEsvYiK7tZrTm9Xi8XL16U8ePHPzrp4aHOEPL7afU4mgSRU4tEfq+rPsX+eEvkdtbRgw0Gg0RERDwKknvwl5SM3OszlZ0wYYKcPHkyT4Ky3rhxQ+7dMzOI6bBhIuokXj2GDbP6uIwS6isyuarIotYiybmM9K1Nlo61CknMju/Mrurm5iZ79uzJsRxPczTnwMBAefvtt817Z3LCYBCZXEXkr2+s0tycOXNk2rRpVmnLqmgSRU4tFvn9+XTC4HiO1a5duyaKoohWm5JCXqdVQ8v/Vknk4TWjdebNmyczZsyw5ujF1dVVVq1aZV4lDw8RBwd1+eDgkD8COSFSZF5jNUlwZECumzt06JBM6V5dtG6Wf+9zijT+VAuFPCHmgfojOb0kV81s27ZNHjx4IBEREU9WFmVNopoVeUa9lFwRXUX8j5lcPSYmRnr06JHx6R9zX03Au6CZ0SdhXFycPHjwQCIjI2XXrl3WuAvLyc8Zml4nsvo9Nez+nZNWafL8+fOyYfQbapZrC2Zgrq6u8vXXX2dbxlKh8ETsPgBMnDjxkceeNbCSz8O9e/cICQmhdOnSBR87AdStsLPLYV4j2PMtlK6pujp//HcG78acKF68OA0aNOD+/fvpTlaCHq4QekN1wZaMuyBFixalYsWKBAUFcfHixVzfysSJE1m71nhQ0xxp2RLGjs0fXcKB8XDrH9U4qbp10hjWqFGDGX/dULc0o7PPSWmMfv36MX36dKuMJROWSJLcHsZmCitWrJDIyEjzxGV2nHVVn6BRgRZV79WrV97oOSxFmyRydrnIzBfV+3J9Q+TWYYueMiIip0+flipVqsjx40aWGocmq32cX51tG76+vtK3b1+LdQ0RERESGhpqUd1848Ja9b34+1urNturVy/Zu2a+2vbVnRa1cfr0adm2bVuW13naZwoDBw60rpdkuJ9qplvcPG/FoCDVnXfixIl5ankYGxuLl5cXALt27eLMmTMAdOzYkYSEBPbt20ffvn1Bp2HgO23YPKgO8tfXVJt0G32/rZx4/keW7L8OisL+/fsJCgpCRDBkkej0capVq8b69etp06ZN5ovtvoOa7WD3aHh4Jcs2atasyddff42iKISFZQ4akh2XLl0iMDAwzdnriSTwLPw1Sn0vssifaSnfffcd4VJMDQsX7G1RG4ULF86T4D5PjFCYO3cu48ePt16DYTfV6DtmxLsTEfr168etW7eoX7++1ezMw8PDuX37NqBaNd6+fZvAwMA0oyU7O7u0uHxTp06lUKFCtG/bmmXD2sD8xix0vsS7LZ+H/tvx8L6J7fOv4/Tcc2l+E97e3kRGRhIcHJwmyE6ePJkmaEQyG0MVKVIEV1dX48FCbWzVZYRjSfhzgBonwAi2trY0bdqUu3fv8uabb5oskABu3bqVd/4u1iD6nppRukRlNYCtNWI2pqDX6zl16hT2hYtB+RfgvmVLsZdffpmuXbsaTe6TKyyZXuT2MLZ8iI2NfaQJtwaznUU2f2Jy8b1790piYqLodKblmswJjUYjY8eOFb1eLxs3bpSpU6eKiIiHh4fExMRkXVGbrOaTnPWSOrVc3lHE96DJy4TUpLh///237Nu3TwwGg9SvX1/CwsIkKipKoqOjRUSkTZs2snDhQjl48GDWjfkfU5PKbhmUY/8ajUa0Wq0cO2a6svOJJTleZElbkUmVs9yJyQ1hYWEycOBA9Z9tw1TlroVLsBEjRmS5e8PTvvug1+tl06ZN1tkL1ySITCgpcniKScUNBoN88cUX4u/vb3GXSUlJIiKyfPlyWbp0qYioW3gm71joNCLnVorMThEGy9qL3Dxg8ZclPcHBwSIisnnzZvniiy9ERGTXrl0SGhoqFy9ezF4QHpmujsfTLcd+bt++LQMGDMjxMzxx4oR88onpAjtfMRhE/vxY/f7c2Jtn3bz99tvi6emp7o5NKCESHWxRO6nfO2M89UJBRGTAgAEmm3Bmy30f9Y2+tDnHohs2bJDbt29b3JVGo5GYmBipWbOm6HQ6uX37dtqP0CR0GpHzqx4Jg6UuIjf3W0UYGMNgMMjVq1ela9eucvr0aSlatKisWbMm6wp6vcjq7iK/lBcJvmhSHw8ePJAdO3ZkeT0pKUn8/PzMHXr+cDRFCB6fnWddzJgxQzZt2qSakAecUvu7vtvi9ubNm2fUZsFSofDE6BQAVq5cSZEipmc7ypLU5C8meEfGxcWZvSZL9eicM2cOkydPpnjx4ly8eBFbW1tq1KiBk5OTCY1owWstLGgKO79Q3W/7bVazWNXtlGceioqikJiYyMcff0zz5s3Zv39/mpfm+vXrM+fdsLGB95ergVM2D4CkmBz7iIiIwM/PL8vrPj4+pr1H+c31v+HQb2rOi9Yj86ybZs2aUaRIETVMfsWXAMVivQKokdDj4+OtN0BLJEluj6xmCl5eXjJgwACLpGUGjkxTpW9y1rOOQ4cOye7d5ktnnU4n9erVk/DwcImNjTVfB6HTqttccxqqY1zymsj1PXk2MzBGmmmziCxYsEBGjx4tOp1OvvjiC0lMTJQrV67IzZs3M1a6c1JkYmmRPweYPNbjx4/LiROZTa179+4td+/ezc0tWJ8Hl0V+c1KXbZq8cwKLjo6WPXv2yNixYx+dnN9UZH0fq/fFv2Gm8Pzzz1vHbTfMV43JmE2ORUdHR7OMkTw8PBg5ciS2trZ4eHhQpkwZihUrZvoOhV6n5oFc0BTch6tBSvtuhCFH1EjL+RS74M6dOzRp8iifZsWKFXFwcMDW1pZ58+bh6OjIxYsX8fT0REQIDU2JvVC9FXT4Ea5sB09Xk/pKSEggISEh0/mNGzcWWFJao8SHw4Y+4FAceq9Tk/rmEefOncPd3Z3Jk9NtcTq9kquZwrZt2/juu++sMLoULJEkuT2yM3MODAyUGzdu5E5ELnlNXQcbISYmRhYsWGCyQnPDhg3i4+MjMTExcvXqVfPHotOKeG8QmdtInRksbiNy7e98nRk8TkRERIb/ExMTjSqsbt68Ka1btxaDwaC+X3q9yNqeIr+UEwm6YFJfBoNB1qxZk7YrcurUKZk3b17ub8Ja6DSqz8cv5UUCz+V5d0lJSdKlSxfRaDSPTp5MMWKKDbGozayMwPg3zBRA3V9PjStoESKq4VIWyWQTExNJTEw0ei09Pj4+AGnGIcWLF+fFF81I/W7Qw8VNsKg5bB+qGlL1XgdDj6kJTQogKKmIsGTJkkx6m3r16vHZZ59lKl+3bl2OHj0KQNeuXfG9dQu6L1HzQ2z+GJKiM9Uxhp+fH5GRajo3JycnXn7Z/KAkecae7yDgBLy7AKpYlpHcVOLj4xkxYgTjxo3LGCnbqaH6auFsoXjx4mlu9VbBEkmS2yNPHaKig1Spe2ZZpkt//vln2j59dmg0Gmnfvr2Eh4eb379eJ3Jxk8i8Juo4FrVSzVjTreMLivj4ePn+++8zzZKioqJy1I34+vqKwWCQI0eOyM0jf4r8XEZk44cmz3gSExPl77//tpodiFU4u1z9jPaPz7msFYiLi5M5c+ZkDlyTGKWO4+jvFrWbmJgo7dq1y/S5klczBUVRSiqKskdRlP2KomxXFMVeUZQViqKcUhTlx3TlMp2zlE2bNjFhwgTLKqc5QmXceRARvLy8stXSBgQE0LdvX+zs7Dh06JB5QUUMevDZAotawLbBYGsP/1sDQ4+rkZALOJMwgI2NDVOnTs0UJs7R0ZHPPvsMd3f3LOvWqVMHRVHw9/fngU0l9C4/ob/iDmeXmdR3eHg4u3fv5ssvv2TJkiW5ug+rcPsY7P4Onu8CHa1oSZsFIsLdu3c5ceIE9+7dy3jRsaQaNdvCmYKjoyNHjhyxXkj8nKQGMBzolPL3YuAjYGXK/25AXeD9x89l12ZOM4WQkBDLHWXOLEsxBglKO5WUlJRZm56O6OhouXTpkuj1ejl50kzXWL1OtYeY/6ra78IWIpe3PxEzg/TExsZKzZo1je5nGwwG+fLLL81yh167Zo181fV51Z34nulr8cDAwHwJ8ZYt4f6qy/L8V0USc545WoMHDx5Iu3btMuz8ZODPAaqtioVMnjxZ7ty5k+EceTVTEJFFInIg5d/ywIfAnyn/7wfaAC5GzllM+fLliYuLY+/eveZXDvNVE5UUf7QP7uXlxZQpU7Kscvr0abZs2YKNjQ2tWpnoGmswwOWtsLgVbB2kpj3vtRKGnYQG3Z+ImUF6ihUrxuXLl4060CiKwty5c2nRogUREREmtde3Xz9+Wr6HaLsK7JzwfsYU8Nnw8ccfs2fPHrPGblWSY2FDX1X31HdDhlR1mbBicNiKFStSqVKlNB+YTDg1hKi7ah5QC6hTp451bHzAdJ0C0BL4B1gBNEw59wYwxtg5I/WHAOeAc9WqVctR8nl7e8v8+fPNF5mr3lV3H1LIzkJy37594urqal77er3I5W0iC5qrM4MFzUR8tj5xM4P0BAYGypgxY7Ito9FopEKFCjJq1Ciz2r5+ZLP83L6wyPq+JukXJk+eLJcuXcqofc8v9HrVHmBiadXtPDs8PEQKFxaxtVVfcxHM5fbt29KjRw/x9PTMWqfi94/6fcppXGZAXu4+KIpSBpgPDATigNQN/mKonpbGzj0ufJaJSFMRaWpKzsiGDRvy+eefm+2SS7hfBn1Cjx490rwF040FrVZLrVq1TNeEGwxwZQcsaa1q3kUPPVbAZx7w0vtP3MwgPUWKFKF169bZlilUqBB3795l1qxZZrVdr11Pxk+aga/HTga90zr1AZAlY8eORaPR0K1bN7P6sQqHf4Mbu6HLVKjlkn3ZI0fUoLB6vfp65IjF3VapUoXWrVvToEGDrO1anFKymFmoV+jYsSOPZ3K3lBz9QRVFsQc2A2NFJEBRlPOoy4PTQEPgBnDPyLlcExYWRvv27fHy8jItQYgmXo1iU25A2qmtW7dmMlKaN28ecXFxjBs3Luc2DQa4vguOTIOQK6rA6bECGrynuhg/4dy5cwcR4e23386xrIODAx9++CHR0dHs3LnTdMVVi8+ofusYgxJ3o9w7R3SJ57OMjTFx4kS6dOnChg0bzLmN3OOzBY7PhMYDoNngnMu7uIC9vSoQchGp+9q1awQFBXH16tXsk/4UKQMlq1ksFHbs2GG9yGA5TSWAz4BI4EjKMQC4CMwCrgElgRKPn8uuTXO2JLVaremek8EX1SnY5W2SmJgo/fv3z+ClGBoaKsHBwRIXF5ezskuvV7cSF7VS25zXROTin6pi8Sli8+bNZi3DDh48KIcOHTK/o4RIkdnOcvvHuvJqk0ZZKtTOnDkjDx8+lMTERPniiy/yZxlx77zIrxVEVnRRXdNNxQpxII8dO2b6EnVDP9XIzQL279+fyQCN/PSSBEoD/wMqZXcuq8NcO4Vhw4Zl7/efyqXN6g/4wWU1Wctj2vRly5bJ7Nk5eL8ZDCJXd4ksbq22NbeRiPfGp04YiKi7OJbg7e0tP//8s/keq/fOi/xcVpJW9hCdRiNXrmROdJKcnJwWT2LNmjV5vxMRc19kxgtqfIq4/A39dufOHblx44Y0a9bMtAdbqpu6BTsiPXr0yPR55atQyO1hrlC4deuWaU+UQ5NFJpSU6LAHGZ52wcHB4pGTtDcYVPPjxW1ShMErqnmyzoqBX/IRrVYrDRs2tEgwLF26VD755BPzXMBTSYkPcHHld9KnT2Ynnzlz5siECRPS/j9//nyaCbTV0SSKLOugOjrd98mbPrLh/fffF09PT9MF38396ncvm3wd5mCpUHhytWPpqFWrFgEBAfz000/ZFwz3hVLVuBP0kH/++Sft9M2bNzl9+rTxOiJwYw8sawcb+6pbVt2XwAhPaNjHqmG48guDwYCNjQ3nzp3DFKXu4wwZMgQ3Nzeio6O5du2aeZWbDYH67/LyneVsmDaS0NBQPD090y6PHDmSiRMnpv2/cuXKvAnLJgK7RkLQOXhvCVR6yfp9ZINWq6VNmzbcuHFDdZE2BQvNnW/fvs3331uerSoTlkiS3B6WmDnHxcVlG7lWREQWtxb9qvfSpmrh4eFZJxoxGFSX5SWvqdJ5zsuqS/NTOjNIz+LFizM8jS3h7t27Uq9evYzZsEwlMUp1DZ/xghzevSMt36WIalK9fPnyXI3NJE7OUz/Xw1Pzvq/HuHDhgrzxxhty7949CQw0M5r4jHoiWwebVSUyMtJoxiie5lySplC0aFHee+89tm7dStmyZXF5XBtsMED4LXYGV2T30KEsW7aM2NjYzFuaIuB7AI5MgeALUKo6vLtQDaxhW4inHYPBwMCBA3MddKNq1apcvXoVEdU8t2rVqqbvRjiWVA25VnTCJXw1Lt9vTpu1lC9fPpPzzqhRo+jYsaP1til9D6i5Gup3VyNT5yMigrOzM87OzpQuXdp8gyKnhmbPFGxtbencubN5/WSHJZIkt0duHKKOHDki3t7emS9E3hWZUEL0Z5ZLSEiIrFq1KuNazmBQ12zL2qtPkNkvqXkNdAVgRJNH3L17V9q0aZO1Ka0FDB06VBo1aiSXLl0yv3Kqw9GxGbJw4ULZv3+/0WIBAQE5pkAzmZAbarrAxVbI92gmBoNBXn/9dbly5YosWrTIsnijhyarwXLNGPsHH3wg7u7umc7zb1Y0Po5er5epU6dm9I/wPSg3Pi8qO5ZOEq1WK99++63qEWkwqAFQl3VQv6CzXlIDpP6LhIGIpFnKPW7/nltCQ0NFq9WKXq83X2mZGgR1Yqk05dmBAwfk559/lpUrV2YoeuDAgVzFyhQRkYQIdbdoem31IWEBqQL18uXLotVqJSYmJi2gryk/8qVLl8q1a7mIAH3tb/V7eveMWdWMjc1SofBUKBofR1EUSpcundEnPdyPeA143Y4gODiY6dOmUSLEE1Z0gnVqWna6zYUvzkOTAf+KpUIqer2e1q1bExwcTPXq1a3adrly5dDpdDRu3Jg33ngjLT6lSSiK+p6XrglbBqKLus+qVat47733eP/99zMU9fPz4+HDh5YPVK+DzZ+o/gO910Kp7CM73bp1i6SkJHx9fRk1ahQA33zzDQsXLgRg2LBhxMXF4ePjk+Y3M3DgQDZu3IjBYGDQoEFotVqio6OJjY1l7ty5uLq64uDgQHJysuX3kapsNDFBTEBAAOvWrbOehyQ8nTOFVBISEmTQoEGywcNXWo7fLDW+3yXOP+yQ3+YvFXHtlDIzaKCGJzfHaOUpIjU+hNnp3M0kICAgLbeD2cqz+5dU46FV74rodZKcnCwLFizIlOcjLcKTJewZk2Oqu0uXLsnWrVtFRKRnz55y+fJliY6OlsOHD4uI6v+RXf9arVaSk5NFo9HI+vXrRURk7dq18s0334i3t7eMGDEiU1QrszEY1MzW24ebVPz69evi5mY8/D7/pZlCKo6Ojji1eIefd/sSnFwYQSFGb8fae+XY8aA8vDVLnRk0/QTsrJ9e60mgZ8+eeHt7U7ly5Tztp1q1aly6dIkOHTrw449mhsyo5Axdp4H/YTg+k5s3bzJ37lxCQkIyFHv77bc5f/68+YO7sAZOL4IWw6Fx/wyXRIS+ffumRX5Knels3ryZBg0aUKJEiTSldaFChbJ94trZ2WFvb0+hQoXUlH5A6dKliYuLQ1EUrl69iqIoeHl5sWyZaXEmMqEoZikb69atyyeffGJZX1nwVAsFRVE4FFaMRG3GdGWJOPC77n9Q4jk16EpCRKYMyk87R48eJTk5GXd3d1555ZV86bNRo0asWbOGFStWcPfuXa5evWp65cYDwPl/cGQKLxWN4ObNmzg6OqqKrRRWrFiRIaisSdw9DX99BbXaQ6df0057eHgwefJkFEVh6NChODo64uzsTK9evcxrPxuio6Np3LgxTk5OODs7c+jQIUqVKkWJEiWoUaMGoPp6pAW/NZXnXoHQa6BNyrH/OnXqmLekM4GnZksyK4KjjMdbDE60USP0plKoiJoXsGRlKFkFSlRR/y6R+n9lcCiWT6POPRs3bsTJyYnnn885t4W1sLGxoXr16vz555+sWrWKdu3aUb9+fdMqKwq8PRvue8PWTwnvtZMXX32N7du3p3lwli5dmq1bt9KzZ0/T2owKhE0fQqlq0OsPsLVj8eLFdO7cmVq1aqU50WXavrYCHh4eTJ06ldWrV2eK0FW7dm1q166NiFCpUiVKlSrFuXPncHBwwNnZOefGnRqCQac64FXOWkiWLFmSCxcuWC3naSpPvVB4rlRhgowIhudKOMBH/6iJQqPvQUzQo1ffg6rikcdmD46lHgkIY8KjROUCXYaICCNHjmTMmDFpyWkLgp49e9K1a1f0ej3u7u7cu3ePESNG5FzRoRj0WgXLO1D2yLfs3LGd5i1bISIoioKdnR27d+/mnXfeyTmbsiZetUDVJSMDNnDi3GXatm1L2bJlAahUqRKVKlWywt1mJDQ0lMuXL9OgQQOKFy9OkSJF+OKLL4yWVRSFYcOGAaq3qoODAy+99BIhISFUrFgx607SWzZmIRREhHnz5jFkyJBc3Y8xnnqhMPqN5xm73YekdEuIwoVsqBR2Ab+kntRp0NR4RZ0GYoMhOuiRwEgTHkFw76zxaELFKj4SGhlmG1XVv4tVzBOXaj8/P+rUqUOnTp0oXbq01ds3BxsbG4oXL862bds4evQo3bt3B1TT3gw7QsaoWB/emgHuI2hUqRkzZ57iwoULrF+/HltbW9zc3HIegAjs+AweXoF+fxLjUImZM7+nRYsW/O9//7PCHWZNYGAgR44cwcXFhU8++cTkVPCpsx8fHx+++eYb9u/fn3XhUtXVB1Q2eoXk5GQiIiJwcHAwa/ymoEgBrLWbNm0q1ggIERAQwIABAyj+UgeCyjYhMhmeI5RvGxsoXLIyLi4u3L9/n/Lly1O0aFHzO9DEQ0ywGqMhvfBIEyJBoH3MctDGTg0Fl7osMSY8ipQxK8R7ZGQkb731FkeOHDH5S5ifXLlyhdWrV+Pv78/mzZtNq7T9M5LOr2fgpVeZNHc5NWvWBGD//v38888/TJs2Leu6R6bBkclcqD6UWf8Es3btWivcRfbs2LGDy5cv079/f3r06MHZs2exsTCwjl6vR6vV8tVXXzFz5kzjVo+r3oHkGDVZkBHi4+Nz/E4rinJeRLJ4KmbNUz1TqFatGn/88QfFixfHwcGB4sWLw+p34c5lGHUJ7B1YvXo1devWpU+fPuj1etOCtaRiXxTK1VUPY4hAUlQ6gZFeeASpzjhX3cGgzVjPzvGx2YYR4eFYAg8PDzZs2MD8+fM5efKkdfeirYidnR0tW7Zk7NixREVF4erqyqhRo7J/r9+agWPwBdaXvENSMYWvv/6aSZMm0aRJE+rWzeL9Bri6k4QDkwiu/BbOH/zGT62yiHloJa5evUq5cuWoU6cOISEhVK9enWPHjlksEEA1SxYROnToQOHChYmNjVW/u+lxaghnlqg5Rx+zqYmOjubVV1/l0qVLpjtbmcFTKxS8vLy4desWXbt25dKlS7Rs2VK94PIDuL2hpjZrPZLx49Xw3cePH2fmzJns2LHDeoNQFChcWj2y8sIzGCA+FGLuGV+q+B+BuAcgj5Y/G3y0vFSlBM7Vq1GmainYNRIlVWCk6jxKVM7T9GbGb0Ud4+M/iHr16lGvXj0uX77MsBf+MkMAACAASURBVGHD6N69O7a2tgQHB+Pk5GRcmNkXhV6rMCx1oXnjl/l09C/o9XrKli3LgwcPSE5Ozjw1fuAD24dyOLYWx/yfY5q9PfXq1cuTe9XpdNjZ2bF161YaN25MgwYN0rZQrREg1c7Ojl69eqHT6Wjbti179+7NqANxagh6DYRcA6eMIQNLliyJj49PniwdgKfXeMnb21vc3d3F19dXBg9+zKtsdXeRaTVFkmIznA4PDxeDwSDdu3eXBw8e5HoMVkOnkfigG7J61k8ilzbL9kkDxWfhADUY6uI26r1MKJH5mFZLZElbNWLP39+KnJijBpoJOCUSFWi2x+exY8fEy8tLRET69esnsbGxcuDAAeneXU3B179//7S09YULFxaNRpNmtiwisn79evHy8hKtVivjx4+Xtm3byvXr17M3SPLeIBHfFRc5+Itcu3ZNIiMjpUePHuLr65uxXGyInB1VSzb3f04NnJKH6PV6cXZ2luDgYFm6dKmMGzcuT/tLDY6yf//+R4FdQ32NGmOdO3cuxyC8qfBv95JMz507d6hXrx4NG6pa2kyGIi4/wIrXwXM5tPkq7XSZMmUQEb799lsqVKjA+vXriY6ONpoyLb+4ePEiOp2Ol19+mXN3ounzwrt0dzayJadNTNFvGNlNCb8F/kdBE5uxjmKTTr+RcTdl15lbNG/XiRidPR8NGICHhwcPHz5MiyP44YcfYmdnx2uvvZa2Zbh69eq0pqOioihUqBAvv/wyzz33HAAajYYiRYoQGBjIwoULefjwIX/88Qe///47zs7OjBxpJL17wz6UvnOCxbMmc8LmCEO/ncCWLVsyltFp4M+PcNRG4djxJyhu/V0FUHUjf/zxBzNmzKBbt27ExcXxwQcfWH3L73GKFCmCiLB+/XoaNGigvp9laoF98RRl4yODrNq1a/Puu+/m6XieypnCd999l2auOnv2bKPpzmXN+yJTa4gkxWTZTnBwsNy4cUN0Op288sorEh0dLTExMXkeIiwhIUFGjhwpBoNBtm/fLtu3b7dOw4lRIg+uqN6gnm4iB38R2TZU5I+3ROa+Il6flZaZbziITCghUzs6yLURRUU7oZyE/tZALbN1iMjBn0XOuorc2KemZ0+ItCgZbuoTr1+/fjJ16lQJDAyUpk2bSocOHSQmJiajibMmQQ6NrC93xlQRibonJ06ceGS6azCI54z/ybi29uosKA+YO3eunDlzRsLDw+XXX38VEZG///7bsshTuUSr1cqiRYvU98etq8jy19Ou7d69W27dumVyW/yXZgrpNdPNmzc3buLr8gO4dlDTmrX9xmg7Tk5OODk5ISJs2bKFEiVKsGrVKi5evMisWbNYsGABPXv2pHz58uqbZY6SMoXo6GhOnTpFly5dmDJlCuXKlePTTz/F2dkZnU6Xtp1nFRxLqkdF1aBIUvb/X3/9dRYt2kSFHkVxPu8BTevwfe9H+o1yqTOOOycg9r4avj499sWy300p8RzYZ1xnpz5d161bB8CuXbsoX748v/zyC+vXr8fNzY1Jkybxwgsv4OTkRPsfdxA19zVGvNcSTa036JNiRszZ5dQN3UPXHv3B2AzKQkJCQpgxYwbTp0+nbNmyxMXF4ejoiL+/PzqdjjfffNNqfZmDXq/n/v37aLVa7Jwawrk/VGcvWzsCAgLSZmV5iiWSJLdHbmYKH3/8cdq6V0SMplBPY21PNT2YmYEwU9fA8+fPl4iICPHw8JC2bduKiMj06dPTfNdHjx4tkZGRaWu8ffv2ybJlamLbLl26yKlTp+T+/fvy+eefi4iaOiw1aGleYjAY5OjRo9K3b18RUZ2ZTI6xoNOKRN1TXXd9toicmCuy+ztVb7G0neqWbEy/MbWGGsNgXW+Rv74ROT5LjX5956RIxB2R/7d33nFVlf8Dfx8QRJaae+eeaaa5Wmpq5WhoWWlqallmw9yWs1JLzUzNHJmlln01FVduwQGKC/dCQREQENn7cu/n98eBi8AF7mLo775fr/sCzjnPcz73cM7nfJ7n+Yz0NElJSRGdTictWrQQT09PuXr1qjRp0kTq168vkZGR4rPmOxnxlIP877f50mnOAXl84nZp+NnvsnHRBIuK7aSlpcnt27dFRP2fbdq0SVJSUmT8+PGi0+nkzz//1Ac4lRRCQ0Nl/IxZ0mnianl84g5pO3OXbDljWtAbZloKD52fwuXLl6lbt64+x32NGjU4e/as4VyEIadhZVfoOgWeH2+JyPq8h/7+/ri4uFC9enWWLl3KkCFDWL16NZ9++ik3b97U+8PHxsbi6upa6OPRnLz77ruMGjWKNm3akJCQYFaOxgLRpORw/MqxFBsXbKBMvaLOBbjXIKVMVZwq1mG9712OXg1nzrSJfL1wDVcDgniyVRO22HUm3S5rZaW0Pfzw5pP0aVk1z+spGVZRWFgYiYmJ1K9fn2nTpjF8+HDi4uL4+uuv2bZtG3///Tdubm707t2bAQMGsGzZsjxrVFiL5ORk7t+/T82aNTl48CA1a9akUaNGzJgxg2nTphEYGEhAQADdu3cnJCSE8uXLs97Hnzn7b5NO1vct42DHnL4teb21ccFv5vopPFRKwdPTk1atWmXzNc+UP881/L/fVoNmRp9XTetHkHv37jFjxgyWLFlCSEgI1apVK3JllIvU+CwFkZfXaHqy/mEeujWZud1deEl+Jsq+Qq7uajgmUf6/cXz6Sgs6Nq5C52nbaNegMm91qk/7RpWpN/Jv7v3xPpuOBXArIp6xr7Xip+3n6dK8Og2qlaXztG2cnNsXn6thaHXC880LxwxP1+qIT9ZQ3rU0w5Z4Mm9IRy7fiWbVgSv88VlXVh+4StOa5enQuAoz/3eKqW+14fTNe5y9FcmH3Zsx4tdDvP1MfaakD+KuJrdzUo1yZfCe1NUoWf5fKIVx48YxcuRI6tevD6iefgcPHqRfv355Nwr1gxWdocvXRZ6vr7C5cuUK0dHRdOjQgc2bN9O3b1+LnGqKFBHVjTzHakrdA08jGFDwoiOwymQO+icSkZBOhzrOrDsdw1M1y9CzqSvD/xfCgteqceFuCvM8I9k2vA4LvCJpU7MMLzRw4Wp4Ko0rOxaKA1hauo591xPp1cyNnw5FkpSm4+vuldl3LYGOj5fBtbTpCrpu+BzD1wG4NrObUT4Kj7xHo4gwf/78bNsSEhI4f/58/kqhemto3BOOLVHTj5cpV8iSFj6pqak4ODgQEhJCeHg4nTp1Mj6ysKSgKKq7t/Nj2Zxzqvps525y7ofhsTJ2KGMuUvnCBRxjYqj73HM0WL+eKg0borRtS99GO3Do0oV2pUrxV1oauLkxJms1miaF8BX8/f1JTEykRYsW/D1kCF0//o3Ro530iqe7BX1XmbWPsPi0XNtLp6u5G86fP0/p0qULxXnrIXmtQJ8+ffDz88u2rVatWsycObPgxp0nqWNc32WFJF0R8EBZ9I8//pidO3fSrVs3Bg4cWNySWY+ECIYl/0EpXfZ0ZvZo6VoxAYAWLVrw3HPPAer8Sdu26ouwd+/euLi4ZLm7FyInT55ERLh06RIXLlygVKlS/PXXX5QpU8ZqlkiLyP2U0mXPp1DGwY4fBj6Lo6Oj/twiwokTJ6xyTj3mzE5a+jFn9SE8PDzXSsPFixf1M/sFsn6AyOxa6rr7w4aPj+jKlBGtooiuTBlJ2LfP/LRlJRWdTm4t7CmJUyrKFi9faTrhX6kzYbs8OX6tvDhskqSnp8vBgwdl8ODBxSZiYmKi6HQ66du3rwQFmZcYtiDCw8Plgu8R0c2pLZt/+lw6fbVOHp+4XTrN2S+bTuU+Z0hIiLz22mui1Wqz1U0VMX/14aFQCn5+fnL16tVc26Ojo+XkyZPGdXL3vLp0dnCWSecuCWhnzRKxtxcB0dnbq0VPHzVOrpJvOpeWdTPeFxHV5XfjrA/FZ5izSPApiY6OlsWLF0tQUJBoNBrx8vIqUvHOnTsnzz//fKGfZ/v27TLv/U4iMx8TCb8ssqS9yD/viYhIz549873fu3Xrlm1/oSoFoApwJOP3Gqil570yPpUytq8CjgFTCurPVKWwbt06g15/aWlpEhkZaXxH/wxUawIkWZhcswhJTk6WIY0aia5MGVUxlCljURXkEknkDdF9W0Xkz1f1/ggajUZ0SdGS/k1V0W76WEJDQ/XFgQMDA2Xo0KFFYi0dPXpUNm5UPSlzvomtiZeXlxpXEnRCfXntyYi3eEAphIeH5/udM2MoNm/eLIcOHSq8xK2KopQH/gQy10faA7NEpHPG556iKH0BexHpCNRTFCWf2FfTGThwoEHPv6tXr5qWc++FSWqM+rFfrChd4XHp0iWcnJz47sABlAMH4Ntv4cAByIwIfRTQpiObPqTr6hgCWk2CjNWT1q1bcyUwlO7/luLMvv9RrWxpRo8eTVBQECNHjuS3337j/v37fPHFF1bPUQhqHIdGo8HNzU3vx5DpG2NNRAStVkvlypWpVaM67BwDbtXVezUHlStXZvv27XkmaMmM3ixbtqxl8yoFaQ3AHSgLeGX8PRc4DZwBZmdsWwT0zPj9HWBofn2aYins379fRo8ebfTxBfK/QSKzaogk3rden4VAXFycvPDCC6aXg3/Y8JwjMt1dAnf/avAtGH8z48159GcRUb01L168KCJqVGfmW9yaVbFERL7++mtZtmyZVfs0xIIFC7JqbR5frn7Xiw/UTH3AUhAR8fb2llOnThnVN4U9p/CAUugCuAH2gCfQEnXo0Cpjfw9gkoH2I4BTwKnatWsbfdESEhJyh9FmoNPp5McffzTNjAy7JDK9rBr4UwLRarWyevVqSU9Pf/QmE3Ny56TIjPKyfnQXiY7OmgBOT0/XFwZOTEyU34e2UAsAP/DgJyYmyssvvyzx8fESFBQkzzzzjFUUw7lz5yQsLEwSEhKsrmge5O+//5bg4GCJjY1VS+bFh6sT4X++lj0ALYdSEFG/uzHDZnOVgjlLkj4iEi8iWsAPaAgkAJm2lSsGljpFZIWItBWRtqa43l65coXatWsb3KcoChEREWg0GoP7DVKlGTR/HXyXQ+J949sVERqNhkuXLpGcnFxiMy1ZhbRE2DwCca3KKWmezQMzJSUFX19fQK3FcDa1FhIVCDcP6I9xdnZm165duLq6MmnSJGbMmIGdnR0JCQkWibV7927Onj2Li4tLoTiChYaGAqqPTVxcHO7u7mqKvb1TIT0Zes4vMFXfggUL+N///md12fQYqz3IshS8gGqAM3ARaAwMBsZl7J8JDMivL2OHDzqdTnr06KGvgmQ1wq+o1sK+6dbt1wJ0Op18//33Eh4eXtyiFA3bR4tMLyvaG0asImhSReY2EFn3lsHdFy5ckLS0NFm5cqU89dRTZolz9OhROXbsmFltjUGn00lycrK0aNEid1Bc4FF12LD/m9wNDVgKxlqQFKGlMBN12HAcWCYi1wAPYJCiKAuA/sBOC/SUHkVR2LNnD+7u7nkeM2rUKI4ePWpax5WbQIu+4LsCEiMLPr6IeOyxxwovxVZJ4voeOPU7dPqUFz+Ywblz2bMWHzlyRJ9GD2DhkqWsDGsO/nsh+lau7lq0aIGDgwNPPvkkM2fOJC0tjeXLl+sTxhhDXFwccXFxZn6h/Dl48CDDhg3DycmJc+fOZZ8E1Gpg51goWzvPEP+cKIrC8uXLOXLkSKHIa7IWyesDlEdVCFULOtZYS2HXrl369F954e/vb144csRV1VrYO9X0tlbmn3/+EW9v7+IWo2hIuKe+9Zd2EtGkSExMTK6akhEREXLu3Dn938HBwRIZcEFkRnmj/l/z58+Xdu3aiU6nk6NHj+abmCQ4OFhWrVpl/vcxQOZcRP/+/eXEiROSkJCQd8Vu70WqlXBlp+H9BiwFEZEjR44UmHCF4q4lKSLRIrJBRMKs1WedOnUKrIBUpUoV86oVV2qsJu04sRISTCzrZWXKly9f6OG7JQIR2Pa5mgG77wqOn/IjODg4V/IajUZD06ZN9X9XqVKFgMhkaNJTrRtZQDm1L774Ah8fHxITE7l8+TK3b98mNTWV8ePHZ77A9KSmpubaZg537twhNTUVX19fevXqBcD333/PU089hYuLi+EQ9rhQ8PoeGr2sfjcTePbZZ3F1dbWK7Dkp0bEP9erVo127dvkec/LkSX35cJN5YSKkp4DPz+a1t5CQkBBWrFhBjx49aN68ebHIUKT4rYVrO+HFaVClOTdv3iQsLPc7ZMKECfj4+Oj/FhHGjRtHeuuhkBwFl7bke5pSpUphb29Pv379aNu2LV26dCE1NZWmTZuiKAqzZs1ixYoV/Pbbb5w+fZoBAwag1WqNesBEhNu3bwPg6+vLH3/8AcDnn3/O1atXad26NRs2bACgbt26+Yew7/lKLQ/38vcFntcQvXr10stiVcwxLyz9GDt8qF27duHnydv0oci3VdQloSLm1q1bVjddSyz3b4p8V03NBWnuUp9OJ7KojciKLkYdnunjkXN4EhMTIyEhITJp0iR59913JTk5WbZt2yZvvPGGiIhMnTpVPD09xc/PT8aOHSsiIpMnT5b169eLTqeTBg0aSHJysly9elX27dtn3ne5cVAdNnh+n/9xeQwfjIFHMfZBp9MZNdP67bff6tNtmcw9f5EZ5UR2f2VeezPZunWrxMfHF3zgo0C6RuS37uo6fMwdEVFddrt3757r0MDAQINOQ0uWLJGzZ8+KHPtVfZiCTxt16sDAQGnfvn22++ju3bsGA5oyk81evHhRIiIi5P79+/pYgrt371ovlZ4mRWTRUyILW4mkFZAkOB+lcOHCBb3zliHMVQoldvgQGxvLv//+a9RaffPmzc2fta/YAFq+DSdXQbwZcxNmICIcPHjQ4jX1hwbvn+COL/T6UU3+CpQrV44ff/zR4OGGXHTr16+vrkI9+a5aQfzkKqNO/fjjj7N9+/Zs99HRo0cNlprLNPWbN29OpUqVeOyxx/Sh2VWrVrVeSLbPYrh/Q/VJsKCgj6IoheLiXWItheDgYJk61fiVAYvcgSNvqDPbu4wrsmEJKSkphRZ2WyIJPq1G/G0cmn1zcLDBGXl9MRQD6N/22z4X+baySa7qU6ZMkUOHDuWf6LcoiL6tDlf/GWjc8cUwfCixlkKNGjX45ptvjDr26tWrvPDCC+afrEJ9aPWOunYeb7XFE4McO3aMGTNmFOo5SgxpSbB5BLhUVq2EB/j333/Ztm1briYtW7YkODg41/Zly5YxZswY9Y+nP1QniM/+ZbQob7zxBq1atdKXGSw2dk9WPRbNnFzMSbNmzYiPjy/4QFMwR5NY+jHGUvj333/l559/Nkoj6nQ6SUtLM+rYPLl/U7UW/ptgWT/5kPkWfORjGjLZOU4d/9/0NLpJbGysweuTkpKSfcJw1UvqmNyEScs7d+7IkiVLiu/6X9ujXo8jC4xvU4ClEBQUlGeMBo+apdChQwdeeeUVo45VFIULFy6wc6cFjpSP1VPHq6dWq+vHhcCQIUPYv3//ox3TkMmN/Wohng6fQL3OuXYvXLiQoKCgbNv27t1LWFiYweuTkJCAt7d31oanP4DoQLh50ChxNBoNkydPJjU1tXiuvyYZdo2Hio2hwyirdRsfH09UVJTV+oMS7Kfg6uqavQpvAeh0OtMCowzx/Hi1OtLRnyzrJw+WLFmizy/4SJMUBR6joFJTeHG6wUPKly+fKz/BnTt38nQ1vnfvHrt3787a0PRVcKmk1gs1Aq1WS58+fRgzZgyBgUaWr38gL6bFHF2oumj3mg+lHC3vL4O//vqLS5cuWa0/oOQOH2bPni2LFi0q8LgHscowYuunIt9UVKskWQmdTidfffWVREWZkfHJx0dNv/awZFvS6VRzd2YFkdBzBR+fgVlhyvu/UV3VowILPPTKlSsiok5It2nTRhISEvJv4OOjZrmyRrar+zdFvqkksnGY6W1tE41ZTJ48mc8++8ykNhMmTNB7mJnNc+NAdHB0gWX9PIBWq6V27dr5BnYZ5NgxePFFmDpV/WmNN1Zhc249XNkGXb/Olro9J+3bt8/mjffTTz8xd+7cPI+/desW48fnqPLVdqg6aXdqdb4ixcXFMXToUDQaDc7Ozpw8eRIXl9yFVrLh5QVpaaDVqj+9vPI/Pi9E4L8JYO8IL80yr498WL16tT7M3GqYo0ks/RhjKRw6dEiOHz9ukmaMj4+3ziTSts8zrIU7Fnel0+nk0qVL5jWePVufsFUehoStUbfUrFarXhbR5r20KKI6Lz04cZiWlib37+e9xBgVFSV79+7NvWP9ALWOZUFOQDkYOHCg6gyVF9ayFC5vUycXfX4xr30BlsK+ffvk2rVrBvfxqFkKCQkJJCYmmtTG1dWVHTt2cMzSN+pz41QNf8Swc40pREREMGrUKHQ6nemNO3cGR0ewt1d/du5ssTyFhk4LWz5Wf39jGdjlXxXpzp07euetY8eO4evrm60cYE7Kli1Lly5dcu94+gM1HuKyR55thw0bxv372RPqfPXVV9mCrnLRsaOaD9OSvJhpibBrElRurhYiKgS6detWYNCgqZRYpdCzZ0+6djWuZt6DlC5d2qyS8dkoVwueGqRG5MUEFXx8PlSpUgVPT0/zsvhY48YsKnwWQZAP9JwH5esUePiff/6pX31ISEgocK392LFjvPjii7l31OsMFRqq0a4GEBFee+01ypcvn217s2bNOHjwILGxOQvhPkDHjjB5svnX/fA8tZZmrx/BvnCKsXXp0oWTJ09at1NzzAtLP8YMH9avXy9z5swp8DhDpKamWu6nHnNHHUJs+9zsLiIjI+X1119/9P0SQs+qE4v/G5Q9v6ARJCUlWX59ji1VTfSQM7l23blzR82BaIBp06bJ5cuXLTt3XkRcU6/J5o8t66eA4UNSUlKek+s8asOHrl27MmjQILPazpw5k/Xr11smQNma8NRg8FsH0eaFp7q5uTFx4sRH2y9Bk6x6LTpXgN4LC8wvmImHhwceHh789NNPzJs3r8DjL168mPcbsVVmPMRvuXbNnTuXXbt2GWw2c+ZMmjRpgvr8WBER+G8sODpDd+O8cs07jbB3717LLWNDHRf1xxhLISUlRa5fv17gcYbIGSprNjHBqrWw1cjSdDnw9PQs1IzAJYJdk9S3tL9pIcRnzpyRM2fO6HMXFsR///0n69evz/uArZ+ZHA8hIvLaa6+ZPKFdIOc3qtfEd4XlfeVjKSQlJUn//v3zbMqjFjrt7+8vffr0KfC4vPDx8ZExY8aY3V7PznFqQI8Ra+EPEhcXJ3369Hm0lUJmToCd48xqPmbMGH0NB4vJLAvovVi/KTw8XObOnZt/s7t3rTu8S44VmddIZNnzBa7AGIXNTyGLBg0aGAyYMZbmzZszZMgQywV5dgwo9uqkkQm4ubmxbdu2QkkTXiJIigKPT6BiI+hmROXvHCQkJPD777/nmb4/J5MmTcq/unLVJ6BWB3UIkbHSo9PpqFy5cr79VqhQgX///ddouQvk0A+QEA69FhS4AmMpv//+Oxs3brR6vyX6jv3mm29MXpbMxN3dnYYNG/L3339bJoR7NdVJ5ux6iAowutmIESPw9/e37NwlFRE1A3FiBPRdqY6dTcTT05PQ0FCjcxS888471K9fP/+DMuMhAtR4iKpVqxb4YrC3t2f37t2kpOSf99Eowi/B8V+hzRCo2cby/grgmWeeoXXr1lbvt0QrhYoVK1qUREJRFI4dO2ZSqm+DPPsl2DvA4flGNxkyZAi1atWy7LwllQsb4dJm6DwZqj9pcvPk5GQ2btzIhQsXjE7PX7FixXz9GABolhEPcUKdcJw+fXqB+Tvt7OxYtWoVTk7mJzsBMhTlOHAqm2e8hzXR6XQ4OzvToEEDq/ddopXCJ598YlG2GycnJxYvXkxkZKRlOf3dqkLbYXDuH7h/s8DDQ0NDadKkieU3Wkkk5o5689dqD8+MNrl5bGwsWq2WNWvWEBcXx717BWfSjomJ4aWXXiq481Kl1RWj67sh+jYTJ040agh59uxZBg4caIz4eXPuH9VPo/tMcC5AeVmBoKAgBgwYUCh9l2ilsHLlSiZMmGBxP/PmzcPT09OyTp4ZrfqvGzG3sGXLlsIt61Vc6HTgMVKNJH1juVkOOZs2beKHH34AVG+8N954o8AlwXLlynHp0iXjlnbbZMRDnF7NuXPnjLI0GzVqZHRCH4Mkx8C+qVCzHTz5nvn9mMDjjz9e8ovBmPIxNnFrfHx8no4nppA5u2zM0le+7P5KTfJ6z3DB20eezMIlp9eY1TwzycyDKzLDhg2T7du359tu69atppV0+/tdkR/qypdffGb06saVK1eyFbk1iR1j1fvChKhQETEuAjaP1YeJEyfmGysi8giuPgC4uLiwY8cOi5NTKopCYGAgzz33XIFvpXx55guwLw2H847m02q1jB492rxYh5JM2EU48A006Q2tTX8bpqen07ZtWyIiIrKtyMyePbvAZDoODg6mOei0+wCS7rNg6DNG19NYtmwZly9fNv4cmYSehVOr1BRx+USF5sKCCFgRoWHDhoVWQKhEKwVFUdi1a1f+/ulGUrduXfbv3w9gvmJwrazecBc2QqThlQWNRkPz5s0fraVITYrqtehUDvr8bLTXYiYiQqlSpdi9e3euJcIqVaqwefNmIiIi8mz/8ssv67MqG0XdzlChAd9O/4obN24Y1WThwoV06tTJ+HOAOpzaORacK0KXr0xra0FodlBQEMOGDcu/0IwFlPg7d+XKlQXPOhtJ2bJlmTNnDsuXLze/k05fQCkndT3aAKVLl+bDDz80v/+SiOd3EHEJXlsCLhVNbj5v3jxWrVpFlSpVDO4PDQ3NM6VYeHi46dWz7Oyg7XDauNzFPcm4gLbAwECmTzdx1cBvDYScgh7fQplyprU1MwJWROjfvz9379417XymYM6Yw9KPsXMKImohzQkTrJdMNSIiQhITEy3zmB/4kgAAIABJREFUYtszRc34E3E1164ZM2bIrFmzLJCwhBFwWP2u20eb3UVERETeBVYzSE1NzdM9vaC2BkmKFvm2img3f2LU4dHR0bJlyxbj+0+IFPm+jsjvr5gcBKbHzDmFwi5Fb9xBUAU4kvG7A7Ad8AaG5bUtv48pSiEyMtL8JCV5oNVqpUePHnLr1i3zOki4p5ZAy1HLILPvYq8tYC2SokV+bCbyc2uR1ALSlxng0qVLMnCgcfUN3nvvPdmxY0eu7R4eHualsRORT3s9Ib/2cRNJMq69Vqs1/mWx9VM1+3eYde/NXDygFFJSUuT11183urKYuUqhwOGDoijlgT+BzPxVnwGnReQZ4E1FUdzy2GYVKlSoQLly5QgJCbFWl9jZ2fHzzz9Tu3Zt8+YXXCpCuw/h4maIuJJt16FDhyzziShJ/Dce4u9meC0WkL7MAI0aNWLs2LFGHbt8+XJ9teYHOXTokNmTtguWruaj1sBZ47xaa9SokSsZi0HunIQza6DDSKjSzCzZzMHBwYHRo0fj6upaqOcxZk5BC7wNZN7pnYENGb8fBtrmsS0biqKMUBTllKIop4xxWHmQf/75By9zc+TlQZMmTbh79y5du3Y1b3Wj0+fqg5JjbuHgwYPG3VglnYub4MIGtTK3iS67KSkpdO/encTERKPdcJ2dndm1a1eu+Z4FCxZQoUIFk86fSZhSmSMpjbPFQ+RHUFAQFSsWMGei08LOMeBWDTpPMksuc4iLi8PDw8OyokdGUqBSEJE4EXlw+t8FyHxtR6EOLQxty9nPChFpKyJtK1WqZJKQY8aMsdzjzADVq1dnxYoV2Nvbk5aWZlpjlwpqiq1LHhCetZT17bff0qRJEytLWsTEhcKOL6FGW3jOuDd9JlqtFicnJ+bNm2fyklmjRo1o3769/u9x48bh4ZF3mrWCiI6OxjulgRqzElCw85qvr2/Bpd1P/Q5h5+Gl2VDaagZxgdy7d6/IKluZs/qQAGQm7HfN6MPQNqsyfvx4rl27Zu1uadiwISdPnqRv376mN+70GTi6wqGsEmCvvfbaw+2jkOm1qNVA3xUmeS2KCC+++CL+/v48+aTpMRH169enadOm/Pnnn4gIkyZNsujN2LJlSyb/+Ie6ZGggAUtOzp49a7BknZ6ECDjwrZoCrvkbZstlKkGRidSuXbvIyg2a8/CeBp7N+L0VcCuPbValV69eeS5pWUrbtm1Zs2YNGo3GtLkL58eg/UdweSuEXUREGD58+MPto3BiOQR4qW/CCjmiEvMpjhIerlbsXr9+PQ0bNrRIhPPnz3P69GkiIiJy5VY0lVFfjOFc2R5qPEQB+TY//fRTnnnmmbwP2DcNNElqtegizKY1d9sl9u7dW2TnM36ZArwyftYBLgE/AycBe0Pb8uvLlNWHBzl37lyhzuwfPHhQhgwZYlqjxPsis2uK/DNQdDqd0TPDJZLwy2rRkr/6515mKyDl+SuvvCJnzuTOkWguK1askKVLl1rcj5+fn8Tevqi6Ie+bke+xS5YsMbgCIiIit7xVF+/9My2WyRQSfmwruvUDzVpCp7DdnEWkc8bP20B31OXHbiKiNbTNKhorBwsWLCjUHAVdunTh999/JyIigrVr1xrXyPkxaP8xXNlO6q1T1KlTcCbjEkl6Gmz+UB0nv7o495vQgAeeiPD333+TmJjItm3brBbbLyIkJSVZJcq0RYsW3IrRQqOX1RWD9NQ8j33hhRdo1szAaoJWo3oulq2tpv8vIq5cucIrS9Uhc1Hm+TTLzhWRUBHZIA9MQBraZm3++OMPWrRoUVjdA+pyZXx8vGmu1R0/gdJlcfJd+PCuPHjNhrALqkJwNZCtKA8PvOvXrxMVFWXV5KGzZs3Czs6OoUOHcvXqVYviVZKSkvjss8/QtRkGSZHqUC8P6tevT82aNXPv8F0OEZfhle/NSihjDqmpqTRt2pT/Pmlc9Il/zTEvLP2YO3wQUaPq/Pz8zG5vChcvXsw3MWY2Ds4Wme4uK+ZNffhSut/yVr0WC0pQm+GBpz16VPr16yfBwdart/kgKSkpcv/+fdHpdNKzZ0/x97dCVKpWqzphreyW5yEff/yxrFmTIwI0NkRkVnWRdW+Z77loIlqtVtq2bStBQUHFkqPxoVMKFy5csDwE2kjS09PlwoULIiKye/fu/JOwJkWLzK4lo7o3fLg8GpNjRRa0EFnYSiQl//kQrVYrR44cERERX1/fQklKe/jwYfH19dX/nalgLZmvuHjxoowfP17EZ4k6LxCaT7m4nGx4X80SfT/A7PObQmbpQ31YtC1xa8G0aNHCuPVkK2Bvb0+LFi1ITExkzZo1pKam5m3KlikHHUexpFM4pe+bEYJbXOyaqFYx6rsCSufvKRcVFcXChQtJT0+nXbt2hbLKEhsbqy8nB+pYOjo6msmTJ5vuS5JB7dq16dmzJzw5AEqVyXN58p9//sk+/AvwUtPOPTsGHqtr1rlNZeTIkezZs8dqQYBmYY4msfRjiaUgIvLLL7+It7e3RX2YS+/evfVlzXORHCNjn3OTYzNeLFqhzOWSh/rmPPBdvocdP35chg0zo4y6iYSEhOQ79EpOTpb169ebNTxLSkpSh50eo0S+rWIwHmL69OkSFham/qFJEVnURrWgTCxeaw63bt2S2NhYSUhIyP79bJaCcXzyySd07NjRKnkWTOWnn36iUaNG7N27lx07dmTf6VSWIUM/oHHSCQg5XeSymUR8GGz/Aqq3hhcMp7zbsGEDp0+fpmXLlkyaVPguvSNGjMDPzy/P/VFRUZw9e9asiceAgAAWLVqkZnxOT1azc+dgxowZWb4wx5bAfX+1NqZD4efaXLZsGV5eXri4uBR/RTFzNImlH0stBRGRNWvWyBdffGFxP+Zy4sQJ8fb2lvT0dNm9e7deu8dFBEvk1Joi694sNtkKRKcTWdtXfWPeu55jl068vLxERGTHjh35l2u3MsbOUUREREi/fv3MqgSm0+lEVr6oTjo+cL7IyEjp2bOn+kf0bfXarB9gcv+m8vvvv+dteYrYLAVTePfdd1mwYEGxnf/pp5+mU6dOhIaGsmnTJgAuX77M6vWbWBH2BPjvheBTxSZfvpz8DW7sV5ODVFS9D5OSkggICECr1bJ48WKio6Pp1asXrVq1KnRxEhIS6N69u9FzBhUqVGD06NGUKlXK6MxKAPHx8bRu3ZqUlkMg6iYEeun3ubq6ZiVv3T1Z9dN4+XvDHVmBpKQkQC0aVFgZlMzGHE1i6ccaloKIyO3bt2XQoEElZgnwo48+kmPHjkl8ZKjcGF9DfRuXNCKuqbPpa/uJ6HRy/fp10Wg0smXLFpk0aVKxiKTT6eT06dMmt0tNTZWOHTsWmMD0Qe7cuaPOF/xQV03wmkFISIiauPXaHnWe5fCPJstjLDqdTjp27ChXr+ZO0pML25KkaWi1WvH09LRKX9ZCp9PJ0KFDZXiv9iLT3eXwxmUSExNT3GKpaFJFlj0vkVNryalDu0VEpE+fPoVXjt0ITp8+Lf/++6/Z7TNfCGPGjDF62XL+/Ply9fdRqutzdJCIiMybN09WLlsqsrClyOK26rWyMjExMTJt2jTRarXGu8Pbhg+mYWdnR+fOnVm7dm2JKdGmKAqtWrVi4Z8e4FyBDct/IDIyklu3brFs2bJilW3+p68SE+iHf9PP2LJXrRmwbds2mjZtWmwy2dnZUbp0abPbZ07K9e/fn4YNG3Lx4kX++++/fNs0atQI1/aD1apOp1cDapj2B41jIfqWGvBUytFsmXJy9+5dzpw5g5ubG1WrVkWj0RR6ohRLeKiVQiaOjo6Wl4azIl988QUuj1WBTp+z+Jn71HeIBNSiJqDOsh8+fBiNRsPOnTutfn6tVsuuXbsA8PDwYMqUKRDki1vIYVKb9KXDu+P57rvvrH5eU/H09KRZs2b07t3b4r7at2+Pq6sriYmJej+HrVu3Gpyn6NOnD2WqNmB3cis4/SdpSfGMHfUBcvhHaNEP6lknkcmFCxfQaDScO3eOw4cPY2dnx8iRIy1SgkWCOeaFpR9rDR8eJDk5We9tV9ysXr1axowZo+Y1/KGeyJ+vZtsfFBQksbGxEh4eLsOHDxcRNUJv2bJlIiLy3XffSUREhERFRYlPRjTizZs3xdfXV3V9FRFPT09JSkqSgIAAWbxYLb8+a9Ys+d///ic6nU769u0rKSkpcu/ePQkJuKaaxT+1UD0YSwBarVYGDRokoaGhhdJ/UlKSDB48WDQajZw7d06uX8++ynLjxg35auS7suXrl6XDjK1SZ8J26TTpT9nifcGi88bGxuq9YAcMGGD50Mw2fDCfkJAQ/vzzz+IWA4C+ffsye/ZsNV3bM1+onnG3s3IQ1KpVC3d3dypXrsxvv6nedW+++SavvvoqAJUrV8bJySnbysbmzZuZNm0aBw4cAGDNmjVER0dTunRpfc6B9957j65du6IoCps2baJ06dJUrFiR6ucXqbkE3lgBTu5FeCUMk5qaSnR0NGvWrKFatWpGtbl+/Trp6emEh4frr8GRI0e4evUqAL/++isajYagoCD2799PmTJl+PjjjwkJCcHPz4+jR4+i1WqZMGECaWlp1KtXj6eH/8DE9BHcTbYHRSFEKjB5VzAefqbnA125ciWRkZFcv36dpUuXAvDXX38V69DMXB4ZpVC/fn1WrlxJcHAw8fHxxSqLu7s7R48eVV2xnx6uVkL2mpNvmypVqugfkA8//BA3NzeaN2/O/Plqpetx48axe/du3n//fQB+//13qlevTvXq1fWp6mrXrp07x+CVHeC3Vq2FWaejdb+omezevZspU6ag0+n0pr6HhwdRUVEEBQUxefJkQK0etWjRIkC9Jvfv3ycyMhIfHx9AdUjKLCJz48YNRIT79+/rKz35+voSGhrKu+++y/Tp00lLSyMmJoZvv/2WxYsXM27dEVLJPneQrNEyb0/uDF+xsbHEx8cjIqxbtw4RYevWrXz55ZcApKWlkZSURNu2bfVK4WFFUa2MoqVt27Zy6lThrOFPmjSJdu3amZdezYosWbKE9u3b8/TTT4PPEtj7NQzdBXVMrEJkCQkRsLQDuNeADw5YdfLMVHQ6Henp6dy9e5c//viDqVOn8ssvv3D37l1mz57N9OnTGTp0KOXLl+fQoUO8+uqrxMTE4OjoiLOzlcKVtRpiLx0g/uIeqkb50uDOZFAMvBdF6Bv7L95nLuPi6srBgwcZM2YM7dq145133uGDDz5g0aJFaDQaNBpNwcleLeGXDqovydtG5vd4AEVRTouICaW1Mto9akpBRFAUhdu3b5echCdpSfBzK6jUGN7fUfDx1kAE/n4bAg/BiENQueiSyep0OhRFISgoCE9PT95//32GDx9Ox44dWbRoEe+8847ebbrQU9fFhYL/PrixDwIOQWoc2JWC2h155vYHhCQ75GpSjXscdfycL71KM+PzwZxKrcM/+/34ffVqvLy8aNCggeG8C4VBMSgF62XGKCEoioJGo+Htt99m+/btmJo52lqICJ06dWLbtm2qDM9+CXsmw62j8PizBXdgKadXg/8eePmHIlEIUVFR3Lt3j8aNG/P000+zbt063NzcSE1VMx3NnTuXChUqMGTIEBwccj+IVkOrgaDjqhLw36+WuwPVWmr+BjTsDnVfACd3xvuFMGHjWdIeyLProOgY3+sp7Ev/xKKGO+DyH3TWaHiiVkXYPppT3sm49x2Gk5MTb731FgcPHiQpKQlnZ+fij1mwEo+cpZBJ5tsqIiKi0BK+FsSNGzeoX7++erNokuHnJ6FCAxhq/WXIbETegOXPQa328N5mtbZiISAi/PTTT3z22Wfs3r2b8+fP8/XXX5OSkpIrldobb7zB2LFjefbZQlCIsSEZSiDDGkiLBzsHqN1BVQINukPlprlSzKWmpvLfxQjm7/MnNCaZamWdqB17lj9mjMqSPzlG7ffqdlXJaBKhdFnS63fjWulWNH95OJOmf0ft2rX55JNPOHToEM8++6z1XJeLwVJ4ZJYkDXH69OmsIJdiID09XdasWZMV6HPsV9WFNuBQIZ40TWRFF5E5tdWsQVYk03vQw8NDli9fLiLqMmh+Zd3i4+MlKSlJkpKSrCdIeppa43LvVJFfOqrXdLq7WuJu2+cil7eLpMQV2M0vv/wiX331Va7tmeXZcn2vtGSRq7tEPD5R3aSnu4t8U0l0694Sje9qiQ8LlN69e4tWqxUvLy99YJlFFMOS5CNrKWSi1WpJSUnh3r17PP7440VyzkxEhLFjxzJlyhQ1aYYmBRY9CeXrwtD/CidNuNf36krHW39YpTaBTqcjOTkZR0dHGjduzMWLFwkNDSUtLc1wktMcfP/99zg5OTF69GjLBMnLGqjTUbUEGnaHSk1MuqYiQkpKCmXKlMm1z9vbm06dOnHnzh1q1aqVe2igTYc7x+HqTnWFJzZInbSs3RGa9MbzXnnEtQqdO3emX79+rF271jwvRjMthaCgIOrUqWObaMyLbdu24ePjw/ffF17UW36kp6dnJTb1XQG7xsPgrWpREWsSfApW9YAn3lQzKVlA5jh5wYIFJCQkMG3aNCIjI42eaU9MTCQyMlI/IWeyOZ2epj50/vvUiM6IjGxW7jWhYTdVEdR7wewqTZ6eniQkJNCnT588jxERunbtym+//Ub9+vXzPA4RtWrUlR2qksicx6j6BNqGvfCKrsyL/YaxbPlyHBwcGD58uPGCmqEUbt26xeDBgzly5IhNKeSHiHD9+nW0Wq1RbzhrodPpaNGiBV5eXlSuXDnDWmgN5WrDsN3WsxbSEmHZc6BNg5He4GRaybZMkpOTKV26NE2bNsXb2xt3d3ccHBxMnkTz8PDg+PHjpini2OAsJRDgBWkJOayBHuoKjhWu2cmTJ0lKSiqwApVOp8POzo758+fToUMH4+ZE7t9UlcPVHXDnBCBQvi5hlV8gpXZnKj7xIv3feYetW7cWPOlqglI4duwYhw8fZuLEieh0Ouzt7W1KoSA2btxIamoq7733XpGeNzo6OnuloxMr4b9xMGgL1O9qnZNsHw2n/1CXPE1c3UhNTcXR0ZGNGzeyf/9+VqxYYXCy0BjCw8O5dOkSXbt21S8P50l6GgQdy1opuJdRwbtsLWjQLWOl4Hmr12wMDg6mUqVKJsUgnDhxgurVq2Nvb8/Zs2d55ZVXjGsYHw7X/lMVRMAh0GlId6rEKfun6PD6h/zw7wlatHzSYMVtwCilsHfvXpo3b65fiu/YUXVSs000msDmzZtlw4YNRXrOn376KSvDjiZFnRRb2c06acOv7lInvfZMMalZaqoaHtyxY0e5dOmSpKamSnp6ukWinDlzRmbPnp33AdFBIidXqbkMZlVX5Z5ZQeSPPiLei0TCrxR6KvUpU6bIunXrzGp75swZWbhwoYiouSvT0tKMb5wcI3J+o8iGIfrvfn1MFQlZ/raEHvxNBrz9VrbcIFvOBEunr9bJ4xO3S6c5B2TLmayU+hqNRo4fPy4iIosWLZJTp07lOh22iUbjuXTpEmlpabRs2RIwY7xrBjt27KBly5bUrl1b3XBylVrS/L1N6lvRXBIjVa9F16rw4QEoZdzb78SJE3zzzTfs2LGDxMREXFxczJcBOHjwIN7e3kydOjX7jvQ0CPLJGhbcU2MVKFs7a26g7vMFZpK2NlKQFVMAWq2WV199lb///pvY2Fjs7OxMc2jSpKiOZVe2w7VdJMfewy/Cjk6duzPnGLh3HckSvzSSNVnF1so42DOha0261nPjscce4+2332bbtm15FuKxeTSawcqVK7l9+3aRhRFHRkYSGxurTlqlp8Hip8C1Cnyw37xxsgj8M1A1v0ccgioFz5UsXbqUWrVq0atXL2JjYy0u4KrT6UhKSiI1NZU7d+6o1aZj7mQNCQK81LV9e0fVxTtzpaBioyIt0gqqInjppZdYvnw5detaL2X72rVriY2N5dNPP2Xp0qUMHjzYtJUGnRbu+GZMVG7H4/hNfqizlLtKbsc7d/t0xjSM1sfA5IfNo9EMhg4dSmJiIlFRUQQHB+sth8Ii8608atQoNQ7hubGwY7T6Bm3Y3fQO/dbCtZ3QY1a+CkGr1bJixQpGjBhBp06dqFSpEnZ2dhYrBFCjNS9dOM+8Ua9SIXwf/PJRljVQrja0ekf9bo8/V+TWQE4URWHx4sVWX5oeNGgQoF7n4OBgnJyc2LJlC35+fnzzzTccPXqUZs2aUbZsWdJSkimjS1Ddr+PDIF79mRx5B8fkCOLSnahQRiFMqWDwXPHaUkYpBEswWSkoilIKCMj4AHwGvAn0BE6IyCjriVe4lCpVirJly7J//368vb1p2bKlxWZlfmT+MxMSEtQ3yZMD4cgC8JytDiFMOW9UAOyapJreHT4xeIhGoyEwMJCGDRsSFhZGXFyc+ia3Ajv+WU21tAAGOVxH634Y1qzKsgZaD1JXCio2LHJrIC/CwsJYvXq1PgLT6ohgnxbH7NGD4NYhulaIpHVztTCtx6//UbGdG7Ep9+n92y0ufeLKjz6p/HgsjS/aOzLxuTJ0WJ7MvyNbgktVNkdpqV4nnZCU3AFs1csVfrp5k4cPiqI8BbwtIhMz/m4DzAW6AdMAbxHZn18fJWX4kJPAwEA++ugj9uzZU2iKISYmhk6dOuHn56fOfp/+E7Z/DgM2QKOXjOtEmw6rX4HIazDSB8pmH8uKCFqtltOnT/Prr7/yxx9/WC54eirc9iH+/E7cQg6z3fsiVVztaNe8btaQoARYA3mRmYdhwIABpjfWJEP8XfXNrn/D31U/cXez9qUn525bpjy4VQO3quBWHXGtglK2Ogl25YjDDbeq9XCrWhexs892z3n4hTB584VccwrVgj2ZNeJ1/QpDfhTZnIKiKJ8Ao4BE4AJwDUgQkaWKonQAXhGR6fn1UVKVgojg7+9Po0aN2LZtG6+88kqhBO9kOgYBagDP4jZqSfsPPY17sx6eBwe/g36rVEelHIwbN44nnniCIUOGWCZo9O2suYHAw6BJpNvaZOa//wxPdntTVQYlyBrIiyNHjtCkSZPcwXHadEiMKPiBT4nJ3WmpMuBeLeOBz3zoq+Xe5pDbW9JYPPxCmLfnGqExyVQvV4bxLzWmfVU7KlasiLe3NwEBAQwbNizP9kU5p3AS6CYidxVFWQOUQVUMAFGAwegjRVFGACOArBn4EoaiKDRq1Ii0tDS2bt1Kly5dSEpKwt3d3aqWg7OzMz/88ANVq1ZVH9znx8O2T+H6bmhcwPp3yBnVlbnFm9kUgogwd+5cPvroI6ZMmYK7uxkZltJT4ba3qgRu7IPI6wDEO9Vk8rHK/Dx3Ftu/bE+ZsoWYP8AaiEBytP7hPvTPMpxaVqdSjVLZH/jECBBd9raKvTr5614NKtRXfT4MPfBOZQtdGb7eugavt65hcF/NmjWxt7dHRLhz545VnylzlMJ5EUnN+P0U4ICqGABcySObk4isAFaAaimYcd4iw9HRkVWrVgHw0Ucf0aNHD/r162fVc7zzzjtZRURbvQNH5qsxC41ezvtmS0uCzSPUm7bXfP3mTOeo8uXLk5aWpnpOGkv0razlwsDDoEkC+9Lw+DME1XiNIIf6PNPzbTrV/gddwx6UKcywZ2NIS8p6sA293fWmfArpOsH/vo4plezhLhDzWNbDXaU5uFVXH3j36lkPvkslsCthxVkM0KBBAxo0aMDly5cZO3asPlGvNTBn+LABmAVcBPYBXkBlEflUUZShQDURmZ1fHyV1+GAIrVaLiHD48GG2bNnC4sWLrdZ3amoqgwcPZvny5ZQL3AlbP4F3/oYmeXi37RwHJ1dmi5uIjY2lU6dOnDlzxjgPPb01kBFcdD8jNX75x/VzA/dcGuNesRqnT5/mzJkzfPrpp9b4uvmjTYeE8Gwz8jln6FVT3kD9UAfnrDe4e9b43S84iZ/+OcCa335V/TiKoCZkcSAipKamMmLECJYuXapfDi3KOYUWwN+AAmwDpgJHUK2Gl4GXRSQwvz4eJqWQSWpqKrdv36Zhw4aMHj2amTNn6lO2W4KnpyedO3dG0Wnhl6fVZK8fHcltLfjvh7/6QYdR8PJs/P398fDwYPz48aSlpeHomE+qtTytgWez8g1UqE9UdDSPPfYYgwYNYvjw4XTu3Nni74cIJEVlvcHzeuATIoAc96JdKfVhdqua442e4w1f2j3X9bp582b+QUyPGDqdjl27dtGrVy+uXLlCo0aNKFWqVPE5LymKUgboBZwRkYCCjn8YlUImWq2W9evXM3DgQLZv345Op+P111+3qM/z58+zceNGvu3XDDw+hrfXQdMHoveSolSvRecKpA3ZQ1xyGqVKlWL37t288847uTvUpKjWwI39eVgDPVSF4OhMWloaGo2GqKgoXn31Vc6cOaOm+TYmMUta4gOz74ZM+oyfWgM1Ip0rPPBwV8s2Q69/4J0rmpUgRqPR0LlzZ7Zu3Vq4+RNLKG+99RbTp0/niSeesHk0FjVnz54lPT2dVq1aMX78eH788UezXKbj4uI4deoUXV94Hn5pp85Yf3REfSBEYMNguLYLRniyzMObiIgIpk2blr2TqMAsJXDrSJ7WAIqCiHD79m0ef/xxxowZwxNPPMHQoUPRarWq/FqNasrnfOAfXH6Lv6vmO8yJg0v2CTlDD7xbVaPdsU0lKCiIqlWrmhXZ+ahh82gsBjIdgZKSkmjVqhX29vYsXrwYNzc33n//fZKTkw0m8MiJu7s7Xbt2Ze3ataRHt2eo/K2m/2r2GpxbD1e2sZ7XqBMQz4gRIzLSu6XA7aNZKwX3M6ovl68Lrd9TlUCGNZDJcR8fKrjYU8kpnddfH8yZNVOY26sCpZLOwl/9sc984BPvYdCUz3y4KzVW5zSyLb9l7CvmuhJz5szhjTfeoEePHsUqx8OMzVKwMmFhYaSnp1O5cmXq1avH9evX9bUo2rRpk2/bgIAARJvO+U0pU2mXAAAKEUlEQVSzmR/fnVBtOaop95lQ5TQuTV+huhs0tw9SlUDgEdVZppST+vDX7ghVWqhKIO4uSfduY58UTkxYEEu2nebbF11Y5RVI3XJC17o53gUulbJm33O94TM+zhUKLdejNQgICMDR0ZEaNWr8v7cQMrFZCiWEqlWr6n/PvFEDAwMJCQmhTZs2vPbaa8ybN4/KlStz9uxZOnfurE9sUq9ePTz8QhgX9TpaO3XpL1QqMP5uZ+ZF/kzzUj65T+hSiaunj9LYfx/nw3WcC9cyuJUjb69PYvzz5WjbtBYNqrlDnfYM/7Rv7gfetUqx1oOwFnv27MHd3V1fGMeG+dgshSLG39+f2rVrExAQwOrVq5k7dy5ffvkljRo1YuTIkTT4cj3ppXOb4FXlHmuTPmXdeQ0zX3RjyhE76taoxPCebXh6yj4OLvmCsBQnLt1N5PV+/VV32hJQIq6w8fHxISUlha5drZSs5hHCFjr9kJMZiFV30s6co3kAFISTg9w55X+Xl199i+jYWJycnIyas3hUERGOHDlCUlISL7/8cnGLU+KwDR8ecjLHwW726cRpc/9bKrk6ULH587zcXP3bGmHPDzM///wzpUuX5uOPPy5uUR45bEqhhJBpKXSrksTOiLKkpmfZCw6KjlcfLz7ZShLh4eH66kz/n62kwqTkTif/P+ONN97gwoULLPj8XX7o14oa5cqgADXKlWFe/6eY8p6aMWjhwoXFLWqxMn/+fA4cOED16tX/31tLhYVtTqGYSUxMxNnZmYCAAOrWrZuvJ2FmOfRy5cpx8uRJunTpUoSSFh8iwogRI5g8eTJ169a1LTkaiblzCjZLoZj58MMP2b9/P/Xr1y/Qtbhs2bLUrFmTwMBA9u3bB0BamgEX4kcEnU6Hr68viqIwePBgqlevblMIRYDNUigmwsLCcHd3R6fT4eLiYtbNnpSUxFNPPcWZM2eykrY8AogIiYmJiAgDBgxgw4YNtvkDM7BZCg8ZCxcuZPv27bi6upr99nN2dub48eM4OzszY8YMjhw5YmUpi4cNGzYwfvx43Nzc2L59u00hFDE2S6GICQ8PJzEx0epjYz8/P2rWrElsbCz79+9/KJfqRo4cyXvvvUe7du1QFCXPegY2jMNmKTwkeHp6snXrVquPjVu3bq1P3Z4ZLvzzzz9z9+5dq57H2ty4cYP+/fsD8Pnnn9OmTRscHBxsCqEYsV35IiImJgY/Pz/D+Q+sSL169ahXrx6gOkS5u7tz4sQJLl++XOj1Aowhs0bld999xxNPPEGvXr30adebNm1azNLZAJulUGQEBgZy6NChIj3n559/jouLi37VAuD111/nxo0bJCcnExNjIEtxIXDlyhWio6Px9/fXpybv378/zz//PKVKlaJ169ZFIocNIzGnAKWln+IuMFuU6HQ6+ffff7MVDi1OLl++LGlpaeLl5SVvvvmmiIgsX75c/Pz8RKfTSWhoqEX9nz9/XtLT08XX11emTp0qIiJjx46VI0eOiE6nk5SUFIu/gw3jwMwCszZLoZCJi4tj//79JcafoGnTpjg4OPDCCy+wceNGAGrUqEHZsmW5f/8+3bur5etWr17N999/D8Ds2bO5ffs2ERERfPbZZwQHBxMaGsr48eMBNbHJggULABg7diwRERHUrVuXPn3UlHLz58/n2WefRVEUk8q/2ygebHMKhYiPjw9PPPEEv/76a3GLki+9emVlj7548SKgul2npKQA0KhRI5ydnbG3t6dhw4Y4Ojri6OjIc889B8Ann3yiTxy7d+9efV+5iq/YeCiwLUkWIhMmTODdd9+1jZltFAu20OkSRGRkJFFRUcydO7e4RbFhw2RscwqFwPHjx9mwYUNxi2HDhlnYLAUrc/78eXr37k3v3r2LWxQbNszCZilYkXv37jF+/Hg0Gk1xi2LDhtnYlIKVuHXrFhUqVGDPnj2FUr7eho2iwqYUrMTXX3+Nr69vcYthw4bF2OYUrIBGo2HdunW2BCA2HgmsaikoirJKUZRjiqJMsWa/JZnLly/TvXt3m0Kw8chgNaWgKEpfwF5EOgL1FEVpaK2+SzLNmjVj06ZNxS2GDRtWw5qWQmcgc3F+L/CsFfsukXz11VccOnSIChUqFLcoNmxYDWvOKbgAIRm/RwFPPbhTUZQRwIiMP1MVRbloxXNbg4pApKmN5syZUwiiAGbKU4jY5CmYkiZTY3MaWVMpJACZyfRcyWGFiMgKYAWAoiinzPHJLkxKmkw2efKnpMkDJU8mRVHMCjCy5vDhNFlDhlbALSv2bcOGjSLCmpaCB3BEUZTqwCtAByv2bcOGjSLCapaCiMShTjYeB7qISGw+h6+w1nmtSEmTySZP/pQ0eaDkyWSWPMWST8GGDRslF5ubsw0bNrJhUwo2bDzkKIrymKIo3RVFqWiN/opcKZQEV2hFUUopihKkKIpXxucJRVFmKopyUlGUX4pYliqKohzJ+N1BUZTtiqJ4K4oyLK9tRShPDUVRgh+4TpUythfJ/1BRlLKKouxSFGWvoihbFEVxNHTuYpYn232UcVyR3UuKopQHdgDtAE9FUSpZeo2KVCmUIFfolsB6EeksIp0BR9Tl1HZAhKIo3YpCiIx/6J+ojl8AnwGnReQZ4E1FUdzy2FZU8rQHZmVeJxG5V8T/w4HAAhHpAYQB7+Q8dzHLM4kH7iMRuaAoShuK9l5qCYwRkVnAHqArFl6jorYUOlMyXKE7AL0VRTmhKMoq4EVgU0au/D3Ac0UkhxZ4G4jL+LszWdfnMNA2j21FJU8H4ANFUc4oijLbgIyF+j8UkaUisi/jz0rAewbOXZzypPPAfaQoSingBYrwXhKRQyJyXFGU51EV0UtYeI2KWinkdIWuUsTnz+Qk0E1E2gEOqJ6YRS6XiMTlWLo1dH2K7JoZkGcX6g31NNBRUZSWRSlPJoqidATKA3cMnLs45dlH9vuoZzHJo6Aq82hADJzfJJmKWink6wpdhJwXkczKq6coOXIZkqM4ZfMRkXgR0QJ+QMOilkdRlMeAxcCwPM5dnPLkvI+K/PoAZBSEGgWcBzoZOL9JMhX1zV9SXKHXKorSSlEUe+B1VE1aEuQydH2K85rtURSlmqIozkAP4GJRyqMoiiOwEZgsIrfzOHdxypPzPjpXlPJkyDRRUZTBGX+WA743cH7TZDKn1py5H8Ad9cItAK4AZYvy/A/I0QJVq14AZqEqR2/gZ+AaULeI5fHK+FkHuJQhx0nA3tC2IpSnC3A141p9WtT/Q2AkqknslfEZkvPcxSzP9Afvo4xjivReImsYcxhYmnFNLLpGRe7RmDHD3R04LCJhRXryfFAUpQzQCzgjIgHFKEd1VK2+RzLG94a2FSfF+T80dO6Sdk8V971k6TWyuTnbsGEjGzaPRhs2bGTDphRs2LCRDZtSsGHDRjZsSsGGDRvZsCkFGzZsZOP/AG4HZwre9P0DAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#%fig=德劳内三角形的外接圆与圆心\n", "cx, cy = vo.vertices.T\n", "\n", "ax = pl.subplot(aspect=\"equal\")\n", "spatial.delaunay_plot_2d(dy, ax=ax)\n", "ax.plot(cx, cy, \"r.\")\n", "for i, (cx, cy) in enumerate(vo.vertices):\n", " px, py = points2d[dy.simplices[i, 0]]\n", " radius = np.hypot(cx - px, cy - py)\n", " circle = pl.Circle((cx, cy), radius, fill=False, ls=\"dotted\")\n", " ax.add_artist(circle)\n", "ax.set_xlim(0, 300)\n", "ax.set_ylim(0, 300);" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.4" } }, "nbformat": 4, "nbformat_minor": 1 } ================================================ FILE: 4.scipy/2.scipy-optimize.ipynb ================================================ { "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import pylab as pl\n", "import numpy as np" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import matplotlib as mpl\n", "mpl.rcParams['font.sans-serif'] = ['SimHei']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 拟合与优化-optimize" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 非线性方程组求解" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[-0.70622057 -0.6 -2.5 ]\n", "[0.0, -9.126033262418787e-14, 5.329070518200751e-15]\n" ] } ], "source": [ "from math import sin, cos\n", "from scipy import optimize\n", "\n", "def f(x): #❶\n", " x0, x1, x2 = x.tolist() #❷\n", " return [\n", " 5*x1+3,\n", " 4*x0*x0 - 2*sin(x1*x2),\n", " x1*x2 - 1.5\n", " ]\n", "\n", "# f计算方程组的误差,[1,1,1]是未知数的初始值\n", "result = optimize.fsolve(f, [1,1,1]) #❸\n", "print (result)\n", "print (f(result))" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[-0.70622057 -0.6 -2.5 ]\n", "[0.0, -9.126033262418787e-14, 5.329070518200751e-15]\n" ] } ], "source": [ "def j(x): #❶\n", " x0, x1, x2 = x.tolist()\n", " return [[0, 5, 0],\n", " [8 * x0, -2 * x2 * cos(x1 * x2), -2 * x1 * cos(x1 * x2)],\n", " [0, x2, x1]]\n", "\n", "\n", "result = optimize.fsolve(f, [1, 1, 1], fprime=j) #❷\n", "print(result)\n", "print(f(result))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 最小二乘拟合" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "k = 0.6134953491930442 b = 1.794092543259387\n" ] } ], "source": [ "import numpy as np\n", "from scipy import optimize\n", "\n", "X = np.array([ 8.19, 2.72, 6.39, 8.71, 4.7 , 2.66, 3.78])\n", "Y = np.array([ 7.01, 2.78, 6.47, 6.71, 4.1 , 4.23, 4.05])\n", "\n", "def residuals(p): #❶\n", " \"计算以p为参数的直线和原始数据之间的误差\"\n", " k, b = p\n", " return Y - (k*X + b)\n", "\n", "# leastsq使得residuals()的输出数组的平方和最小,参数的初始值为[1,0]\n", "r = optimize.leastsq(residuals, [1, 0]) #❷\n", "k, b = r[0]\n", "print (\"k =\",k, \"b =\",b)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#%figonly=最小化正方形面积之和(左),误差曲面(右)\n", "scale_k = 1.0\n", "scale_b = 10.0\n", "scale_error = 1000.0\n", "\n", "def S(k, b):\n", " \"计算直线y=k*x+b和原始数据X、Y的误差的平方和\"\n", " error = np.zeros(k.shape)\n", " for x, y in zip(X, Y):\n", " error += (y - (k * x + b)) ** 2\n", " return error\n", "\n", "ks, bs = np.mgrid[k - scale_k:k + scale_k:40j, b - scale_b:b + scale_b:40j]\n", "error = S(ks, bs) / scale_error\n", "\n", "from mpl_toolkits.mplot3d import Axes3D\n", "from matplotlib.patches import Rectangle\n", "\n", "fig = pl.figure(figsize=(12, 5))\n", "\n", "ax1 = pl.subplot(121)\n", "\n", "ax1.plot(X, Y, \"o\")\n", "X0 = np.linspace(2, 10, 3)\n", "Y0 = k*X0 + b\n", "ax1.plot(X0, Y0)\n", "\n", "for x, y in zip(X, Y):\n", " y2 = k*x+b\n", " rect = Rectangle((x,y), abs(y-y2), y2-y, facecolor=\"red\", alpha=0.2)\n", " ax1.add_patch(rect)\n", "\n", "ax1.set_aspect(\"equal\")\n", "\n", "\n", "ax2 = fig.add_subplot(122, projection='3d')\n", "\n", "ax2.plot_surface(\n", " ks, bs / scale_b, error, rstride=3, cstride=3, cmap=\"jet\", alpha=0.5)\n", "ax2.scatter([k], [b / scale_b], [S(k, b) / scale_error], c=\"r\", s=20)\n", "ax2.set_xlabel(\"$k$\")\n", "ax2.set_ylabel(\"$b$\")\n", "ax2.set_zlabel(\"$error$\");" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "真实参数: [10, 0.34, 0.5235987755982988]\n", "拟合参数 [10.25218748 0.3423992 0.50817423]\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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g5UTsz402JSdfQOIoogkSbz88svs2rWL7777jvfff59Dhw7x6quvIooiK1eupH///owePRqAOXPmEBsbS2xsLJGRkZw6dQoAm81GdHQ0U6ZMYerUqYwcOZKuXbsydepUpk6dSkxMDEeOHLEf+723PiT7UjYdgk10a63lofvuqdfWJUuW8P3339f6fM2aNUyZMoXp06fz/vvvA7B69WreffddcnKqp+W9/PLL7NixgyVLlrB06VLKysqYMmUKNlv1SSyr1cqcOXMAWLBggf37xsbGcvvtt9/gWXY+ydnJAEQH94CgCPvn3iSL0BR0Kh2L6R51AAAgAElEQVRjOtxCYnAo0pmf3W2OV1A1EDj1+kRUAReY2qo7gtXgUyEc8PAJ2htl7aEc3t58htxiAx1CdU7JskhISOAvf/kLOTk5rF+/HpPJhNls5quvvqKgoIDNmzczdepUXn31Vb799lv7dipV5alVKH59niqVSrZu3YrJZEKpVJKSksK2bdvsDw2A4OBg+/pHjp7ggWd/S5m5jN3Jh/H39+f06crXzG7duqHRaOjduzedOnUCwGAwcPLkST7//HMALl68SHp6OnPmzGHOnDkcPHiQdevWYbPZ+Oabb/j+++956qmnWLVqFYIgUF5eTnBwMHv27OHq1avk5eVx6dIlAgICUCqVdhsFQUClUtnfIiwWC4mJiXa7582bd1Pn3BkkX9pOX5OZtr2rP3iqfg/O/p14EjEdY0jKTiIj/wTdSnMhuIO7TfIK9uftx2gzElNeCn4hEDXe3SY5FZ9x9o7yZZ2RZREfH098fDzLli1j3LhxFBUVUVhYyODBg0lMTOT3v/+9fTQtCAI///wzcXFxtGvXjr59+5KYmMj27duJiIggLCyM1NRUvvnmm2oPgcWLFyOKIgMGDODxxx/HZrMRHh7O4MGDmTvxLmIm30rm6SxCQkJYunQp+/fvZ82aNfTp0weVSsV//vMfzp49y5gxY/jPf/5D3759GThwIMOGDQMqnfFHH31Ev379aN26NW+99RZz586lb9++xMfHM2fOHJYtW4ZCoaCgoIDly5czZMgQxo4dy/Lly0lPTycmJob09HTWrl1LVlYWn376KYcPH2bevHlkZWURGxuLzWZDEASys93bRKPYWMyRghM8rDdAr6m1lnuLLEJTiY6srM1I0enodnYTjHjQzRZ5B8nZ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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#%fig=带噪声的正弦波拟合\n", "def func(x, p): #❶\n", " \"\"\"\n", " 数据拟合所用的函数: A*sin(2*pi*k*x + theta)\n", " \"\"\"\n", " A, k, theta = p\n", " return A * np.sin(2 * np.pi * k * x + theta)\n", "\n", "\n", "def residuals(p, y, x): #❷\n", " \"\"\"\n", " 实验数据x, y和拟合函数之间的差,p为拟合需要找到的系数\n", " \"\"\"\n", " return y - func(x, p)\n", "\n", "\n", "x = np.linspace(0, 2 * np.pi, 100)\n", "A, k, theta = 10, 0.34, np.pi / 6 # 真实数据的函数参数\n", "y0 = func(x, [A, k, theta]) # 真实数据\n", "# 加入噪声之后的实验数据\n", "np.random.seed(0)\n", "y1 = y0 + 2 * np.random.randn(len(x)) #❸\n", "\n", "p0 = [7, 0.40, 0] # 第一次猜测的函数拟合参数\n", "\n", "# 调用leastsq进行数据拟合\n", "# residuals为计算误差的函数\n", "# p0为拟合参数的初始值\n", "# args为需要拟合的实验数据\n", "plsq = optimize.leastsq(residuals, p0, args=(y1, x)) #❹\n", "\n", "print(u\"真实参数:\", [A, k, theta])\n", "print(u\"拟合参数\", plsq[0]) # 实验数据拟合后的参数\n", "\n", "pl.plot(x, y1, \"o\", label=u\"带噪声的实验数据\")\n", "pl.plot(x, y0, label=u\"真实数据\")\n", "pl.plot(x, func(x, plsq[0]), label=u\"拟合数据\")\n", "pl.legend(loc=\"best\")" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[10.25218748 0.3423992 0.50817425]\n" ] } ], "source": [ "def func2(x, A, k, theta):\n", " return A*np.sin(2*np.pi*k*x+theta) \n", "\n", "popt, _ = optimize.curve_fit(func2, x, y1, p0=p0)\n", "print (popt)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "真实参数: [10, 0.34, 0.5235987755982988]\n", "拟合参数 [ 0.71093469 1.02074585 -0.12776742]\n" ] } ], "source": [ "popt, _ = optimize.curve_fit(func2, x, y1, p0=[10, 1, 0])\n", "\n", "print(u\"真实参数:\", [A, k, theta])\n", "\n", "print(u\"拟合参数\", popt)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 计算函数局域最小值" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Nelder-Mead : min= 5.30934e-10, f count=125, fprime count= 0, fhess count= 0\n", "Powell : min= 0, f count= 52, fprime count= 0, fhess count= 0\n", "CG : min= 9.63056e-21, f count= 39, fprime count= 39, fhess count= 0\n", "BFGS : min= 1.84992e-16, f count= 40, fprime count= 40, fhess count= 0\n", "Newton-CG : min= 5.22666e-10, f count= 60, fprime count= 97, fhess count= 38\n", "L-BFGS-B : min= 6.5215e-15, f count= 33, fprime count= 33, fhess count= 0\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\scipy\\optimize\\_minimize.py:415: RuntimeWarning: Method Nelder-Mead does not use gradient information (jac).\n", " RuntimeWarning)\n", "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\scipy\\optimize\\_minimize.py:420: RuntimeWarning: Method Nelder-Mead does not use Hessian information (hess).\n", " RuntimeWarning)\n", "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\scipy\\optimize\\_minimize.py:415: RuntimeWarning: Method Powell does not use gradient information (jac).\n", " RuntimeWarning)\n", "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\scipy\\optimize\\_minimize.py:420: RuntimeWarning: Method Powell does not use Hessian information (hess).\n", " RuntimeWarning)\n", "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\scipy\\optimize\\_minimize.py:420: RuntimeWarning: Method CG does not use Hessian information (hess).\n", " RuntimeWarning)\n", "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\scipy\\optimize\\_minimize.py:420: RuntimeWarning: Method BFGS does not use Hessian information (hess).\n", " RuntimeWarning)\n", "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\scipy\\optimize\\_minimize.py:420: RuntimeWarning: Method L-BFGS-B does not use Hessian information (hess).\n", " RuntimeWarning)\n" ] } ], "source": [ "def target_function(x, y):\n", " return (1 - x)**2 + 100 * (y - x**2)**2\n", "\n", "\n", "class TargetFunction(object):\n", " def __init__(self):\n", " self.f_points = []\n", " self.fprime_points = []\n", " self.fhess_points = []\n", "\n", " def f(self, p):\n", " x, y = p.tolist()\n", " z = target_function(x, y)\n", " self.f_points.append((x, y))\n", " return z\n", "\n", " def fprime(self, p):\n", " x, y = p.tolist()\n", " self.fprime_points.append((x, y))\n", " dx = -2 + 2 * x - 400 * x * (y - x**2)\n", " dy = 200 * y - 200 * x**2\n", " return np.array([dx, dy])\n", "\n", " def fhess(self, p):\n", " x, y = p.tolist()\n", " self.fhess_points.append((x, y))\n", " return np.array([[2 * (600 * x**2 - 200 * y + 1), -400 * x],\n", " [-400 * x, 200]])\n", "\n", "\n", "def fmin_demo(method):\n", " target = TargetFunction()\n", " init_point = (-1, -1)\n", " res = optimize.minimize(\n", " target.f,\n", " init_point,\n", " method=method,\n", " jac=target.fprime,\n", " hess=target.fhess)\n", " return res, [\n", " np.array(points) for points in (target.f_points, target.fprime_points,\n", " target.fhess_points)\n", " ]\n", "\n", "\n", "methods = (\"Nelder-Mead\", \"Powell\", \"CG\", \"BFGS\", \"Newton-CG\", \"L-BFGS-B\")\n", "for method in methods:\n", " res, (f_points, fprime_points, fhess_points) = fmin_demo(method)\n", " print(\n", " \"{:12s}: min={:12g}, f count={:3d}, fprime count={:3d}, fhess count={:3d}\"\n", " .format(method, float(res[\"fun\"]), len(f_points), len(fprime_points),\n", " len(fhess_points)))" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\scipy\\optimize\\_minimize.py:415: RuntimeWarning: Method Nelder-Mead does not use gradient information (jac).\n", " RuntimeWarning)\n", "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\scipy\\optimize\\_minimize.py:420: RuntimeWarning: Method Nelder-Mead does not use Hessian information (hess).\n", " RuntimeWarning)\n", "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\scipy\\optimize\\_minimize.py:415: RuntimeWarning: Method Powell does not use gradient information (jac).\n", " RuntimeWarning)\n", "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\scipy\\optimize\\_minimize.py:420: RuntimeWarning: Method Powell does not use Hessian information (hess).\n", " RuntimeWarning)\n", "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\scipy\\optimize\\_minimize.py:420: RuntimeWarning: Method CG does not use Hessian information (hess).\n", " RuntimeWarning)\n", "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\scipy\\optimize\\_minimize.py:420: RuntimeWarning: Method BFGS does not use Hessian information (hess).\n", " RuntimeWarning)\n", "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\scipy\\optimize\\_minimize.py:420: RuntimeWarning: Method L-BFGS-B does not use Hessian information (hess).\n", " RuntimeWarning)\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#%figonly=各种优化算法的搜索路径\n", "def draw_fmin_demo(f_points, fprime_points, ax):\n", " xmin, xmax = -3, 3\n", " ymin, ymax = -3, 3\n", " Y, X = np.ogrid[ymin:ymax:500j,xmin:xmax:500j]\n", " Z = np.log10(target_function(X, Y))\n", " zmin, zmax = np.min(Z), np.max(Z)\n", " ax.imshow(Z, extent=(xmin,xmax,ymin,ymax), origin=\"bottom\", aspect=\"auto\", cmap=\"gray\")\n", " ax.plot(f_points[:,0], f_points[:,1], lw=1)\n", " ax.scatter(f_points[:,0], f_points[:,1], c=range(len(f_points)), s=50, linewidths=0)\n", " if len(fprime_points):\n", " ax.scatter(fprime_points[:, 0], fprime_points[:, 1], marker=\"x\", color=\"w\", alpha=0.5)\n", " ax.set_xlim(xmin, xmax)\n", " ax.set_ylim(ymin, ymax)\n", "\n", "fig, axes = pl.subplots(2, 3, figsize=(9, 6))\n", "methods = (\"Nelder-Mead\", \"Powell\", \"CG\", \"BFGS\", \"Newton-CG\", \"L-BFGS-B\")\n", "for ax, method in zip(axes.ravel(), methods):\n", " res, (f_points, fprime_points, fhess_points) = fmin_demo(method)\n", " draw_fmin_demo(f_points, fprime_points, ax)\n", " ax.set_aspect(\"equal\")\n", " ax.set_title(method)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 计算全域最小值" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "def func(x, p):\n", " A, k, theta = p\n", " return A*np.sin(2*np.pi*k*x+theta)\n", "\n", "def func_error(p, y, x):\n", " return np.sum((y - func(x, p))**2) \n", "\n", "x = np.linspace(0, 2*np.pi, 100)\n", "A, k, theta = 10, 0.34, np.pi/6 \n", "y0 = func(x, [A, k, theta])\n", "np.random.seed(0)\n", "y1 = y0 + 2 * np.random.randn(len(x))" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[10.25218676 -0.34239909 2.63341581]\n" ] } ], "source": [ "result = optimize.basinhopping(func_error, (1, 1, 1),\n", " niter = 10,\n", " minimizer_kwargs={\"method\":\"L-BFGS-B\",\n", " \"args\":(y1, x)})\n", "print (result.x)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#%figonly=用`basinhopping()`拟合正弦波\n", "pl.plot(x, y1, \"o\", label=u\"带噪声的实验数据\")\n", "pl.plot(x, y0, label=u\"真实数据\")\n", "pl.plot(x, func(x, result.x), label=u\"拟合数据\")\n", "pl.legend(loc=\"best\");" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.4" } }, "nbformat": 4, "nbformat_minor": 1 } ================================================ FILE: 4.scipy/3.scipy-linalg.ipynb ================================================ { "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "group_control": { "group": 0 } }, "outputs": [], "source": [ "import pylab as pl\n", "import numpy as np\n", "from scipy import linalg" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import matplotlib as mpl\n", "mpl.rcParams['font.sans-serif'] = ['SimHei']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 线性代数-linalg" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 解线性方程组" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "group_control": { "group": 0 } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "True\n", "5.38 ms ± 120 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n", "8.14 ms ± 994 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n" ] } ], "source": [ "import numpy as np\n", "from scipy import linalg\n", "\n", "m, n = 500, 50\n", "A = np.random.rand(m, m)\n", "B = np.random.rand(m, n)\n", "X1 = linalg.solve(A, B)\n", "X2 = np.dot(linalg.inv(A), B)\n", "print (np.allclose(X1, X2))\n", "%timeit linalg.solve(A, B)\n", "%timeit np.dot(linalg.inv(A), B)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "group_control": { "group": 0 } }, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "luf = linalg.lu_factor(A)\n", "X3 = linalg.lu_solve(luf, B)\n", "np.allclose(X1, X3)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "group_control": { "group": 0 } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "50.6 ms ± 1.94 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n", "3.49 ms ± 306 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n", "20.1 ms ± 1.42 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n", "4.49 ms ± 65 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n" ] } ], "source": [ "M, N = 1000, 100\n", "np.random.seed(0)\n", "A = np.random.rand(M, M)\n", "B = np.random.rand(M, N)\n", "Ai = linalg.inv(A)\n", "luf = linalg.lu_factor(A) \n", "%timeit linalg.inv(A)\n", "%timeit np.dot(Ai, B)\n", "%timeit linalg.lu_factor(A) \n", "%timeit linalg.lu_solve(luf, B) " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 最小二乘解" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "group_control": { "group": 0 } }, "outputs": [], "source": [ "from numpy.lib.stride_tricks import as_strided\n", "\n", "\n", "def make_data(m, n, noise_scale): #❶\n", " np.random.seed(42)\n", " x = np.random.standard_normal(m)\n", " h = np.random.standard_normal(n)\n", " y = np.convolve(x, h)\n", " yn = y + np.random.standard_normal(len(y)) * noise_scale * np.max(y)\n", " return x, yn, h\n", "\n", "\n", "def solve_h(x, y, n): #❷\n", " X = as_strided(\n", " x, shape=(len(x) - n + 1, n), strides=(x.itemsize, x.itemsize)) #❸\n", " Y = y[n - 1:len(x)] #❹\n", " h = linalg.lstsq(X, Y) #❺\n", " return h[0][::-1] #❻" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "group_control": { "group": 0 } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Average error of H1: 0.0\n", "Average error of H2: 0.2958422158342371\n" ] } ], "source": [ "x, yn, h = make_data(1000, 100, 0.4)\n", "H1 = solve_h(x, yn, 120)\n", "H2 = solve_h(x, yn, 80)\n", "\n", "print(\"Average error of H1:\", np.mean(np.abs(h[:100] - h)))\n", "print(\"Average error of H2:\", np.mean(np.abs(h[:80] - H2)))" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "group_control": { "group": 0 } }, "outputs": [ { "data": { "image/png": "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2tpann32WZYuXcoll1zCunXruPTSS7nsssuyhBCP96zQvGHDBm699VYAVq5cicPhYOfOnQBMnToVi8XCLbfcgslkor29naVLl/Lwww/jdDrx+/1MnZqra/7AAw/wxS9+kZqaGr785S9jtVoxGo0sXbqUWCzGbbfdxumnnw7AqlWruOmmm7j77rvZtWsXX/va17jsssv40Y9+BEAwGMTj8bBu3Tra2tpoaWmhrq4Op9OJ0WgknU4D9Et0xyrOOecczj333B7bVq9e3eP/FStW8JEzz8BkFFhMBrq8Xna9V8/ixYuz+1xzzTVcc801B73Wa6+9xs9+9jPi8TjxeJxIRFXCvPvuuykpUYuW3Hzzzaxfv55QKMR9991HY2Mjy5cv5/LLL+czn/kMa9eu5Z133uG6667r9xp79+7le9/7HsFgcLi3QscHDEcl0U/+wXOH5by1d/7XoPuYTCaefPJJdu/ezWmnncaTTz7JrFmzmDt3LgsWLMg6uF577TWWLlUVmfPJ0GQykUwmEUJQWlrKvHnzWLBgAcuWLWPjxo14PB7uvPNO3n77bZ555hmOP/54CgsLWbNmDXfddRcrV64kFotx8cUXs3z5cq6++moA3nrrLerr6/F6vdx9992sWbOGW265hblz5/Lf//3ffQh569atLFmyhC984QvcdNNN3HDDDaxfv56GhgbGjx+Pz+ejs7OT+++/n5NOOolFixZx//33U1NTw+LFi6mpqWHFihWccsopI3X74a+HKWn6c08c9OPXXnuNW265BSFE1hLOx5lnnskf/vAHJk+ezHXXXcfWLZsRgAGBwWDiG9/4Bhs2bMBqHfp6vAsXLuSSSy5h9+7djBs3jurqagCeeOIJzj77bOrq6jj99NM5/fTT2bhxIwaDAbPZTEdHB0uXLmXbtm38/ve/5/nnnx/wGm63m6effprzzz9/yO3S8cHEUUn0o4kXXniB5uZmnn76af71r3/h9/uprKwE4N13381a42+88QZf/epXOeusszAajWzevJk5c+ZgMBi48sorufzyy1mwYAGvvPIKq1ev5sEHH6Sqqoqf//zneDwerrrqqh7Ece2112Kz2Zg/fz7nnnsuK1aswG7P1fRobW1l9uzZXHXVVaxdu5bVq1fT2trKLbfcwu233864ceO44oorePbZZ7njjjtwOBxs3ryZSZMm8fjjj7N582bmzZvH8uXLueGGG5g7dy61tbV897vfZdeuXbS0tLBlyxZ++tOfMn36dH7zm9+MLMmPIhYvXsz3v/99XnrpJT760Y/yu9/9jquuuiobejh//nyqq6tZuXIlH/nIR7DnFTUrKyvloosu4re//W120B0KzGYzEydOZOvWrRgMBtra2jAYDBiNRiZMmMDJJ59Mc3MzVVVVAFx00UW89tpr1NTUsHr1am688Ubi8TiLFy/mjjvuAODqq6+moKCAuro6br75ZsrLy0fwLukYyzgqiX4olvfhQigU4rbbbuPSSy9l2bJlXHzxxcycObPPfhdffDGvv/46K1euxGq1ct5557FixQoMBgMOhyKKzZs3s2TJErq7u7nwwgu5/PLLWb58Of/85z+JxWI4napeis/n4yc/+Qkvvvgi119/PR/72MfYtWsX3/rWt/jVr37FnDlz+MQnPoHX6+X6669n6tSpnH766ZSWlnL22Wfj8/mIx+MsXbqUZcuWcdppp3HrrbeydOlSzjzzTB588EEuvvhiXn75ZR566CFKS0tpaGjg5ptv5k9/+hPXXnstZrOZH/3oR2zYsAGLxdJDMhoxDGJ5Hy4YjcY++vyLL77ItGnTePHFF7n//vsRQnDffffxgx/8oGdIpRBcffXVLFq0iG984xv96vz94cCBA9x4443MmjWL+vp6/vznP2Oz2ViyZAn33HMPXq83a61HIhF++ctf0tTURCAQ4LTTTmP37t186Utf4k9/+hMADz/8MPfddx9nnHEGt91228jdHB0fCByVRD9aePbZZ/nZz36G0+nk/vvv58EHH+Sdd97JOkBDoRC33347AJ/85Ce55ppraGxszFplzz33HCtXruSRRx4B4KSTTmLVqlWsXr2a1atXM23aNIxGI1u2bCESiWSJ/qGHHuKBBx6gsrKSdevWceWVVzJ79mxcLhcXX3wxzzzzDFJKvvnNb2ZJYM+ePXzuc5/jhz/8Ic888ww/+clPcDgcvP3229x6660sWLCAVatW0draysc//nGee+45vvGNb3D++efzi1/8AoPBwI033siePXvYvHkzmzZtYv/+/XzqU58C4IILLjjCd//w46WXXmLLli1YLBauvPJKnnvuOQoKCpgwYQLBYJCioqKsj4NsgKWB0tJSbrnllux3drD4dCklqVSK448/njfffJPt27fzP//zP1x77bU4nU7+9re/8eMf/7iHryAajXLnnXfy1FNPsXv3burq6rj44ovZuHEjy5YtY8mSJYftnuj4YEAn+jwsW7aMZcuWAeqF/dGPfsSSJUuoqKhg+fLlmM1mdu7cid/v59Of/jRf+cpXeOSRR1i7di1/+9vfWLp0Kf/7v/9LTU0N06dP7/caDzzwABUVFUQikazl/4Mf/IATTjiBs846C5/Px4033si9997LmjVrOPXUU6moqCCRSPDuu+8yY8YMmpubcbvdBAKBbOhn5lynnHIKzz77LK+++iqVlZWsXLmSRCLB17/+de666y6efPJJpk2bBqhZyX/+8x8uuOACZs+ejdlsZsGCBaxYsYKbbrrpcN/uIwa/38/atWuZPn06J554IitWrCAWi/HKK68wZcoU0uk0LpeLP/7xj9ljkqkUBkPOss9EN91777384he/GLB+TDwe5+677+acc87h3nvvZePGjTzxxBP8+9//BuDpp5/ma1/7GnfddRc///nPmTFjBlJKHA5H1r/z61+rGoGXXHIJTzyhZkH50VY6dAwXYyekYoTQ2NjIo48+yhlnnIHb7eab3/wmjY2NLFq0iKeffppUKoXH42HNmjWAsuztdjvJZBKj0ch3v/vdbEjmxo0bWbJkCd/+9rez56+ursZoNNLZ2Zm1DB966CEef/zxHu0wm8089dRT/PSnPyWdTrNt2zYeeOABzjvvPK677jr+8pe/MHv2bEANSm+++WaPUNCOjg7GjRvHtddeixCCe+65h+uvvz5L8gBf//rXOeecc7jtttvYtm0b+/fv57333sNqtfLuu+8enhs8CrBarSxcuJBHHnmEO+64gylTpvDiiy/y+c9/nvPPP58rrriCWCyW3f/hhx/m1nvu4/RTT+6TMPWd73yHuro6ampq+v2pr6/nkksuIRaLMW/ePJ5//nnGjRtHLBYjHo9TWlrK008/ze23386UKVPYvXs3n//855k2bRoXXnghM2bMyF7L7/dn/37sscc444wzALjxxht7EH/vyCEdOvpASnnEf04++WTZG9u3b++z7UgjGo3Kr33ta/Lee++Vzc3NPT5raWmR119/vdy0aZO84oorpJRSRiIRGQwG5WWXXSYXL14sU6lUdv9kMinPO+88KaWUb775przrrruklFI+9thjcvr06XL58uVSSil37twpv/e978l0Oi03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17/+5X/s8Xga/Po6lzct18nYApgxYwbDhw9n7Nix/mN79+7lhhtuIDExEUVReOCBB1i5ciUGg7qUt9vtfPDBB5WuMWHCBDp06EBpaSljxoxh9erVlcaZMmUK27dvp6SkhIKCAhITE2nbti0JCQlIKenTpw8ABw8eZN68ebz22msAnD17lrFjx/L5559Xe/979+7l7rvv5pNPPuHw4cP079+/0uuzZs1i6NChbNy4EafTyaRJk7j99tv5+OOP/fIEEm3atKFHj8ohehkZGaSnp1c+USi8vfoDMrNO8vCUiVwsO3bsYO/evZw7d46cnByOHz9Obm4uZ86c4fXXX/fnk3zxxRc8//zzBAcH06VLFxYsWMD7779P9+7dOXHiBIsXL+bGG2+86PvQ0dEV/Xl07dqV9u3VCpDFxcV89913rFy5EoAjR46wbt06UlNTGT16NNu2bWPMmDGMGzfO79c9fwWwc+dOnnzySQA2bNiA3W7nwIEDACQlJWE2m5kzZw5Go5Gff/6Z1NRUXnrpJRwOB/n5+SQllafSL126lN///vekp6dzzz33YLFYMBgMpKamUlJSwty5cxk0aBAAGzduZNasWSxcuJCDBw9y3333MW7cOB577DEACgsLCQ4OZtu2bZw6dYrs7GyOHj2Kw+HAYDDg9XqByv7q1k51k1e1ESlCYLVaMBiqd9E8//zzLFq0CIulcpnigoICVqxYwa233orH4yEsLIyOHTvidDrZunUrXbt25Y477gBUq93j8eByuXj88cf505/+xIwZM1i7di2vvPIKJ0+e5MMPP2T27NlERUVx1113MWHCBAYPHszcuXOJi4tj2LBh/O53v0NRFDp16sSKFSt0d41OteiK/jyMRiPvvPMOhw4dYsCAAbzzzjt0796d3r17k5yc7P8hbdq0idRUtdpDRWVoNBpxu90IIYiMjKRPnz4kJyczcuRIdu/eTXBwMPPnz+frr79mzZo1dOvWjdDQULZs2cKCBQvYsGEDJSUljBo1irS0NCZPngzAV199xbFjx8jNzWXhwoVs2bKFOXPm0Lt3b379619XUcj79u0jJSWFu+66i1mzZjFjxgx27NhBRkYGcXFx5OXlkZOTw5IlS+jbty8DBw5kyZIlpKenM2TIENLT01m7dm2VVUBr5rrrruP666+vdGzz5s2Vnq9du5Zrrxnsd92c/DmH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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#%figonly=实际的系统参数与最小二乘解的比较\n", "fig, (ax1, ax2) = pl.subplots(2, 1, figsize=(6, 4))\n", "ax1.plot(h, linewidth=2, label=u\"实际的系统参数\")\n", "ax1.plot(H1, linewidth=2, label=u\"最小二乘解H1\", alpha=0.7)\n", "ax1.legend(loc=\"best\", ncol=2)\n", "ax1.set_xlim(0, len(H1))\n", "\n", "ax2.plot(h, linewidth=2, label=u\"实际的系统参数\")\n", "ax2.plot(H2, linewidth=2, label=u\"最小二乘解H2\", alpha=0.7)\n", "ax2.legend(loc=\"best\", ncol=2)\n", "ax2.set_xlim(0, len(H1));" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 特征值和特征向量" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "group_control": { "group": 0 } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1.13027756+0.j 0.76972244+0.j]\n", "[[ 0.91724574 0.79325185]\n", " [-0.3983218 0.60889368]]\n" ] } ], "source": [ "A = np.array([[1, -0.3], [-0.1, 0.9]])\n", "evalues, evectors = linalg.eig(A)\n", "\n", "print(evalues)\n", "print(evectors)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "group_control": { "group": 0 } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#%figonly=线性变换将蓝色箭头变换为红色箭头\n", "points = np.array([[0, 1.0], [1.0, 0], [1, 1]])\n", "\n", "def draw_arrows(points, **kw):\n", " props = dict(color=\"blue\", arrowstyle=\"->\")\n", " props.update(kw)\n", " for x, y in points:\n", " pl.annotate(\"\",\n", " xy=(x, y), xycoords='data',\n", " xytext=(0, 0), textcoords='data',\n", " arrowprops=props)\n", "\n", "draw_arrows(points)\n", "draw_arrows(np.dot(A, points.T).T, color=\"red\") \n", "draw_arrows(evectors.T, alpha=0.7, linewidth=2)\n", "draw_arrows(np.dot(A, evectors).T, color=\"red\", alpha=0.7, linewidth=2) \n", "\n", "ax = pl.gca()\n", "ax.set_aspect(\"equal\")\n", "ax.set_xlim(-0.5, 1.1)\n", "ax.set_ylim(-0.5, 1.1);" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "group_control": { "group": 0 } }, "outputs": [], "source": [ "np.random.seed(42)\n", "t = np.random.uniform(0, 2*np.pi, 60)\n", "\n", "alpha = 0.4\n", "a = 0.5\n", "b = 1.0\n", "x = 1.0 + a*np.cos(t)*np.cos(alpha) - b*np.sin(t)*np.sin(alpha)\n", "y = 1.0 + a*np.cos(t)*np.sin(alpha) - b*np.sin(t)*np.cos(alpha)\n", "x += np.random.normal(0, 0.05, size=len(x))\n", "y += np.random.normal(0, 0.05, size=len(y))" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "group_control": { "group": 0 } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[-0.55214278 0.5580915 -0.23809922 0.54584559 -0.08350449 -0.14852803]\n" ] } ], "source": [ "D = np.c_[x**2, x*y, y**2, x, y, np.ones_like(x)]\n", "A = np.dot(D.T, D)\n", "C = np.zeros((6, 6))\n", "C[[0, 1, 2], [2, 1, 0]] = 2, -1, 2\n", "evalues, evectors = linalg.eig(A, C) #❶\n", "evectors = np.real(evectors)\n", "err = np.mean(np.dot(D, evectors)**2, 0) #❷\n", "p = evectors[:, np.argmin(err) ] #❸\n", "print (p)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "group_control": { "group": 0 } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#%figonly=用广义特征向量计算的拟合椭圆\n", "def ellipse(p, x, y):\n", " a, b, c, d, e, f = p\n", " return a*x**2 + b*x*y + c*y**2 + d*x + e*y + f\n", "\n", "X, Y = np.mgrid[0:2:100j, 0:2:100j]\n", "Z = ellipse(p, X, Y)\n", "pl.plot(x, y, \"ro\", alpha=0.5)\n", "pl.contour(X, Y, Z, levels=[0]);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 奇异值分解-SVD" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "group_control": { "group": 0 } }, "outputs": [ { "data": { "text/plain": [ "(505, 375)" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "r, g, b = np.rollaxis(pl.imread(\"vinci_target.png\"), 2).astype(float)\n", "img = 0.2989 * r + 0.5870 * g + 0.1140 * b\n", "img.shape" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "group_control": { "group": 0 } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(505, 505)\n", "(375,)\n", "(375, 375)\n" ] } ], "source": [ "U, s, Vh = linalg.svd(img)\n", "print(U.shape)\n", "print(s.shape) \n", "print(Vh.shape)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "group_control": { "group": 0 } }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\matplotlib\\mathtext.py:854: MathTextWarning: Font 'default' does not have a glyph for '-' [U+2212]\n", " MathTextWarning)\n", "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\matplotlib\\mathtext.py:855: MathTextWarning: Substituting with a dummy symbol.\n", " warn(\"Substituting with a dummy symbol.\", MathTextWarning)\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#%fig=按从大到小排列的奇异值\n", "pl.semilogy(s, lw=3);" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "group_control": { "group": 0 } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "True\n" ] } ], "source": [ "def composite(U, s, Vh, n):\n", " return np.dot(U[:, :n], s[:n, np.newaxis] * Vh[:n, :])\n", "\n", "print (np.allclose(img, composite(U, s, Vh, len(s))))" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "group_control": { "group": 0 } }, "outputs": [], "source": [ "#%fig=原始图像、使用10、20、50个向量合成的图像(从左到右)\n", "img10 = composite(U, s, Vh, 10)\n", "img20 = composite(U, s, Vh, 20)\n", "img50 = composite(U, s, Vh, 50)" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "group_control": { "group": 0 } }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "UsageError: Line magic function `%array_image` not found.\n" ] } ], "source": [ "%array_image img; img10; img20; img50" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "pl.imshow(img)" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "pl.imshow(img10)" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAMkAAAD6CAYAAAALKGMGAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzsvUmvZNmW5/Xb3emsu/f6dfdwj4j34r3sKkuJkBIh0Q1qAhJiBB+iPgWfgCHDkhBzRkxhwgApAQFSKitLVDYv34vWu9vZNbPT7Y7B2nY8XlGp5wUheSL5lkJx3d3M7jGzvfZa/2ato3LOfFqf1qf19y/9sS/g0/q0/qGvT0HyaX1av2N9CpJP69P6HetTkHxan9bvWJ+C5NP6tH7H+hQkn9an9TvWpyD5tD6t37F+0iBRSv03Sqn/RSn1X/6Ur/tpfVofc/1kQaKU+i8Ak3P+94FfKqX+4Kd67U/r0/qYy/6Er/VPgP+u/Pw/Av8R8Df/uge6XZfbzzYAxCxxanUiZ/mzVhmjEikrADIKpyM+GTSZlBUZSFmjymMBtBL3gFUJpTI5K3w2qPKc82vlDCkrUtIYI7/XqCzPV6DJQCZl+SkkTS7P1/q3HQoKeZ4CYlZkFGRAyb9ZnQhJo94/Abl6ud6MkveTIefzv5RrTOVZWYHKkBQoQGWsTYTw/oxTCpT6f7onzp+JVplUrk3rTM7ynPPnbFTC6YRPGl3eQs7yvJjl+rWSz9EnjVLv/z0jz49Zy+urTEZeWymW95+yWq4nlp9TlvdvtVyHUvK+z5+z03H57n78/SnF8veKXL6/REbhk8HpyNlMklHL53y+hpg0w9++usk5P/3X7dEfr58ySFbA9+XnO+BPf/yPSql/CvxTgPrZhv/kv/3P6UPF/diSsmJbTSiV+e7hguv1CWciU7Bs65EpWn62uufVsOW6OTInS6UDD3PHEByt9QA8qU/4ZLiuj9Q6cAgNd3NHazwHXwOwn1u+ublkPlYQFG43kaJhu+l5surZVQOVjmzcyN63aDJfHy45jjXWRBoXWLuZo69wOmF0YuMmrI687TccxhofDetmYlXNPG8PPMwtMWmmaOncjFaZh7Fljoa7/YoUNLm3qEmjMtiDwkwKO4AK0N4kslbYKeNbRWzg+CWsvoOwkh3tt+A3iawh1UmCMSmyzlAnqtVMTgrrIqtmZgqGbTNR24BVidoG/mT7A4+hJaFYmYnH0PDEnfjr4zM6O1OXDfvN6ZLWeuZoqEzk5Cs+Xz1wM67pfcXL1Z4xWr7oHribV2iVaI3n1bDji+6B18OGlDUha06+YuVmAIbgeN4eOIaa582B+7nlF6tb7uYVh1Czn8q12Zk5GbTKWJWwOtLZGacSp1jxm/0VRicqE1m5mUoHnjZHQjIM0QHwMLf8D//kv/76Qzb2TxkkR6AtP6/5V0q5nPM/A/4ZwPaPnufGePpQoZBTfFONAFQ2YLRkhjFYamvx0XA7rdhPDVpl/nj7mmfVI2/nLX9+/wUADyXYQtI4HdFkXg1bbvoVz1ZHjnONTxofDU3t8aMlJ4MxGbJkntZ6UpYv4Yk7cTutOPqaN7c7dtsTRkvGWLmJlZtYu4mrqsepiFaZSkd+UDtuTx37U4uPmpg0j2PNHCzeG5yTE2441ai7iid/rrBjpr4PmCmgckYPAQDlE7k2mPueeNmhjzO5dfhNhUoVl//XAEZO0+nCERpNaBWxMqAgGUWqYd5A6BwKGFeJoW4hw7FtaVcTxiRW9czf2ev3G6OOnELN2kzs5xat8nI4TcEuB1NIkvnrslGnaLmqel6PGzkM5par+sTaTDTG87Q68OgbLtyAz5q9b/l5d8fdvGJKhgs3LNcwJ0vKir1vuBnW3PUtF+2IUYmcFX20GJ0Yg8XpxFVzYleNPFsdeZwaLuueOVkOvmFXjViVWNmZC9cvGe1D1k8ZJP8nUmL9r8C/DfzV3/fAjOLtsMHqxO1hRUqyuXf1yGU38LP1PUOUDFHpQEiGzs5UpuE41/xv777iWXdgjI7LumdjJ0LSpKx49bjlYZRYrUwkZ4VViev2yBgdlQ687TecTg22HalcYL2ZuGwGvlrdMiXLEB1vpi2dnTn6ms+e7NnWEsSN8aSsOfiaPlT85vEJrfVM0eKT5u3dlpwV5jcNB7OmHxTrbzKXDwk7JLIC7RM6ZuzDAfP6lvj5NXrfM/3sEhKMz1tirYiVIivYfGfwa0ulFdloYq3JCsLKYscIgPaZao7YUaF9Rs8J4xOhtSSriI0iWcW80aiomTcKlGO6qgkajtvE7dM1wRuabsbaiNWJV92WVw9bLj/rGYND24xPcv5d1T2PvuFJc2JKhrF8Z4+hJiTD3rdcVANXVc9jkO/k3bzhYW7pg8PqhFWJvzlIxROyWQLjFCoqHfDZ8LLdU+nIdXtk50b2viEkA0iJaZ1k9F+sbpmSo2oDlQ70oWI/Nbx7WPP2sOY/+/m/YGcH9kF+/4eunzJI/nvgf1ZKvQT+U+Df+/seGKLm7XHNup7ZrQZWlaTb1npOoWKKlvuxQ6m8bNTGemLSOBMJwS5Z49cPT9g2I4ep5ro7sW4mnrQ9WzeiVeJmXPNH2zcM0XEKNUN0hKSJo0GpTNVN+Cip+7PqkX1sGaLj3bTmMNfM0TB6yxebkS/be9ZmwqjEr/qnDFG+6Mep4WFo6Psa+7ct9b3i4m8Cfq3JOtO98ZChuu2JXUWqDXqO6MmTLzbMVw1VzsRGQwKywBAdIDQKPQSskozhtxYzSqZ1x4A5zWSjSEajYyJ6jUrI688R5xPZaeJsIGVUctghUR010YEdJBjNaBiqGjIEJ4dL1InDVDOeKm7HFa31HEPNHAQb1iawZaQ1ntoE5mR5mFrmZPn2ccepq/j+fsfVuickzWmq+PnlPb+5u+KrqzsgMGbHH23e8GbaUOvIyk50esZnw5tpw9pM3PoVD3PLFC0bN/GH67e8mnZc1oJtzgfuu3lNazyt8VideN4eiEnjNwM5K/729JSdGwlZ05jwwRv7JwuSnPOjUuqfAP8x8F/lnPd//2MVc7DEyrOrRzbVSGMCrfFcZr280UOQTdrZmZQVtQ2s7MwU7FIChKhZuZmYNFd1T8qKi6onZc2cLFO0vBq3zMmiyczJsKpmdCUb4Qx2dYHMpyAZYm0nrIp0pQR70eypdeDWr3g7bfirm2dM3jKeKjg67F5TnRQXv0pknbF9JNaKbBR6TqRKQ85oHzGniWwM6jSQ1x3JFVJgSqgEKmWSc+iQJFoAFTMqpPK6hmQVWStiJydibDUpKOadxR0jKMhWo30hNWbBKWZKmCmRDdge7CgZxh0VKIvtYXhqCEA20G8i7t7wbX1B03i2zcQwVZxCxbYaSCgSiiG6BUhXOnDRjrzoZAt8tb7j29MFVie2bqStpFQ7+ZqTr/jWXvIwyfe5rcbldd72G+YkW9QnQ2s9mkxEszIztfZENH2ouKwGtnZAq8yl7QG4tD1WJY6+Yt+3jNHxw3HHYay5Xp8+eG//lJmEnPM97xmuv3cZnahsYFNNvOge5UN1A4fQkKLiYW5Z2RmrEve+40lzWsDXi0ZAoU8GHw3D5H6L/Vi7idb4BcQ9aU5cuIG304bWeMZoedoe+dZeLkzHaaoYguM+dFgd6UNF1xxpgBfNnilZ3s1rHuaOX908oX+7ov3eYmbYTNDcZ8ycUSmz+fWJ8VkjmMBJuaSS/BtKNrYePcomSJlUWWKlQSnOZXLWimxAjRkdFPOlkA5Wg19ZYq1IDkJnUNmg50RWCjREB1UsL6RAxUTWheFzkmVIGRXBjBHt5fdWjwqVLc1DpNoLpgGYLi1mgEPbcegi84VlHh3HVUVfVYRk5ORWCa0yV3XPVdWztjMXVn6+dkf2vsEWrLmuBc/dxhW1DXzePPB588ATd+K52/PKX3Dj1/Sl5HqYO2HAynd6kTQXrmdn5TA0JKxODNHxdtzgGynFnIpcVSc21cS+bwlJ89C3TKPjVAL1Q9ZPGiQfurTKdJWnMpEhOg6+JmXN7dRJdij1ZsgaTUaTcSpR28iUHD4ZpmDpZ4cx8uWsq4kLN3CXhc0KyXAKFa9PW8boeH0UIDl5y/PNYbmOxgYqE/li9cDvNW+J6EIVan4YttzMa361v2aOhvtDR/i+Y/OdZvU6YceM9hkzRLIpmzwkzJAwU8QOcuLr0UOykEuwANkZqB2psaic5dQPCT1FslbUd2CGQGqMBIACFTI6CE1tx4zKkiFUSPL3gI7vP+fkNCoYslWokMlWspoOmewzZpIMZ8ZIaA12zJghYYfCuSi5bDOB22tSr5hii5o1b9WWyVuUypy6itoEfDSErJmTIWXF0VXle6g5FnbxTHBYlXjSnJijWf5+H1s6M3HvO2EWy6lxUfU0xvNZ80itw1LyTskRs2ZIFTrlpZS+mdas7MReS+ncmMCuG3jRPvLmuGYaHf38cTDJBy+jE+tqYm0nAA5zw7PmKMAtGI5zzUWjuR067h5X3K06rtoeZyI/W93TWs/GTcy14X5seVrLSXWKFY++YU5GgOPc0BUKcFNPrNzM49Twonvk2+qCGLVoIMCULHdhzXO3J2TDykxYnfDJcBhrHt5ucO8su29h9TrSvh5BK9l4UyR0jtAZwq7m9NIBDr+STOJOnZRQtSEbhUNKIRMSZvBoX6EHT6oNyWpSZYi1xkxC72ZTyqTDSFbgdw7tpRKLjUF7RdaSgWKlQCmSK2We02QNJmUB/AZQSvCSskvGUBnMlHGPnmyKnhIzdpBNPN/LtWdj0AHm2nEwAsa1gtZ5xmB5tjqiVebn3R0+G564Ez4bpmRIWXP0NUplbkZhK3f1yJ1fsbEjl67nyhz5Xl3ik8Eqifg5WeYoW3WIFVOyfNXc0qeKhBJcMknm+frukifrnpfrPSlrriopq9aFevfRYGyk+4eeSYxKvOgesSpxO3VM0XIMFe/6FYCArWgwKnO9O/Kk7XneHHA60uqZtZPg2vcNMWm+OV3KCTKsOc0VtQ1s61FeR8mXXJvAyVekrGiN58m65zDWbOuRx6nB6cjX4xV9qniYW/7i8JLvv7+CoOi+dly/yjQPifbNiH0YUONMrh1x0xDWFdOVfJTTRUVoFSqAO2WyVpgpYk6ebDQqZ1JtyQryriFVBhLErkKFjIqJVBvq2xGVMmYfSOsK5SOqn7BIgNV7LSxWjKg5YQaYLyrskCDL781WEVopsWJr8CuNmTPzRrBSbCWAJBCVJLtKY0bJMPYU0D6RjGIXM3rKDO8sKmXmtSHWHamGw6rjbiuY5+Zqg60C756sqXTkq80tc7I4lbDGU+uA1ZGDb+jszGftgSlaah14N2/o9MybacPd1FGVtGhVKjpIZMqaQ2gYk2MfWmodeFnvcUVQvhs6Bu8Yg6MPlTxfR553A1MyrOqZVT0z/kPPJLkcX2eW4bo9cuEGahNRKjMGK6VWUWSnYDkFOTU21jBHOZUAnIlc1v3y2LF2aDJNAdwxa/mwrZwkKzfzRX3PcVvxG57webcvp1Zi71teDTu+2+94+OaCzd8ZVILtNxH3GLBDxN73qEMvGCIltDMYq3EHoV7NymAHAcNmzviV6B2qSNgqCH7QMYFWqB+VYMUKIKVbTMJ0IaCdwm6h35dCKMhKLWr+ueTLRTvJWlEOY7IBHTIqZnKl5TUzqCgZIynQURFrs4D9XMiBbMvv1Gd8BWaW53kULkOqJWuGkyWqzH5oeLY+cvANVseiqJ+/U01CMSfLo5cDaogVmozPopXIYxNPqyNDkgrhGIWdNCpzHzru5hUbN1JrYapq7bloBnwyVCZQ6YguWMmozO20Yg4GozO64KMPWR8Hk5BpjaS7mIUdmZLlNEvkhyLCaZVpnUepzEUlb/7CCXNR64BWW+7GFaHw9ilr5mgW/l1q2lQowbhgHRABs7ZhER51sWc05br0qKgfMjpA98OAHjzEjDoWscsasrPEVY3fVswbXYJCTniVcvm/AqNKqSLXGVsrG1FDsj+yloRUnpfk9ykFsxfBMGaUD+Schd71Fj1FdEgoH0FJkGYtQSUl0xmsy5+zKqSAAp2QQPsRWZAMJKsgSbmW5nJtOaMnMHPC9boEimg1WUGKCj9LIKqgSN7QjxV3pmMMDqUyTxope872ExAc4nRk54bl7862pJA1bckkPhnmZHAlI11VJ55VjzgVWZtpYdeOsRbaPlisSrTW43RkZWee1Qf2c0PjAo0NjOHDt/5HCZKYxaKx96Kgb+zE1o58ub0HhBo0Oi3ArTEenwQU+iz/rxEm66x6GxIPvmPvG46+5tePV8JoBE18oqlNYAiOJ82JRnue1Qd+tb/mh37HTd/xONe8eXMBjxZ30Fz9Nex+NZAqg5oiqXWomElmgzqNUFeQEqafia2leszYUyDZmuQU01ZhOvBrhR0r7CmSnKa+nyUDGEWqNMkozCwllsoaPUWmC4cZGpIzmMHLZl87VErkSr4yHTJhZXEHL7RxFqHSDmJhqfZe/nwKYBTRaZLTuGPg9HmNmbIQBkqRjGQ0d8ykWlHt43sq2iqS09g+SvDOEsT2GEEr7GgELw2WbCEZw3xhGJ9a9i8VY23ZNhMhGS7rnuvqyNpMvJs3RWeKzEXA9cnwdtqwMsJsDtGxbqciCczLwdrpmXu/4pvhiq0bWZkJp6SimC+k6hjLa59CRR8qbqcVh7lm9Pa32NAPWR8lSKyOS0Y4hJqE4sF3Swm1chMhG9Z2ojainm7tyCnWGBL3U8dkLX2oeFK/57trE6iinD5GZS66gZA0X63vuHA9D77jZfOAU+JBcibyMLWchprHYLCvK9xeUd9ntl9PuLcHcluRtV5O59RVGAo7VajW5EqN31lCq/CdYt4q7AixgmTkFFYZdO/Rc0TNgbiqyO59Jom1vGZo1UIEVIA5ziKX5EyyumSSLH9XyrAzBawHwRPKy6ZWOZMqQ1YOHSIqihajgzxfqbwYiLJR+FZTOVH1AWKjibUqr6OFEPBSahEzZlRU+5mmk4CHjMqKrDVD2+A7uxg352SIWTHYigcvqvdZ1BujJWXNKVS0KwmGMRQmM1lOoeYUanzR0Q6+4dE3AFw52QM7M1DpwH3seJwasSiZSEya1nqetkdedI+MUawqH7xfP/iRP+E6O0rPdGBrPDEruoIbtErMyf5WvTkVUekYa8ZoqUwg/Ki2rXTgZf3Aykxc10cevCi/r0/bJSCnZLj3HX2s+Ha45PV+wzw5wmOFHjSrt4rmLuP6jD1MKB+W640XHSDANkUrQZIEaIsltgh+SShTO8hGFOeuIjTCDqXGSinUWLKVU9xMArZNH3D3A+5JhZlioX0Teg7ElSNXltQYERkRzEDO5Fpo4mQlO8VaY1oLNRJYlZHASVKq/fiLyFotmk50wo5NV45kJGhiJYDelNIrVgod5NA4/640CnbDCkNWPZbn1obYao6DYdhUpEvFdXNEq8TKTvze6h1jEtr2MbS8GTcc54p3Zo2PhilaHkNLa2ZqE9jYkUZ7xuTEvjIrHn3Dq3EnJfs5y6pEU7xlTdknViU2dmJKEoznEv1D1kcJEp80D77jEOpiSHSszMxX3S23XhiutRXq1hT0GtHonNm4kUPd86w5cAo1tQ48hpqUG/a+JWbFGB1HXxOTxugkrEiy1AUg/u3hKb++ecL0qqN60HR3CnfMbL+ZcY+znMKDJ61asJqwq1E+oedI6hzKinp+VrXhvCmELcpG/iOInqFDxvWBZDRm8MROSqekDXZO6N6TnRbWy2p8p1GXFbFWVEZh+lmESGeYdxZzkg3gO409mRKcwmid2Sg1J7QXzQUoIB9SLbhMBEn5t3mlsWMu9HB5eBZdJjqhl/Wcl8ef2TCUZEg9RdyjwloJRDMpQqeo9goxHEkGeawbvncXpE6o4JQ1rZkX0c/pSKXDUh3sfcvvd2+YkqMzM2szYsj4ZNjYkVu9KkJ0z5AqdnZgSpanzZG9b4uKn/DBce/bJVgqExaD5oesjxIklY6SIcpvr3VY6tMzq+GT4Xn1yM72TMkVp60wJN+rC5yKYrWeO+6mjpwVX6wexPpgJ162e1JW3M0rflbf8s30hFMQevfV45bpTYfba5p3iuqQae4j9uDl5B7KB6gpgLdkAKfFXoL9LQYIIFVS94e2qOxBXLhmFDAdWiv/39RStpTnZaNw9n3JpHwUQVBJSSMb28qJXdWcnhvqG9noySoJ3KoIcqEwVul9ACeryWXzqgxmDNR3CjNG8ZCFhBkdOmRirShJV3QYA3aS59khSl9JkufqmPGVvKfYWlSCnDMqZKqDZ2UUq1cw7aREG68sR7/m29ly2NbsmpE/qR/p9MxzJ/aVm7Ap9hYRlsfo+M0ozuSUFTsz8NLdszYjfSokTxbF/86v+Ha85H7ulscLyxXp7JHaNjypT5wKLfxvgks+SpAkFKcoRsYz1avJvGjkw3KFt3Qq4rPB52IzKM9f2YnP63uunaTu19OOY6zZ2hGfTXGR1mKCzJo+1RxjzZwkhQ+Twx41tpcAMVPGjHLyKh8hRNKqIa4rslUCpOeE6ouq7UXlFtuHbMqsrGCXIPb0M0WrY15cuVnLJlVBQ2ul9DFqscbHzkn5VMqf84mtUkbHXHQUluepLJqFKuWXSkLxai/gmpAwMZODWGCyk6xjRmHDVMEV75+rFuxlxkiqxKCZ9bmcZNkxZ+FSh/L4KQKlpBsD5FqCaV3EzFGYrzCLYRQaHnyHqRKH1GDIjMkRswL0gk8BYbCy4ovqls/tPb+any3Ejs65UP2if52KSXJOlvupKwdlx3GueVqLE/zHzV8fsj5KkNQqcF0d6czMmOSiz0pqyoqhnBKXtmdnBu6zZmekb2PMjtZ4DJk+Vbyetrwb18KQ1CeMyqzMzNPqIAEzK8bk+K6/4Ov9JY+Hjnhfs/2h6BpTpjok7Bil3Fk5jNVlQyW0zzQ+Lf4rtWQQySrThXyE44XGbxWxKsbBElBmytghoWMiJ1XUdENyCpW1ZA+rC/aIkDJ2KixSAddx5YS6rRTThbxGMhodZEPmzhXzo0ZPAe3LKWk1sbPyO0ogxU6oY4CchARwR+ljyVphh4Bfv2fQVJ9QUcq4rMF5wV5nYJ+NYt4abC/kxVKSAdV+FoCfYb6wxMbiHxr6dc3h0vOX7gUvV3v+ZPMDO9vzRXUHwH3o2M8NaycVxt63+GSodcA3lkNqeWKOi5Gx0Z5XalfMqbI/rtyJU1PxWfMIjWBapxJrO3FRDTzMLR+6PkqQTNmKDdrOHEv6G6PjunQWnsG6z4Y+Vdz4NTFrjEocYiN+r9hQq8Afr17xZdMsLt4pi9v3GGtOseZVL0H0L7//jHRfYY+a7Q+KJ/9iIjYaFREa1UfCuir2ESt9G60pJkShQH+sYwjbZDDzudSR96Y9mDlj/PuuW9MHqfHz+xOf0kobW022kiOTEZDvW42jeKyslHFnz1Zy7w2TKiLMldFkowmtQYUs2ajRElgaoXOLnT62mnqKJFc0o5yLsCj/KS8i5lKO+URW4v9CKyiZIzkpo8wsuMUWIydZmDDtE/o44mb5YOzRkOyKWClCrZiuKr7pn/Pt5SW/vr7i8/Wen3d3RDRDdHTWL0ZVZ2ZOVDgVeYgdb/2WKTnezRtaM5OQLLIy4sR4Xj/SaM+vT0+EFYuyx66qXqz+xVv2oevjUMAqceEGnlUH7nXHlBx1sZxMsSsgO5BQ9FHKJqcDhsxz94jPho0ZGbPlGBvuvdShUyqbrYhLp1ARs8YHQ5zPDlgBoXoS3UL7hDlOooQbvQBbv7b4tbTThlrRhYwpijllE2RbvFAZUgWhsIoqijCnckZlTdWIloAWBTu5wg5Ztbhy0WdsI68ZKy1g2SqSM7hDLPiEha3KBlJrhRYu5d/ZRJkBHRNJ6YXFylYVsC+NWGjJMLEWC4opZkl3DJhJ+lHO16zn9wF+NlzqkNFzxhRri4oZahZNJjsjeKgEoTsmXOmbUdkQK8Pkax6ajsYGfrG6ZW0GOj2ztdLkVuvA9+MFB1/zw3TB63lLyIa6DrRmlmrD9vI9ZzG1Tk62dcoaqyNXpmeKdiEFdm5Y2ng/aL/+f9ns/29XLP6btZnEwYkorA++W+wlQ3SMyYmW4bsluxxjTciGvZH+850Z2JmBWntu/GbBL7d+xRQtD0PLMDvMTUV9J9pF/ZgwJ0+qDGFlMOuarBXj00pq9kk2tfZpOcH19KM6HgHgoTNMWyM95mtFWMvp7o4KdypAeRaRES0DDFBF+a4kaP1Ko6NalPBsFaF5jw1Cq/Gt0LtZwbxLzDuhkUOtSLbQsFZJYDVGOhI7s+g3ei7ZQvNb5ZAqzmFbXMzJKIxWxNagvWQSNUvWDK1Q2HaM8rtquSZqmDZ6yZq+1ahkUKFQ4tMEMaJTpjJaMpVRqNgxbyyhU4zHisemZoiSLfok7uEL1zNEsRmFZEiopSfcZ8OD74qfy/IYGpyS2QTPqkc2euRNs8UVURKELXs3rolZ/Zb74netjwPcs+LKnejMvGSNrR0Wk5tW79X2fWg5hJqVrZmSZWtHpmCXsss7wzHWXLsjP0wXnGLFfm74m9un9Kea/FBhes3qB1UMh1A/xN/2TJWTfMEBWsqgWLQFqdVNySCmnLBlE8RMaIrVwxeAW4JGh4xfKarHSoB7KadiI6yXNDtF7BgJrV2ux5009T5ih4ieNe6kcQfBDfVtS307EtYOPRdQP0sjVWw0tg+gFLaPi+1kCRCrUWuzZJGsBVvF1mCPHuMTsbXYo5f3VrJHLq6AaDXJaPmsQl4wnZkFd2ifhM0rWXR6vsYdZhFJYWHYlBcctPlO4Y6aRyru+0v+3AVerve8bPf88eoHDIkre+Rvx88Wtf2syL+ZtwzREdE4Il82gmem5Hhu99yE7WKmfF6o4XOz1tYOy2H6IeujBAkU304ZoNCZmT5W3IduifraBGodcCrSGF+GDUjP85ntCNngVKQzQiMeYkOtpQHoWxc4pQZz0rhHxep1on6IxEZR34yo04h1hvnCon0k1IZsIUdRmc2QMGPBICGjizHR9B49BVJtUcGgg5OSSYEqzLE75MJqifhW7cVakp1sslhLwMW64IiY8WtN9RCkryTK6a5L//oZGCdBW+ifAAAgAElEQVQlzVjZ6WUjnoNyCXiKhb7WC+Y6e7eSVcxrhfF2wTRn1T7VpjR7qR8F9HvGTAUReW0vln45FKTsjK0p1pZil6k0ahS1X/koxEQUPUj5gBonHFJaomA4GmKjOYw1x7rm5ERDcUUS6FOFL52m92NHqDRVjEWll8y4MwNTEgU/oXEqLp2LtQ5EdGnTTjgdeShU8YesjyMmZsPdvCJlJSNsCiVX68BQTG2VDpyCZI+7aYVTCZ81T6vjElidmbl2B46xoVF+GeDw/WnHzXcXuAdDfavEVzUKlohOdIO8agpLpIgrJyWLeU8Npkr9yE1bPFFF1TaTfX8yl47DghkXw+B5iENopedjwSBZNpeZE2mSet14GRKhkgj0763uwn7ZUTCUihl3EGGTLCp3snKdyumiuJtFQDz7rHTMCxYysxgwgYUujrUSp7ISQVTPQoXnAu5VRjQjLWJkMlr0o5KhhPkyi5AJWqjz0lrs11b0E6Mxg4YYISTcw4SeHc2NRkXF426NDwKqf97eUmfLhTkVrcwyJcvKNVxWA1olamMXg2OjZtCytxrleZN2xednlsM3Zc2U5O/ORM+HrI9kS8lYHZemqyfuxDHWv5UCDYmkBJucHb2OxKXrOcSGPlYMsWJtRr6fLtEqcYw1N+OKm+OK5gdLcwfdm0i9j1R3o3zxdo15nEQ5jwk7JkwfFtXY9DNxVclAhJUFLbggnoFyZUlTQk9pOfXPp6opBuHqmGS4wixeKxWLHUQZ9BQxo8KcZmLVyfP6QKwN7nFCtw6wmFGAup4jqn2vGZiplEi1xhafVnLvG63OhsTFj2U1OQs4P++L0JZeFApRYEtAGoXfWCnZKrMwa34jwydCp+WwOVv4CxFipiC/M4PtgwyrGBLT1uCcZl5rjM/U9+cOzAizx8SIfbtn0zynvdck55jvLL/+hebn6zuMyjy3+0LsBIYoxsWtHRhSxXV1ZGd7bvyGC9Pz9bzCZ8MP6ZJvx6vlM3tR7fl+uqDWYalG/n8B3E+hZm/EX3WMkg7XZmJnh4XuvfFrQIaW3U6SHq2+lHFDxmPKqX/wDa/0BbfTiu/3O/pjzfogWoXrUxnEYNBKwG1uXSmX5Aufd5XU6Ap0SGWaiZzAug/YYylxtCJ0ZjmVU62WjWdGUacB3ClR7ZP0nwwOe5yX925Oc/FgWTEpWjFGytgfu2zwVBUNJWXc3mNOQlOvXjeYMWAHUwQ88MYuLFts3venA8VSAmYUnaN5eG+ONHMqCn2xqTdCNc+7CtcHQnPOJEVEDe+FxzM9nZO0Op/Zr6wVthfSw075/fBJo5iualBQVYXs2FW4g5SiZkysv9fMe0UfV/xP6Q+52p2YouVFs8epyB91r3laHdgUxb2PFVNy/KZ/svS7a5XY6JGftzfLn82PWjPezevFzvSh66NlkvPIyWNp9gfJHmfqt1FiXWmNZ1cPPKuPJBQv6wd8NuyMpNyX7p631ZZGe27HFadDg7qr6N4k6vtI825AH0ZICTV7qk2FPo5Ag/IR2xgpmYo1XE0eY8QeorzU0tkZcnrfzJSsAqsWC4rfSHNT8O9NgWbOuJNhXmtsX6GnSGzEznK2umSrlnqfM/Nl1TIJJVmFDkjLbCmBdJTGLH0WOIP02KsE1gpgz5qFUhb6NorHTKnFWwb/yvspqSdZhfXnQRLvXyObkjkWI2dR9ychQRIsjWVZne08/JZWQ+nJP7sBrBXx01rRcKT0FGVeulNFMxmiAyOlVELhVGRnBtZm5ML03LUrXroHxuToUy2zDJKjjxURGRRxCM2yz/5NAgQ+luJuAtf1kc+qRw6hWRRVrRI/a+/ptJjeGi0T/1Z24kW1F9ClIjde5giL2Fjz7XDJHA03xxXqpqJ61NghFnFLmKvc1NIa6xSpqQQ8N5asFfNWTnUVM7FZCZValHXbB9nAhT4NrWbaitVi3klwDM/P7I4iVZnpqGjfARTNoxZFXcoh0TRSJ0IlCO0rQL84dJNsvmzsQhioDCpGqgf5gnVIYmKcA6qW7KHn0nSVIRYgLU1gEhXZvB9ctwB0rTAhL+/NTJnQij8t1qWzscTMGajroqGch1dko+Q9WQ0Fp2mfqA7FQTBqcRVbRUI0FKxmelLsQUPEDjOb7+Q13NHxOLXcv6z43w8dXzy95/PVHreKdFqy8lP7iFaJquyTMTnG7HjjtxxjjVORx9CwtSONiXxR33PtDtyHFXdhxatx+8H79aMESUiGQ+G1T6FCq8zODVy4gWt3IBUbyqt5x4PvpHW3sFlnu4lTkbX2zNlKgAxrju9WtLea9iaz+uaImiJq9qjZk7qK1DWii+zEZKiXckNKCdMH6dVorVjbrSIF896CUTQMv5aRPtOljPwJm4TyithmssuETpGdJnTnusdSO03oRJw0Q1xoUXc/vVe6kTIrtobYGEKrsKNcp4oWNRgJtkoGRqgi6p0D40yx6pAKKE9k5TDFGybsml3KnzPoT04XShwJ9lAC6beESDlvoinYpmTDs7ioovzOWIiDeetkFphVzCsJ2OQy1WOhmU9eyrKQyzQZoH5fyqkIalZErznNFXe2443bLqq6UwGfLbX27EPL3nSsjQiQP6vvCiMmQwe/Gy4B2Ncth9As03c+dH0kF3BYBtBVZQjzKdRy4ZX0AxiVuLT94u/6oronojBk3vgtsRTefRIwd5odZCilJ6m2aK2lJ6RQkfo0UO1XmN5jepY5V7FtFmEt1XahQs81fnIinvlWM+8U43Um1hCuPXiNuxhJZQpHXcsFHLo184VBRfAbje01oYHqsaJ+kGEMdsy4K7u4d90xFpcxxRyJmByLWn4+pbNWpW03iVfr3C8Ss2AuJeOEaA1+Y1C5Ko6Cs9u4WFWSqPKSQUU/sX1i3hphvZozeydBpX3mx6TQ2RGdrBgizy5psdknYfCcRnsJtuhU6YaE2FjGK8ngbZl/rKeA6hOrOZFNg8oaf6y5AfyF4aruuSh+rQvTL9dxnvjYp4rHIPrZ2Vkubd6ZC9dz7Q48+Lb0Gv0D10kSgkU0mZWdWJuJKTn+ePUDT+0jY3JUKmJUog8Vp1hLM1ByvHD3fDdf4lTkD6vXfOOvuG5kQDJJoSeoHzLu1QPLjH6QTNI4pku7bDCS1Pdn5ue8IfScyCtL6DT9U83pC9kcYZPI68DF1QlrEl9u7/nNwxXP1kdePW7ZNDKG6Pe2N0zPLH2Q5qA3xw2nscKYxP62w946YhfRkyogW67RjI5YZ+ypjCr1ArrX3yfYgxnscp0Zih1GcE5oDWKgglTrZRqkHUVvkSksP6KuC6axJ4/fVlKe5vOUSIV7nIFKdJlzT0p+36R1bvvVlHFHg4dJS6+Lls7KcwYOTfF4VaXtoBKGqzpEyVxTxNwdoXKocYbdCjtW1PcKPSvmS8dedbxZb3A6cl0duY3rJVBqHdiZnogmZMOl69kHIYVC0hxCzSlIZvn2dMkQHH988eaD9+vHwSQ68Lw+cO2OHGIjlFySe4m8C2Jeu7aPi1B4aXt+Wb2lUZ6VnnjlJUj+5fSCP9v/Hn/2618SHypWX1u230SqxwApQYjktgZnxb6dEtVjxD6MqGEmXnRSW2vwa8N4ZTi9kFPv+ItAddXzB8/f8e9cfsM/379cLDO7auTNsOGyGth3Axf1wPrJxLPmiE+GP1y95u0siu/fna5pdp77psPpyL6ZuN92bNsJreCq7bkfWzrnef2woasCh9sVRIWaNHoU82J6pQRfhNIKXCaf2EHqfh0zZoqiiCMZIutSDlnxpPm1Xewu2Yr1PdYavzEiAtaaKkPoNNq7orsU4B3P4DsvWTbVArBTpaUnpmQQleV1XaG260cJhuRUGeGq8GvLtCt+OlVTKcmO1A6VM/YYqRqNmSSbD1HxZrvGlF6jS9vz1D7is2VnxSH+zfiE3xyv+EZdsnYTY5Bmvl92N7ybN7yo9sxrmf65WoSt370+GrsF72/gk7LcD+PC9Ly097yLWy7MiZsg4GofW16HC1Z64odg2IeWSyvda0dfE0eLPRrcAap9wIyBPE7SXmsNuXLEzqHnSOg0/ve2aJ+XL+nuH8vp6NcZdTWgNPz+Zze01vPV6paYNS/bx6WF+Gl1oDWeL+r7ReA8xprnlTzGkHk17miNMG7nqSxrNzFFS1t7fnFxx82wZlONxZOUWbUTziTGzqN0JgZh1fqmInQGMxrcCbI22F4mubR3kWQEKzX3Ar7tmMheLZvcHiNmEgXcjhFVhkiYouhnLY8zPuNOgXkr3jWhc8+99GCHUEgEYQOlh0aC1wxF1Ky0WFzmhH0YRfcpgRraplDFJcO0wt6RQY8BfRxQw0QeBtr9BrgmOc20c5hRstmXqweZtVXdU6nImKQxq9Mzx1jTGM8XnYxMnZLl2h2JKOlsVYmHMkP6qvoHLiae15nOM0buknQXxBL/xu842IYbv15O70bN0sqr4Nod2eqBv5ue8dc3z7DvHM2NYv0q4g4zag4oa8mzJztLXjXExpZec814IUExPpET1X8xoavI5abnD65usCrxj9aveTtv+GX7jj7WdLVYsl9PO2odfmTLPnBp+2WO7T52BTCK/WFXDzLku9y3o7Mzl3XPy3ZPYwJayWCLhCJEgzNy740UNDmB0sDFjA81sVXEVlzGsVG4R6FsVSz2/LEMeTjTrMWUSDEtJis6D2c6uzGiolfS364j+M4uGIXSpfxjHKKCGBSzFT8XCMbx2/elYGjLSNMgWE9RtKeQF5Ik1hozC508bw3uVBG3leCsIZAaS1jJ9df7TGwUx2+2/B/qS768eOBpdUDXbwHBJNLG3S7zvd7NG6yOfD9d8Fm9x5D4erhmTnIrh3Nb+IesjxIkTkV2duDaHuh0mcYYpbe90R5TFPZaB7qyGS9MT0KjSXydrnkXtvx6uKb/bs3mB8XqTaJ9O6EG8QflroHdGn/VMT6tOX5uMFPm+CVMzwO4zOpiIEbNn372SuYCG8+/tfmePtbszMBbNss1XdkjjfLU2vOlu+MHf0mnJ6YsH2GfKm7ChruwwqmIU4lWz1zXLBnm2h3Zx5bvhksuS5+sVpkxOvZTS+1kLrF1cnCYcictaxIPNslY1oMDk1GjpnEGHTUqABrMLCSDmeQ/cQYL/XUur7JS5EroYrHVy7RJXazvaDBlftcyg/gM3q18/nJWiUYj5sezzvOjABiFztUxFjeAiLGxlnLWr4QWtl5aEc7snnmcUFE0oQZIjaG+Bx0qVDI8VFu6euaHdsfvN28wJLEo6ZlbtcKqREIGRLxopIX7ypxIWfMQOjZOMHBn3gu8v2t9HAq4tOSO2dHgFzPaObpFJU2lmyySUBxSy11Y89Q+8nre8pot3xwvqW8NzX2mfeex7w7yxR97aBvirmK6ruifaQ5fSYed+vmJ3396z8rOfLW+5WZa84/Wr/FZJqm4Qhic2TOA526PU4GtHhmz46l95DG1VEqo1YRabDUPvuWz+pEXzZ5Ge9Z5WqwTEemSPMWK74ZLfJbbBpxvNgNQ20Bbz9QusCu3wgPwnUzR74PG1qKG+1Hahe2IOAfWhaoujmQ9J0wZDhGNXm4BIb3xecEs4umSLsxYadxjXFT7s7B5ZkyzUugk9ya0o2AgO0SZjM/7IMlabgOhS1NaaEs5lt+7FJq9uJfnjcH0/v3w8NoR23JLiUpT3U/UezFV+pXlzWaH04kvm3t2ZijiYs9nlfiztnbg9bBhiBWnKIfX23nD23HNxk04LfvtQ9dHwyQxay6MgC+AMTnu4oodAz5ZRi026M5M+GwwyMY9pZq7WW7T9vqwoX2TaW8D1e0gGaStyZdbphcbhqeO/qlmuoJ45WHWbBuZ6jeXDsgLJzaYtRlZm5E/qF/zLmxplOet2S599ofYULnIKdWY841BSazNyDE2y02F3o3rZYp6VWZK7Zzcc+OdXpOy5n7sGK1jKHdbUipzHGu5oabK7B872m4mREPK0LjA5OWrUiahTcLk9yNMk5GyTOwyQoOHTkyDodEYX/rRfRYf1ZwX+lv70l7sE7GSYDmPNz2DcD0Le5a1lkn0SkvZBuW2EXINZxZsXiuafbnXSiz9+UmCwxWf3PSkRk+ptBOUYdxayRDAIPMGiBmnwL57LPpSxbypmJ5V3K9axuRYm3GZiQAs00CtTrQlW6zNiHeGr7mS+5tkvTTofcj6aBRwoz2nVKPDGqMy+ygdivf5fWB0euYf19/zd/MzrsyRr+dr+ljzz9++4Hhs4F3NyzeJ5nWPfjiCD1A5MJp5axmeaOYdhC7T7QbGvqKrZ4bgyGVTWx2XjLWPLb/RT3nrt3wzXPEX717wdHVi7Sb6UPHvXn0tI1GbxGf2odDUmU098Dpc0KiZr5pbIopGeQ6p4cqcWOmJMbuFqHjZPMEn6YP58a0mel9x0Qw8HFvm2aB1Yhwd96Mjz4WmnjRTJZpQexQccZ5s4tdSUk0bhfEKMwntCkLDutNZ1Csdia2UoFlLxoitJiKUbmg1OqjFar+MGio3EzKjZCpVCIDQCoYRmthgh0RoRDM5W/cBsnFYqwmNxibptDxPhBECwaAKG0cs7QXbrpRuCXcC+6h5vF3xF5ef89Xqll+273hijzy10rZ749eEpHkzyQ1Mj7HhmXskJENtAscog0E+dH2cqfJkObWr1zwxp8Xe/IO/5C6seDtveOJO9KniL8cviSj+anrJ95OMEhqGCm5q2tea1W/2mFc3pMcDqq7J1zviqloCZHqSSKtIozO2kv6V/dAwzo6/NC85+op39xtcFfCz5fPrB7TK/NHuLf/hi1/zp+uv+Q/aX/Nnwy94ae/pc81KzbzOOxKajR44pJaVnpafd3rgwvQ8xI4+1dzGNa/mC3mf2vN62vJq2PGilekwey9DCQbvuGgGqipQ20jrPHug3fbcPXbl1tKKFDUxaPzOED3Yo0xVPLsHzMwyYYVZ+uJDI3O6xstC1SYnzWJG/r65DWLNCVlMhzjc3ssgiZJVZHqKIlfS/wFFmCwGyDNGiZWSjk0FqUxoAaR9tw+QwPaJ+n4iWc3/Td27xMqWpfldv/Xae8eOiPO69+a9mVlZnd3t7oLCxsJYCEtYMiAGyGLEwEjACNEzJoxAlhADxggJCUst2cgzhC0kBngAAyRbMmbQQqB+VVe3OzMrK/O+zjMiduy914vBt/aKc0uVXRerW5ls6eqcE/ecOHF2rLW+1/8RVpr5smHemGIzIW3i7iaQrKJ9e48636COE5cPG5I9Yz83/MH2GQ8XHU+eH7gzPTdhw+8dPuTedwyh4bwZabVnY0Z+NLzgGBxbO/LL7Rv+ePqFztT1+tbSrV7PjNnx4/k513HDPkpO3mnPVXdAlyT4qX3gi/kpE45d6Phif0n+vGf9WrH+WkSnMQZ9fka+Oif2DfNlg98q5vNMthmSIgSDPzru7IppbIijYb9pmIPl6vzAeTviTOQH21esjOfD5g5D4hN3DUhqldB0yjNmUQGMZK7jhrU+NRfWeqJTHp8tCc2YG8iJcztIl8xMXDjHhZNc+s91r9jFFfdxxU/GS1bGcwyOKVhaG2hsZD+25CSvIHpDChpmvTjFkZz8Q0lLNXYSXWJ7GgLqKPCV5kE6TAIJEYakikVJpVW4OeHPRJ0lbFxt/1IgKIt+sFpqD6OkI5ZyrV26+1hwXrnIoi58FoVf2/K7NPtPVjKtL7VQ8yA04ubeF/s8cFMkfniFP2+JzTl+a0QMI8B43/ES+J3+Q4bU8Nw9CIw+Oj5YiVHTAmZ80d4TLzRP3Y6v/cWfPnZLKfUc+Ps557+qlHLA/wRcAX875/x3ft5jf/ITwhMj3aIdcgqnrNnFjnM7sNVHfLZM2rPWM5rMtV/z6rjlq9tz7Kho7kUKCCBvevKqIfaO+bJhOjfEVrBCelLkqPCzJQ+G5jKyvdxx0R35Nz/4fZ7ZHbu44peaN6TSv//E3vCZf8pdFHh+zIpPm7c80wP3qeWQG3o9MaSWMTu2Sl7vkNqKKbrQQi7ZNpKKLchVaUhIPnxujnzirvkpl5yXiLoxI6+7La+OW550B4xKXFweGYMjobg+ipbUfmzZm54YNGYn8Be0woziTmVRxBbMKKlS6BR6lv+TDtYCj5fIkq1QcuNK43axOvyq0rjKC2V3jAUcSQU1mjFU1RYzzIwvetxDIPQGXQQwtE/YQ6qyramxgvcqyOFFGT91tkioNtLGzhm9G3Ex087SGnbPe9xgyNYxRsWbyw3/wvZrfqV9zQ+6r/jd8WP++PgMqyI385r70Ndxw0fujjdqyxfqive9fuEmUUpdAn8XWJeH/hPgt3LO/6VS6h8opf4e8B//7GM55903PacAzAKNisQsxbgon7S4Qtndx45d7LiOG177LV8dz3k7rBnvOi7ewOZlkFqkwOCzUvitY94YxkvN+Cyhnk+koFA6c3Wx50atuVoPrKwXNXpzkDxWeV7Y+xIdFFd65lofaxroi1jalI10qLLDZ+FMP76cCqyVIJhbFXEqQLZFcI1CHvIVoLl8PDMjc6nBTCGk2UcAvMfyNz4anJG0EZMLLVh45ZLVSEu3Xlkm5smJoovUDFS6rYh5FxRwK+So2OnarVrqkegUxoOebVWtjKUzlgpBK9mTIgvJimfJwpL0GQpVWXuRc10MhNwQyFroBKk1Ashc0PoxgxGOTS5CHG4XSE7R3AkV+s1uw4/XH/DU7eiU5+V0TswKTaEAl2Ftb2acCkxJLAjf93qfSBKBvwH8z+Xrvwb8Z+Xzfwj85W947H//piecy6k7pJabuCmo3yMfuTsA1nrCIKSr+7jis/0TXh62vL3eonel2FRKcEvWQOE/2DEyZyviBEeF9xrtEq4JfP/slsZE/sLlV3X49GvtS87UxIMeudAzYzb8JFzwosxkIpo38QyfB67jhofUSRFexPNi8VZMWXNIiyegdOHWOrHLEZ8tnfb4aKsHysaMpKwZk+N3x4+5LxFLBDAS3+vkPjxvd6zNzDE61m2Zq5A5BhH0C2eaaXLEDGrWpIxMppWQwATNW6KBAbeXIh0Fdlp6uhTruIyL4sq78PvFTEhSIT3lovMbyTOSfhXoi+C1ymO+UBRiJnpzMgDKQtJa+PYSJSgRqzgJryyx04TOENYnmnFbtJeN1pWUppJoCfiNYjw2vB3Xcti5O56c7fnt4/dE+BDFUHS33sxbPnDSTf2g27/H0pfrF26SnPMDILBsudbAT8vnN8Dzb3jsnUsp9RvAbwBcfdSyNUeRtsyOQ2q5MAc65evAEOAhrIhobsaet3cbuHO01xo3iFWzioLPQsuNCyvLvFEcnyn89yZ+9ZPXrK3Yx/3l88/4p6tn/HOrr9mljrd+KxtUaz7zT0nuLU4F7uKa6K55YR74yMowaqs9D6ljzI4zRrb6SKc9L0iMWXSKt+nIp/bkyt0pQSw/pE5EDVRglzo67dlqgXQPqZUNlOeKcHZKUKubYn9mdSTFpkrrjNHW6TzIMDLqTDa5DOsyZlbEDnJYvBSpp3ayIqSXi02e8VnSMyW8fDtmcfVdiFUs0eQkp7SQw7IpRbnVqDkIOc3JRD81Am3xxUTIzImojLSY9UlsYmk3h5Vw5GOrae5DHUzqOWHvj/J6jhPaGtTs0S8uIItOwfHe8dX6jFdPz3Eq0GnPU7uTOVzhmixXKu3+P2vs1h5YAffApnz98x5758o5/ybwmwC/9Oe3GeCQWg6pFRZZakmqiGXnllf+nNfThnm44Ovrc/LrjvZW07/OtPcRcxTuR1p35NYwXbYcPrRMl4r5MqNdwkfDq3nDsXH8pL3iq+M5L4oI9692r9nqI8/MgV5PvDATMcPL4NmqzJvsKpHn4Fsu9IDPlq0e2aWOtZIe/JgdDRIxrlNLpyK71HCXAm/iliG1RLRsjjxiCg1gq0feBNjqkbvY0ylfoqugVR8zNjWipm9UZh9aUhaL7xA1IRhUk6RuCLLooi612MJAVGXarsGOZa6S8omfH4oel5KPySnsUSSElkUtaU9Jn3RBSlehb6nts1bowWMAc5SvHe8yIJO1pYOlmbfCllwMgtzOY8covJ5iUaFyJm5aaT70QpazD3LINDtPd6Ppv7Ts1JZ/fPEr/MuXlg/cA1OZofhHog/i857qPX7f659lk/wW8K8Bfx/4i8A/+YbHvvFKaHyBc3TKY3SiU77OThaR7DHKwC1MBjcq7EGg43pKmMMkRB1niCvLfGYq1yNceV5cPfDDy5diWmkCn3Q34grbvhUhidTgiyTqy3BOg7hsvQlb3iTRm93qI2s184m9Y8wGoxKdityhOOSmplk7Vrz05/RqqsX/M3eDzwOd8twl2QRjOp1sh5KyGZW4MAOaRKcXizzN1BQVy6yYTajR6Fm753pa01mxhN70IwfVEowlasmNVVCYwio0E9VSIRvwa0l5YlLkcIKg2DGTjHTB9JzLBL5YOSxGQ8UoKGtFKnMPTZKIHoU4pmIkKzm5qy2FVphjoMknLS89BpobqWd0ECLWglTWK1tNUFXKNLezACAPIzol1OGIWq9Q2x576WT36yyCIWQ5cGiKeLpmyoL8PSbhxC/CEu97/bNskr8L/AOl1F8Ffgj8n0iq9bOPfeOlSfRqwitDlx0kwXNpUkl5em5Dz9244nZYYW4c3RtxoOrfBJrbEb07Qs6kCxGLSA58Lx0t2wecTsSs2IW2WjqA8Og/creyOPXAhU58bO+4Mh6f5XWsVcApEac4JMfLeM6nVtDAvYpSbKuJWFJQrRIPUVKphshD6hiSlSiUm/o3L5tgraWABCn2D6llq481coGwNxfCkMjCDoX/v6az0iZeNzOHucG5SAzlZFSQzdKSorZwVUHbukMmOYkeZpEWSiciFkC2wJgrTx6odGYVMiiZweSipyUifUXpfvJoLXWGzlZa8MXCInRGQJVGxP7mM1tqi0BstHBfCjzGWFXbzXEl4FRKRDJRNqa529P1jtiwCvIAACAASURBVP7KEDvHj58+5aw51vu8dFCH0hjy2VQ4yp9JJMk5/7Xy8XOl1L+FRI7/IuccgZ/32DdeEc0urTikhl1aMSXHWk9cmAMmJwYtHng+aabRYY4Kt8s0e+lsqClKIdh3hG3LdOGYNwq/zcR1YttPtDawMRMHLYzHXhdgm55oVGTOhofUcZemAneRTfTKn3NdWruLiv0htcSCH/OIEMWsNIbMITf4ZPnaX7LWM6astJlBZj1ZouUTI9B+j5EWsRl4GS64iyKDswA894VfI0aoImJwCE1VHVywXEplrE44E6GRr4espMMVBUioIuhQVGAoDEdVYO6PGnOPhRsqQPGYiK0iqyI5pAv8pGiHqSBdMD2L05cJRTDDaPAB5SwUzr4yYk+XtyXCLCIVRnrMKp9EJWxCGIrZkcwjenHMZO2kVX0v4n5qnNGjp31oGXeG4yQkt4UHv2yWt2Fb65K3fstD6P7s1VJyzl8B/+MveuxPupYTc1HoO6SWGC64iz1fTE/448MTru82hOuO7RtFd5do7wJmmFFzAaedmgnyZZZUIwTDFGwVvpuSZZc6EbqLGzolad1aTzwxB8bsWKtAryLfa65Lp2ukQd7km7DhjdlyHTe8iSsOqaVTnkZ5npkdQ2p5anf8qnvDmG0t1sckrWIPHHLDkNsaLZeUsqaXQKeCnHSJd1rErQkcU4PNsVIHYrE0S1mRsyJGTQpK1O2CKsxGVe+LjqfJuF6OsPzovkUp0s1c2JleIoYZZWaywEvk8aUZUGD4nUF5J+nVeS+9aKuF+KaU8HryyRUrW409eGkfWyWpmhXhu7Cy8qOuyMwuDYSCI6sIdy0dL2FSJtp7zeFNx+/2z7lqBp41O87NgaaYP3XaFwldOVz+fyApJGmGQfPMPhT4+TWdFuahiM1lgjfYB017n1m9nrG7CX0/gDHktsFfrpgvHMcnmvGJwj/xmI3n+1e3nDVjIUeJuc8zu2OrRz5x11zoI9dxzU3ciL1YNowl/H7tL7lpXkn9YHyNDL0WirEhk5Ao0pY5z5gFnPkynnEXe+Zs8FYixkPsWOtZai7laxdrq0epx8rzL6BJED/ycwu72NHrmYNpacr8aEqWznhaE3DlRI46EZNisg1JRXIWydaURahCKLilsC6aW0vBXt+TVDZSlBRnSa9EnVF85xfW4yKtikIo0BmBuuuy4Bex7Vysua30KxeadGx17WRljeCz7ELAkvbxSQ2S03OUqb3TokechyN619DeOPxa43aa8SgNj0t74NebV3Qq8JBW3IY1Pmvu/IqNmbhqToa0v+j6lrBbixSMdCkWCMpd7PnJ/IQ/2H/Al7sLeBAy1eptwN5P6MNYXnXpvxcXqEotTUJWGnxDzoovzQVA9bVYWs4R6TItvI/l0uQCi4/y+lRkq0ecCjzRR87NCS5zyA0uRwyZOZvavp2zYZdWNDEWQYsslNPq1lUkcLKr03n52UivJ3omjErMpalwZfdVab3Tnt7MvJzO6O3MGJ20gIGYNHEyEkVmjZ5EelUX7JYqFnPLnAROKVZd8DmTCiBSUiz5mBpNTqoKiINsuNApYKmFBFaki/lRakobuUBe0GKgavdz8aAPuP2psFcx49cyJ4ndKbUDcDuRMBJYvwFrJEpZwZXpMdDsEv1Lw8N6xe998IJwZvhh+1PQI0/MvqIczuzIh809H7nb916v3xp2a0wOtLSBX/lz7sya+7ji9XzG14czbnc9dq8FfnLvhdrpA0yznLlWWG/V4wNAZbLX+KRJvuHtuCGWWsNq+SanAutWctZd6vhpOBNzoNQxqkDMuqZMY3Z8Nj/lH97+Ohdm4P8+fB+jMjdhw5XdY6yISC8CzQBnZmRILS/DOVBUzt19jSJjbmmybL61nvE5ch/70voWHbFzM1QhtojG6UAPOB0Yw6kz09uZ3dxWjJeYG0JOmeTEKjo1BWV7lO6WHWABwC6TeO3BrxTGSHSZNxp3eMRqbAvGKy2yQyL7s3g1LvKqiwuxnQLKiPAcSDSKnRW4vWoIG4MdDIfnrpiuJqmffMIeCtU4JOYLaXpkKzgywX4Zeg1qTriHA0xCsutSYrM6J/SGP3r+lLWbeLk9p3GCfOj1hFGZKVnG5HgTtu+9Xr+dTaKycI5ZFoa0627Cmp8eL7g7rJgHx+qgWN1EGSYNIzkEVNdC2wiQ8cIxldZvWGfUShZqiIZDkASmd56QhI9ybo88szvhPGf5/UNu60ZaFunLcEFE8cLeo5vEcN7ya80r3nRnPDMP7/wtKWvmbBhLS1sGo0OJUoEhyeBUEg5d65O70LNLXa1JXI6sS2PhzIwVVr/VR1LW3Kceyn06xqbyV1bWk7JCqYzSmRwe1SEzRVS7dLA0BdNWIkgskJOmWGpHOdXttLhfLW/YwlUp0Pn46L9CRi81zWKBXSSZUivAx1S+NmOkuZswozgIm0VAENE8jq2pmsSpscXFWOH2qZgKSbq4iPJhzTt1qdsF2hvN/q7hj/qn/M72e3U4fRPFqffcHrmye1640+D3F13fju6WCqz1xAdmR6OEyHQb1nw+XPHmuGG4X6F2FjOKhq34a2hU0whnvTgo5UUuyMqJuFpP5Kz4cPsgWB07Y3Xkw+6BjZlqMdwpz1hsShd4e1d8E5aZxV3quYkbIoqbsGbMFqdCbTg4FeiUZ6tnDrnhub3niR44aIHb3MW+TNMNRNiaY134ILMQpyKfuGt2ZlU3lFFZsGzJ8dZvSVbTal/ciRMhaUKxIVjQwjErJm/JkwFduldGsFqiiJKJs7hv6SC+jgsqePGdX9QudYSoFzZisVwo6vSgBX5PaS1nQAt6ONuCAPC6QuZ1KDAWpWpUWq60soS1rRB8MxYRwIIMMNOj6LL3VR5WZYHgZyd1qTxZQvlIcz3Srw2HV5bDRcshtPU9TWje+i1tmcg/fi9+0fWtbJKM4iF2bPWxeuDd+p7rcc3tsEINRpTXR/EzZJrBe7BWivYFzmAftTLL0ZazYgqWORnGaNm4iWOUIV7HibLpCmHqLq4Zs+Mhd9WwcgEuOhXoyAWZPBcqsXStdrmrZKrrsOEmbnjIbYWaaJUqzmuZiTQqMi4DyLgqc5iW+7iq7rNOBzoViIUSvFhzA4Sk3wFVajJGJ0jiYPxYKFvkfajzkoVrUlPTUnwv9YiOp7kJnmrZsPyszEXkv1Xhwi8ayovAQ60Pi9UDUA+ypf5BSVomMJlcX4+OIuDA4pnCI7LX8t4uz+U0+ATOQijwpOQxk6e9djT3lvG+4Yvhko/aO3STuIuCnvbZyH1Wf+KU4p3rW5UUetzRmZLl6B0+GtGcKsY42Wq5GatODDQ7R3biK7IIOWcL2Wa0lh6hUpmV9XTGF0US+T0Lr36XVvIxdmCki6RVrsX1mFyd5XTKlza1PDbnE2bKEUsrWDRq12qm075uiqWYX66IKmmXqULOC5gTwKmWVkv6VFdkvT8C1gPwyRCSZiomNrGIj5ebW4Z3pWBPkJ2kVKgl3SqfR1UlRZOF0EqkSFYm6jlI6zZbJY7BRZlFlfRr0e9aLOZUWhopQp6SM6nIRpUmC6lM6FX53aU7lpeNszQVlg2fKJtAIgsemcUUgKsySlDCSsl8JkuNpaIcllPh9SxrbREZ+c47XTUIFONCH/kpl9yHFbdzz8PYEqMWCLgSvnZYG+ymQxkjvfec0fsZhywA3zvsQWFGmRXMcxEfcwJsXCbtmlznMctwcLlZ26IhK8oa0k26jhuBj9Dy+fiEP2o+4KfzJclJy3dpBY/Z0eupSP57PrFiS/aZf8oht+xS6fognS5pGUtNkTC1fjlB8GV+MhRhiYU+4AvaeFf86RcksC9RxOgEOqOsWGHH9uRklRqZYINEF1VAjksEMFMu3SThx8eC39KAKtKmAlI8qdnL1NIVVK8MLrOhQGFStbuu9tidKbB6W81bp0tbLeVUFPiJyhk1RfTkCRerat0tAnu2qD+KEAVGFRyOoqp1piz24ImqIdApz9aNNbpLjbJ57/X6rWySY7Z8Pj/DZ8tX/oK304b7acU4OsJkMXsRO7NDxh6i6GjFKJG/NcStI6wt87moAE6X4M8TZ92MtZGtmyoUZekETclWe7G72BNLjnpuB4bUVODiEmVMgZF0SkToDKlO4KckfPW72NPribvYM+aGn4QzruOmpFVF7SPrGjX8KXCySx1bPRbhNJmdyOv14r2RGna+41gEMX46XMhgNFq0yhy9Y/IWZyNTFKszKoswgz11/rKB2BWvkLKBoleYRmHmZUj4bjqWtSy8Ss99x25OocySXuXKPFxAlLHVxEYR2xP6dpnRAHWTNXdB0rhlI2lFbAzKGdLKEouP5FLcq5AwxY/+1MYuUUsLHkzFhPEZM2jujh1fHi9pSzR/7bdszMS2AB/f9/rWLKqdCqL1G8Wg/u3Q4/dNTbW0p0KozehQViyPlY9iaJPkzfGrRlqD2xLWkyCJOxNY24md71gZj1eGvW9py1R7rSeMk9exKLbomHli9tylnjdhi/fCSf98vOIH3ddszFghD1NyknqlVqi6JT9Y4P7LRN8UaIr8vSWSJKlBFlNMoCqy3IQ1+9hy53vufUdnBF7TW/m9WmXZEOXy4dGbnSDHAsmtbXFq4aEDxY1LlaaIbAp7PIEgk5PC3mdZsDoUw58SicwoCidLcS6wEVU86MU2jwzNfSzvY6mnivlRbopvZK+ZLoy0f8v3qSBFOoCaQ6mbcnEoE+X75KQmrW7IKS5sM9QwojpLs0+4g2UYWl6NW365f8vGjHysQ1F67KpB1Hut1/f+zj/FK2ZdO0APoePgW3njl1FwuRYegppErKzyGQCKv5/fKuYzCBeBT85uuZ16PlrJol+ZGaMyrfYnk1Lt62DpPq5kiJdlAe5jx13qeSh8+15PdNpzZsdHk3H5KHMMzaEAGafkCh6tLTz3uaAKEiOuunIBlQEpcJRHFnhFWE2rfCrWs+YhrBiK/URMuiqia51obKybb1o7tEmkKK3mpICoyE0mTaDMwofPkOQwUqEwFjl1u7IpNYLK1YRnOXiT0zKPUqL8qOIJiwVUGVSxocuC+SrOYID4LZaiXySHqD7vqugMS6RyBdgIupievuPiGzM5pnIGnHgu9XDI5cBAaswF2Dglx31Yffctqqds+el0wX1c8aPdcz6/vmQeGmEdzqrUGDL4knw4kdvFiGbRkTXyJoWMHRT21vKjNx+I4EM0XK0Gnnc7zuyRjZ34sLAeu+JpkrKi1zNTcu8U7J3yHFRbxRyG0PJ23vCPHn6dr8dztm6s/n3AOyJnnfJofcp7Bbclffpd7GpHRavEFB1JaT6bRbVjSE1l0qXCeASYo2FHy35uf4bGq8n5ZIQak5Y5ScFyoTMqKEHhUpDBSTjty9wkIDWIL1FmWby5wOoJJTVCVZMjPSeMT3UxikSRrnZ0qFN3y04CLdHzCWJixiDvoYb8sIAlS5u/aAZXx99lhlL8VRbTIfLyN0l2kRsrkcdZ9BywQ8LtYXrb8sX2gt7O/FJ/wzE2rIot+l1RqHmf61vZJGNy/Gj3nEYHvt5tmQ4Namexg8hz2pIK6HKjBIG6dLP06aQyMg1ODcRV5slmwCfNR5t71nZmZea6AZbW6dIf7/XELq0YUkOrPfvYce3XvAznpV0oDLatGfm4u+PPr77kTXdGWyLRK3/6XMTOLH+kP5BGQIHbOBUqv2RBpIplWVOGmbnqc6WsuQ09h1KY70LLEBpRbc9eeO2l5Tv4RibsILAXLR2bYxPIWaEambmkZumv5jp/0F4aZyqU4r3WIrm6Wj32t1m48AKRLw9GsexeooOZ4jufL14v8quloFbF/8SfNVV/eN5o7DGjsnTV9CgbRt5beZ9ja1BZ4CdxMUHVCnOMsllDqptGzZ6MmCQ19xn3oNnf9XzVnTNGhy2H1M53TOH9l/63skmG0PD57SVKZXbXa8yNw+2FVOX2GTNLx6W9T9iDR48zqW9ESXBrCa2w2uaNJjWnVuf1XrSpvsiXbNuJJ92Bp82hwqS3+ohRma/8BZNyNeUR8JuQcmLWRTEy16Hnh80dcxHBXjgJphhWAhU+MqSG+9BjXOZZsY5YWsBD4cAvnvT72NGbqXbKQITAn7o9t76vEUKQvpopSPRzpkDoVeboLZt+Lv7kmcYG5iCFvbGRpEvh7BJpkyFoRpfJTUaPGtKJE28HgZQs7EUS2FEeUzETOlkqZsq4wZwcroozVei16AtjSP1pNrKYkcZOoC32KLpbyYlvvZ4jYeOwdxNYTbK6GKxK9EpW0dyKbYYrRXs469DTotAiMH6lFcoaiBEzzPRvXDFgavhKXXC3XaFUZt3OgnNL7yLI/6TrWxomgvdGEAVRVQhF85CxR3GxNVOqRR9aThYJ6fmRLfMyWc6kPnK5PuJM5Hm/42lBeSYUhsRtWHPLImYdubJ7Dqmlb2bJ9RdGYSniX/lz/nB8zlO34w+GF/wr238qEJGSPn3gHqoGbURXL3qnIrvYMWZLpwLn5lCjycLd79RMqwJbPfLMPvCVv2RjEp+NT6WA9x1fH89qJ+tJd2DTTLIRdODgW0KByi+bJ0PlvVsTsdYQeil+XReIsQAgo4U2kmfR5c16oe9mVFRkkyU1spDiUjMU2EkGO4qb8eLOJVCV8jMNRQ5oof8uvoyITYPKhM6gssiwRqdwB4PfGFTo6uAwrnQxC8rVZ1JFJMWzmrC22JylBVwGpipL4Y6z6P2EPXZobzCTwidFKtpry+EzTt9xmdNFhTBnQayaUU6vxUJguR7VukVgIIudcyMI1LASbaliGyIyMklzPa4JSXPZHDmzR1od+F5zQ6dEnPtN2Aqy1/jyecQnyxAbErqe+tvSzfqovUMX5PKYha/+KpzTqVAxW1Ny9HrmJqzZmpFzc6RTMxdmYCx8+aXA3qUVt6HHaUmLFvyaVplWBWYTOGvGWqyHpPGl0OyMJ6GwSoamm2aq2DMFDLOjsZE5JEiKnCFFXQYmsgnUMnBUGeaiHzwVwGOz8NMLF14BWTpeADqIjXUqUQSoer8CXxFRChUyyuVTTRPKwTcXRG9oaFLGDB5yR3M9kFZOmIhdU6RY82lQmRH2Y2lLU5iOutSo2SdM2wg6OIuDV7NzTIOCyYhsq840NhKixtrv+MQ9RI2/b1FR0b4xNPfQ3WSavaBAF5VzUQk0QIPfWPHgM+KlsXAkap6cFQ9DR2MjoxVe+yHEItMjyN3F0/vr+ZwxOy5KFNBktubIpR240AMHexJkWIrlhfM+Z0uXfeWhLJvDFUOZlBX3YSWCA6qpWKylo6YfJfydClzZPWOSgeTSBAhJE9Kmfr5PLYMvw8NomKKR550anE6MweJMLLbOhsZGATwa4eVqk7A2MtGQXKLpPFNpFQcnESEWglZuExlLdhkzFp78URVxOok6KslG0RNVdii0kgJSooTYK5RmixItLrV4v1tdWY2qFcGH3FjJFhazU1PYustBWQXsUiVvqVIHxVYyC3vWy0ztOKH3M921I3SN6B/QgcmkpMhJE8bveE0CCjWLH549SJrlhiR2AEZcl1RSmKLQsUCzFyGz2DUkA3EF83kirRJ67XmyGcQ1y81cNEeetvuK/n1arMMAPm5vuTCDUGNp+dS9YcyO2Vn6oul7bgaBz2fH63nLpkDgl5Rq4Xm88ufvsAkXnsqYHEbL5lyupaaZkuPcHhlSw3lWFaoPcB/EBKjRsaZXIRmaldQiMWl6N9f6pDWBs3ak0YEhNGzbSUShbUvOCqsTWidCNEQXmOaGUBTqCUvNociuFOZJEdcJFSTC6EdIYEm5cm0dy4IWuzZpsFD46wk9JVp/QhPL92lSzqhW9H/9ylbEcWwNdj9DSJiDryIStpM2cGoMcb3B98I5qY2CY0APZdPMQSSmlCJ3VgCVSuouFRTZJfzRwaxR/jsOcBSYZ8EQlS+l81JyXVUgE/GkrvEY5OZ7RegVfpNJF552PXO2HnmxfhBXrOITvzEyzNNk7guXXKtUC/VOSXdq4X4s0cMUuufWjAVblTkvHPVdWlWI+7pw8U2xYDAkhtQWPr2mUQFNOv3uRwjEMTl6Oxe+vUgLjdnhXOnAhI5USFWXzZHrqSegaycLJG1tTGSOBl10tFLBcTkT6VwgZVg3HqMnxtYytp7WBYbZEYIheEMMunCuSjQZrLSMBZhC8jKvU0kRHejCUVm6YlIbyrGfLQSnMUuatDgIG4UZRfROx4SeDe5QinOjBC1sNbkxpNYKe7Hw7e2htNmngBkCYeNE7bExp2zDIW7LRIhRpvNTxMwW4xXKK3IPpklkm0iH73hNQlKoSfBWdlxCeOm3a1EMJCX0AnCcg0xkoxTzxjfl5pc8u7y5MoTLrMxpeOizwehUT3sQDd7FudWpyMeFpXZmRtbKY/SBnZLBYMyKt4VkBVRhumVz7JB++zJvWeqLmDVbM1ZVxr6Izi0LuNdz/b9UMFspa+5DzzE6DqFhjharI9eTtKSXafuSTT/GcFldbORKA8EXb5Nc8F1zNMzBcDg2UvBPlhTFkzEFUbokg1KZbBMELfKpCX5WSwDqEL8W2MshJvMUKk1YYCfyPsZW0iyJHBrfiz2EuAQXv/kK2S9RK4udtXTTjNSkRuFCPtU3MRVYC6R1h+rEBCi6omcchO+fZk0sOgBq/o53twA5pLT03+30CJ9TlMtFBieLckaRztReBJpjA6GHsE6YVaBppM36MAuadwgNIWueNnsuizPrmT6iSzT4yl8yZ0ujAjdxzTaK4PVd7LnQAxElJqfutgz4JDQfkswwhI+g2BaS1PJ1p0W+5srIhlpUWXwWIYplmHhILVMWPNebYp46Jce5GdAu0Ruxuj7Gk1jGITYcQgOWanm2Co7LdsAng9ORY3SMwVXzoDFYjE70zqPJTNbSN154KSvZODEpUhGUWBoAR9WQvMynoi6pigaQNFjlQuQq8Pr8qEu2mPpkIxslWl1TLjMncQsukaV50NVf3j4UHbVFo1gvLWmFXtAWKVX34HfUJI0+cY5irMhhM6XiVvxo9uOSDF3Vd3ziDsgNySWKRHFbWphqKprCZRCEaW5dafuKgIDvFamV1u+mn7jqj1x1B16sdugiOH1uj5Ub7rPh9+JHDLGp0eXSDhWichM2RMTsZdHJ2hVVFBDu/Qt7T6NEldF7W+oL0XIiUSNTryd8thxSU4GOd7GvtgsgG2JMrlorv/VbjErcxxVDlNf71fGckDSNiXyyupVZTFY4JZtnjkLv3fm2DMoSYxQEdJuk4dAUYe2V9TQ6YELDFAXoOQZX0jSYk8bqxBw1WieBc5QoraIU73oWzrw9CGrXzFInntRTdFVEiY3MTHRJlSUtk0Jdz9J9ip0V8YcskJXUFbkhhQhDOGm1Z41M4tUCQ8tkVSaj5Vpg++qYUCmhjlP5vRl3cEznooIvab2khWr8rm+SUixqL61HO8jNjK2uaVdy0MxJkJ05o7ypmrRZQ2wyeZXYdlMpZDWvx40oHhZFka2buHIHvDZc2UMRyvZ1Ku6zraqKCxtwIUkJlH/gkBt2qeMhrfh6vmAf28pyNHbPfexFDb5Il3bK8317y1yizyJh9IYzzs2hwOQ1zsSqng+CBHhq93gjMkIbMzElmZM8dTvug4hqH6PjabtnFzqsSgUi4+r/zUlmAXO0woc3Aatks/R2rs2AjZvYmQ6lMlO00o5XEhUmJ+orGEm3RJE+kybRGFbpNCyEAhUpcPXF0cpvDHZQhL5YyFmFWmma6hhc6qri4iucEZE1IqSaWSSrhA6slfCImtIla7QotOSC+wpJqBRzIneNFO5KFUlV0JNs+DxrsoP3T7a+rU1Sir5FqiMbRU4ZXQrBOkREThWRSy/At1g8/WxGNQLu27iJRkecjqyMx6rIx+0dbRGnXhiEi0KiWL/1tR0rkeR024QnojnkpnLhOzXTl4UL0JeNcmkPRVR7rMPGRUiiKSot13Ej85S45mevjTkpxrjCSFzU56dkWRkvyFXV0ehAowNzskzREkuKtS82AmO079BSQ9KAZWU9S0G2WDoIn0UixlxayiFpUhJlFPFwk1RLpIZKC3imUnhPGKoSAX6GNKV9qugJPQs0Rs+pCN5pgRQVC4aw0vVntRecWVWNnKLAWwCSK2tAl3lLqh1QHgEdsy5D6pAFOu8VeizCGPbdGdwvur61SCJguHyiamaqW1IqSuQFpyediiHIiTEG2rsVfqM5uoabbY/RiW0z8f3+lpWZ6c3MxoiUzJyFBbjgqXokFHdOAIydCjx3d+wKhRY4gRPLYn8bznju7iViOLGyWxQnFxpuRImoRFmk13GDIXEdN9VEJilNLBitx+JoU7JMyVbgpNWRne9EPT4b9lb0t7yWv+XcHmmKTrBWmavmIDZ3foUm19Tsbu5pdKC3EmmH4BiLAmTMmt1UCFyzkzlL1HhvTu8PlLSLCllZ2MOqFPQLclgV+vCS+7spFZ5Jrvz0XP7PTEl063pdoPIZ9xAK0DFV0CQZiRj53RWtUkbNBRnuI2avBCleUMcqCTclFbxXdNKVS01xPgsa5b/rhXsUk0tzBDfEIs6cqmnlchiqLP1xZRR+4zBTgs7i+2It0MhwKCbNwTf86OEDzpsjIRm+199x4Qa2xZ1VPEGKRI+KpCQft+ZIoyJP7B6jUuG4K3ZJ85C60v4dast4oKkDxkORQwWKO/CJFvrE7EXzuNjDLREsZVUikqsdrqUrJiQswY59rS/qxmm1Z4hthb8sQ8vl/+/8CqMyvvD6dYkKx+CYsDX9nEv6plUmRl2FJZyR4WOMMpX2c9HvKtFj0TUTbTPqhjFTabIsi9k/MiltFp4JpFmx6BFnmypV1xxLR8oWn/eVqbD7ZEVdJVuN2c+ygUJCK0V2BQBpNawc83kjKVsqSiql0FdTpHkQKua0N2RrSE0u9hTvv1y/tcJ96bObOWOGUOVtxIFVTpEU+mZs+wAAIABJREFUclEPPOXAZgjFQkxu+NVm4PvbW9ZWtH43ViLFh+6uTtSBqkayXK6oL4oInGhnxZJiCXxF1FAWvJXPhkNuhUJbBn9ORd4WWMviQ99pXyEsAENuKy03FfDkwmO5jyt6Pdfmgk/i9hXR/PR4USNFKBTdm1lUCFfGs/MdtuiVpqwxSlJNpwUt7MtJE7IR1RiVwM4MQeAvTkeOuCqTqpTAVWKQe08qESQpdCiErbGAT2dJYaS1WmysS4q0vE/Zyvcv03cVC6GrNTV7CH0ZCBYokjlGiVQxk1ojEPtUIElakxuJMCJUV1ItQK8LC7Q1aK1qNNJzQIdlNmOIbckUggyy3/f61mROl5Mpa1Wmq4lc0qxlumtG6Zubw4zpLHosAgsF54USvsVQZgVOJdoUmJLlay5q1DAkLtyhLty72BOzwmfLfRTPRlGyX3Mf+1rcA6X7tebcHOuJf2UP4jmiTgrl935FWzR+l2aAJjFmoeIu/JAxOW69FOG70FVbst3ccdkNsojJHILMMxoduZtXdMYXb/jIA5lQnu/MjfXzKVtCmaeMwfH2KDXQwUr0Gws8fAFCDpOT9AogK8JcPg9aVCAfwekXd1/gFF0KEkKHhIq6ijosQEURm1PVZ0TUFmP1WrSjqW3e5npg4alnJ5gUFRKUmlR5wW0p46RJkFL5B+5+ko1VkMrZatQkpkLR6eK5wjvVeuzevyj5dgCOy4stk3U9xdrFWqzB4LSBsltV6IOeE34t/BF0rv6BVkchWBmJKFd2T6d9qRkUu+lFrQ2WusGpyG3pGi1DvPNOzD+3wnOt+rdP7Q6fDa/8eYXYj8nV4n9BBQNcmMPJiyQ2DLGtnSrhinRoMsfoGELDMTgOc8PtuGIskJF5lo6Tc5HnZ7t3+O2xaG8tjwGFvy/3zepUB4xKZVpzqn98NGSdTqBIJQBIpVOFpciTZHIqrETFo9pxifjyBi6i18npog5/mpEsJ319X1Wh7yoIvcWf2Tr3gB4dT2Su6DQmLdAXXdmTi4gEyBxNRVGH1JNsPlJCDzPEhAoR2wtknmW2U9JFO37HI4m0gMvHkDGHqcgECSQhrIQn0ISTlqyeooTQwWOmlYTLoAtK1vAwr3iwE0M6zUKu7EF8KZKlNwvfXLMpdtFDang7bbi0Azd+zTE6VsZzbmWQ2CnPmyjDvmWD7GMrXBKdKx9kuQSmEvjUveUz/xSfLV/PF3w5XopPikoMwfH14YzeeW4OPbtDJyjbwaJcIs8a1YjyiTaZFDXDyrGynpg0D1PHWTsSoq6LvymErGNwrN3EEGRFTdHQO19rtpA0k7eMs8O5wDQ25AQ5apRR5MmgDyIoYabisDsXVMS8iNgVDNdC8w2wyANlJbwRXSynzUDZCEh7eCUCH6wsWYkjMFnR7KQO1YPUEnqYMY0t2l7Sr12UUsLK0NzNxM5gZxk066IHnFYW7SH1jQwWj57Q2+odiRIBcZL8Pe97fTvp1iPQHJrS/y6+G4X7XHnQhakGMkXNramqg3rQ3O76CkuZk+Tfc7L0duaDdkerJf160QhPpDdTyeFT5au/ms94O625HtfErFiZTeWC7NKqqqQsmk1ASb0KEakonYzJ4ZXUHot5DMC973g9bFFF5eR21/M2asFM3TRknbGjFhkgkBaszqQmkTMcJqkjHo7dqfDOihFL7zy72QqRqESWMcjX9/uOXRMxJbKEYKRAD5qUHCkosi8T8tGhJi1Dw6Pcz0UoQuyoc33fllS3OmLNibiSAXA2pqrFT08bfK+rgr3x+UTXTRnzKonIxCTFNilLS3jb1kaN31rcgwh/2N2MPciGUKUVjNbElZUBpNGQQ5FCDagkAntJSw2lfbHIWxDk73l9a4W7Xkg09caXtp0tnhWK4slXDFuWfHgM2CmjZ+mDt03gg/WeRgd+eX0NUFONp27HrV8zIQXxkJq6MY5Jps9jtJyVYCDzBHGZeuXPuI8rxuTYx5aP29tK2NJkej1XdXigAiOX4v8n/glDarj2a94cNxzmhpgUc7DMg5PZ2yCc/mRLzo+IM8RYOOCTaJANbYsCMTSyiXu62qEdvRWwqxKLN1xgDkYOjlx8S5L42KeoJIUaDZgsSpl+gX8IvskeVY30Ki01yWNiDxV2ksrhFZsiT2oFwZ1Loa7njNViM2f8knKVrqVRhLWp4EjtNTqmKi8k1OwCud+6ggETGq/bi4aXHTyEJDWRT6hFg1hblNVoVVRcHvH2tZfo+P/BnuRbhKWUyx0C+n4g962ESahvAlDlZPRcCrdJFnK2EPvEL13e8un6ungKRt7MW0IWktKUhLV3CC270HGMUuB/tT/nZi8RaDo0uJUneENOiq6f6RpP+kDxl7Zf4FTke80Nb8OWl9N5qS0SGzMRO1UhJQvTcJnJDKnh9XzG/3PzMV989QR15wqvXLHalZN6BnuQFEUl8OsyL1pTYedkSFPHrmmxO01QMDcSbVNXwIiPBCJwCebSNTpoopZWuUDFZW5hBk1ciyeiiqrMMoqUUzGlXdAQKp8IWe6QRA61iM8lC829l8FdqT/8mUNlmbibMTFvDbFRGB/LRpQNZ48irO3XBrcP0tGMMknX6XQoFp1x8SaxxUr7ZhA6971AgVJbNIU3DjtKXZiVQh1GzKbB7mdWF5Z7XUh6hu9+d2uZzqYWQmewfStDodsBte2wi7K40dAI8nMxk2mWtt8M9sFwfezp7czKeF6096zMXA05Wx344nglul7HDfclXTkMLf7oUCaRR8OcVF1Y3iZSUnx5uGBrR0HUOsNlgbXchHWdT8BJ4GGpeYbY8pl/ym/d/xJDaHh5t0W/dbgHXbtCbkedL+jFW0WVEy5mfCkqYyuPT5fUjlE2BWKRQAW5kYpTSz1ZcxLDLqdlRCbmqtQPZlSQBKq+QISSo0qEipp7+Qc1LU5WYXwq8CcJKdlK9MeVibmSzWNGYSE2D1pqkTFjssDklU+k1jBvDVnDfCY2HGrRE1P2ZOqD1K1iay3o4NRJTZNXTUnHFSSN3XtxQhsmaBxq9iJS0dlihirDRH3UUpu85/ULN4lS6hz4HxC3lgPwN4C/hRiI/i855/+qfN/f/tnHvunS8ZTvZqNInUO1jthJsSY5rcLGiJnEsFIfRYomK4UdE+4g0kN3BxmkbZqJp82em3mNVolXgxTc91OHj5rJF0StyvhdI/n3ZHE7TbIiS6Q9hI0ltpnPk+K8OXLuRj7t3gpEXnnOzcB97EvqltnFjpQVLyfhpDyEll/uNzzMHYNviMEIcjaW03kUp1szyxsvHxdVklTTz8XARgcposNKYY+i6bsUzYuG1vL1cm/J5RA5lPRtelcfayFN6Um+P9ki30RRTymqjnbMxLb8TJDX5FdapFJT4Z8bLUO/kkbpKRYBBs180RB6zXSusCsl8kVbU/WHF6GIZSK/RJnkFPOZwY6Jea3r/EzFjDtm9NwKZGUunoxh6ZCVmcqqZCTrFWEjUqxmSpijkfe6pJTve71PJPn3gf865/y/KaX+FvDvASbn/FeUUn9HKfVrwF/42cdyzj/+xmfMYIdca4+0suhjQE+B2Lua90qXq2U+M5hC3Hd7U4tBgHFo2LvAfpIa481+Lfl7aaHOuwaCxhwEipBtZnWrsceSN4dHHZsIZpa8djBr/q/wCWfbIz5rLtyRSzcwJkcoqFkQUOExNhyjI2TNm+OGkAyfXV8Joem6Zf1aVZEL4zPtnfiWLxI5sVHoUlwmIxtnmVqrDKGTRdzsTqC/VAx3qn5vi+hqrdQ7cHI9g9+oOiNYXK+yodyDgr/SEk3cIDWE/Dx1c4dVabgESXWTEmGOhTqLWlTjYd6ewKixEWsGO+TKczdjsVEocxUzlWhQ3nc7JvJO/N3tXpVaVf4eO0T0JAemrBXHdNWIDnEAd9DYB4HNo4IgjwdPoxTu3pJaYSo2D3+Kc5Kc83/36MtnwH8A/Dfl6/8Vcdz9lziZii6PffMmKelWtlL0qc5gkTzSb2yxVJCbbgrEWXs5ufQUcUMiGUPzAOPecRc3UIhG+9drVBfhwaFnRf9W0qjmXmAUsdU0u4wdk0yOp1zlbgD8WoB3odMMW8dDhh83z/gXn3zFre/ZmIljdohWeZngPuKtS5u34XjXQVK0txq3z7hBfpc9iqxOMsLjj2iaSfgdbicnY2w1qVWotID+BHu0CGVknavRpy2vO3QKNyTmjSn5fPFlDxkdT4LWi25vcsW73cpilfmmwOHjmapzheUfquTyJerpmAmNFvNSJamQcD8S7pCquFxqJPq74/I6xTA0azg+1XWjZq1wO485emnrTg2kjHaG+Vw8EZNTqEtLeyc1iD1G9NHT3MprULEQx2ImbCx57Qgrg200yRRwo1k6p79o5Z+u965JlFJ/BbgEPkN82wFugL8ErH/OYz/7878B/AZAs76ku8uEFuwgnORkZGLr9qFOZ0Mn0IRl8LPwE0BO5O4a/FeWsBaow/R1y2qvyNrhDhKt2rtENrB6K6e33xjsMVUiUGo07bWvgEqyxY6K/pUCLPOl4Y2Gz9uRD/sHpmS5nXtedA8cike8U4kLJxFnCA1vjmvUaFBe4A/NLrG6Lh7ls/y9ze0B/6THDQF9DCTXie3ZSuPXsqjDSiKG36jKBJzOFd1dlkO3iFXbQ6DJglDoXmbRTI5ZBnwh4c8aWaxmwVQVIlKWhS/oamjGXIrxLJD4oupYkb2PHLOC1YLuDdK1CistEUAr/EZj5kxolWxiJdGvvQsyAMwSMe146sP6jWb/8QodVsQGkSU6yMZq9gIz6a6DrBdECXJp4sSuk27XGOvAkphRZLq3XgaMY+Dix47DC03slm7i+13vtUmUUlfAfwv8u8B/CiwakRuk+bf/OY+9c+WcfxP4TYDVi09yMoiO72DEUfWgaG88h49aVm+8cEZWGjcEQqeFc1KgCnYvN6q7SehoRVDtKNFBFW68LovEDIH7X12x+9hix8zDp5rjr85sLo8cHjrUrYFkWH+p2Xwlm9AdEpuvAs3ekCw83K7YP2m5NmuetAfG6Cpi92buGaNjjlZQu0WsoX1r0DP0LzOrt4HVTx5IfYN5eUv2HqU1pm9IiwWaVuw/siQDdz/MxD5x8dEDfTvz73z4+zx393wxPeEPD8+4n1Z8eSc1UPydM7R3tDdw+eNZ2JwxYa+P6Gzx521BWIN7mNEhMT1ppbCeIoePO5p95PDcsroOjJemqjqGleyO0Kka/XUshKu5mPykUg+oInY3J5p7aK9H4lokgtrbXHkgOiamC0dsFOOVRNlmn7CjRMjz37/HX66wu0mKcmcwX9+QzzeocSZ8cCYqkEahncY8TNhBUnW9G0nrjtQLSc9vLN2rI7m1mOsdzf6cvdX4bT7B/f80NolSqgH+HvCf55w/V0r9FpJO/RPgLwI/Ar78OY9983NGEaCLwynHDitN+LhlXitUkgVtpgQxs3or41F7N5Jaix0C87llvJKXrwM0u0hzOwkm6O2OdLZi/+mG3T/f8PCDwEe/8pbeef6Nq8/5sLnn3Bz4/eNH/B9vf5mjd7zaXhJbhz1C/wraO5n+mihaVK9uzuAKfmXzll/rX3Nl9/hs+e3DR4Rk+OPdOSnDbi/JuzIZWxRH/MbQrk/gSrXqyMdR4N1KMXzcERvF7Q8hrhIf/tobnvc7/vUnf8CQGv5w+IB9bPnJ8ZLXwxajk7Spk+buaURPmqw1D5Oj2cvpvp4i9vWDpCGTJ7cO/XAk9S12iEJYMopmHwmdxpX3IjpRO1mE61TKp3SrQM7dXrghapJFb+48sbOYoyd1TjgjzjBdOpKhdry0z7hDkhoswNnnoXTrEs39jL5qUceZ+OGGrDvs4Alrh35YwexhOKLHnnzeiOxpIVb5jcU0hnzeoX3i8HFLcx+ldiv1bnaW9tZjRotKsP/en65ayn+EpE9/Uyn1N4H/HvgPlVIfAf828K8iJdc/+pnHvvlSxSjGPupa7BMqZ8xUaog7T2ylQ9LczcwXDXqKZKPRgy+WAXLym0m8+WJvBWXanHP75zp2n8L88cwPPv2av/78t4kIOeqL+QmfjU/YWJFCDY0hfqi56QQQOH7ecfZHVuqIObN6ndmtVrwxiS/XF3x8eVs5JBfuyMp4HjYdIWmGsWV63XP5JbR34pXR3EtqoKYARhNeXGBuB1JnmZ607D8sqoYXHtWIUvrNuOb3hg85Rsc//n+pe5Mey7b0PO9Z3e7OOdFlRt68eZsqFkURlG0JogBbMmxDIKCB5wb8BwxNPPPEP8AeGBp4aoCGPfDMGhmGNbBH7gALkGGZFEWy2Fd7s4mMiNPtbnUefGvvyFvkBVNGCbd0gEJWnht5IuKcvfZa3/u93/P+4JcwJhGCxrnIcGxEgZ0M1XuzEjAXaHWyZbTgwRI7i0mp9FxkeM0eZ5SPxG2NPZfoB60Zr40c8YopcOlrLAIBSUSChWKSrcLXVkyEtSZVhrAxmCHiDjPVYxB1MmXm62qlQNb7yHwhwLjpUuqT5tEy7TSpesbplcGdMjq4Egx0iXscQWv8VcN4Y3GDNB51kD7M8toqJkEaFXdy1orptiG9alER/FbMjeHnedzKOf9XiOT7dI0r9T8Cfw/4BznnfXnu7/7sc9/00EF2kqzB9eLbqR5n/M5hh8R0KRIiWqRPd9JSzJckI/N4YvNjjd9V+AtT7nZC4nB7YTYJAEChToY/+NEn7Cextx+HhvxPLqkfM3OZfV7k1CbLrtG+lUI71gq/UQy3imoP/amiD9WacdHpuYzRRk5zzWGsGd+30hOZCxJ0YeFuamw/kZtawml8Tbaa/oVheCHndmxGu8RPfvQMguIH7jn6aPnyf47YcyiFqQUd8VuLO82EjYWU8Tv5KO2Q5AIvMWnmMBeomyJXThyyPpKdIWwsZpA7rspw/lR+7vmyyL5ZuvDVQd4LHeTopTdyDI21EYuKmLhLDqL8u7hxwseqtJDsjVoTtWwf10TdrB3Ne4/dT+wm+eyqx1ZaA1atC1JtK9SmAgXNQ8QOgdAUjJI1hK0hOkX7Tm5K2SjMEAiteMfCtkQ+RGje6n85hfuHj5zzA09q1jc+980v8FQQxkreDLN15UNJVKXZFosD1++kGeQvK9zR419dk61CzxEzaswQxcJQlA1/abBT5vKPMje/B8lWmOk5Zkp0U6L+J79DmiZ016GuL2EYSbdXxG1dzruUC00TGlF8UgVExcPY8v8ev+S2OjJqx211pFYB/Szzzx8/5XRVw/3ma6AEtZzb64rUOsYbR+U047XFbxTda5iu4PKfVoROaJbunElWRIb2h3vUXggsOQSIEbfpyA97rLMQI+3lRZE9FWnXiiGwdSKVbhyxKzbyYvdREaZLg7qyRCf1R6ye5OHkRHZe+i+uF4m8OqXyez3Jx6p8nsnpAs82Iusa+YygmCbHSCzmVYD5svj1YiZc1tjTB7HWBfyhUpIj1U68XDomzBglx700mOXopaWv0xiqx4npupbgIMO62FQGdxZnQ3P3C26VVzljxiWvL8nWrYTwZzTrL66j9A5sL3c7M0sUcdjKDrIQH1VI2JhIwWCOE7YRaNlivpM3+AN1CVBKkfoerRVYiz4OMtijFWFjxR4RoN7LrnJ+qTEHw3kStM+FtavZMSlxIi9BRHZQNI8BdwiYMQg3KpdGl5KbQuiELtI8pCILa6pTJhZpVhcOrvZZzuOVI1uDmj2ESHYWtelIh6Nk2wOMExiDCjU6e7n4LprSTBPlR89RxAKlMF4T6vLztGpdHH4rRstYgn5irVaOVqgVliLbWrG/r3THBMTSC+kDehawnJks85UU0/NOozrpsQzPdXEBCEdtMT6qkDBIe0CCmozUNhh8JznzdpAdw0yJ6nEWWISSSdbYCOVxaYRCOTbOGXsu7+vHo4C/LThduQvl0kAqW7TIjwVY0HvUFHFOY44j4arD7gfCdScd2W2hkveZWivMeZZC9e6e6iuD2m1JFx39dy7onxvmC0dspIH2Mn2BPgwyvzDNcncOEX23x+YL7ONIuGoYb2uygf6FwfbS+VbAF90DnZ75tHrkFJsygnuN0YngDXSZ00tLW2nMZAmdxAyoKLzbWCuqY2YuXIjxRrrSp88V/iJJXVa66NVB0f24w9wdUEMQZaxEdVM51KcvxB3d1tA1qHEucPGEev+IzZdkq2WxGJivK0IrfYPheRkEeyaS6HxVzvEGss5AadpmhSlep2QV9UH8YnbKazCoKIxxTaPyl47QatS1k89ro2j2qYz8gjkmujderO/7YicJsmuEXU1szSoWuJOIKHaU119g2kp+RBkdLsNf7r4n1W4F4MVyJFMx446e06uW+UJOMB/7+HZ2kpSxQ8RMCXuaSbVF+8h43ckv1krPxADzVU0zR9G+AT161MYybxXTtZKUq7GiAdz7A2mcUFVFvL3k9J2O9/+6YXwZsBczVe05fLXl2T9vaN48kpsKxhGsJbc1uXLETVW2e8N0KceH+Qou/zgRW80023VM90IP3PkdCTFRxqTJo5HeyDlRP3rcu57p1RZ38pi7I7mpSaZl3kmRPLxQjC8S+WrmV754w7PmzP3UcZprQtLcPeyI/6fDLMGe00SOhe1SVywon1xZqcUoO1bWknm/BCA5mcWYd2LImq4U4zO5OU2fRIiw/fJAf2642A6czg1hNsVKb4nF5pIta2BpqKHyUq/U72fxSRlF/frM+NmWzY8Hppsa22fMLE1ElTK+FWNlqgzHzyy7H4PpDPXdIMLMFDD9TNjV6DnKUJWX0KDlhoMCPQq9MWwrzBwYnze0UZIHpitH/X4mG0X9fiQ5g+ln7NgW0MTHX6/f3ox7CaVcj06TZbpS2EkXW7MQMNzRi5vTalQ/kq47Hr/n2P9qpvnywOHtBr+1tO8MN/YW8/wSfGS+rvGdZnoWaZ4NvLw68Nlmzz8zn3L67Ao93UpN4yxqmIibRibryvxKclK0kxXj80T3UzmzOxd5UR3Y6ZGXds9j7NjHjpA1D32L2VvsIMeS0BrUVUN/a7E7Q9OK+nZ+pXAnxXwN023EPht4dXPgN158n19rfsKfzC/Yh453847v1y84f/YZ9nErP1/lyG1NbGRXCsXlOl/XpEpjz3IWR0GjFXHjCI1huLWEFoYXSz2QyJ+MpMnw6vN77vZbvnv9wHlbPc2rqIpoNXHUqKgL5KF03jNYD/YcxW5SwpZsqSPkgnbrHPuiYtohoZKmfpRiHbZU+4B7GFDDTO5qYutItV1lXqk9QwlFrUv/RBd2cLHFIJEcyUl/JDlF7CyhM7iDkfeun9A+ExqI24+v3L8dF7CVCyhbcIeI9pnqcebih/Kmq5xLwq54etLVRqTdl1eQM+MzBc9HfuX5HW+6kTebS8aXjummxZ1auRheJmIb+eS79/zazRv2c8OcDNNsqSzyJqdM2tRoIFzVYsord/hQK/qX0g/gamZ40TBfZq5cwJB5Zk9c6YHvVW95HS7Rl4n344Y/utqSDm7t89jDiOvrD7xTithI0M30IvBX/upX7NzIv3X9Z3xe3XNlehrleVswQ0YlTp9rqsMOtLw/qZK571SVsBsqfLGkzzupM/xOcfxsS6oUfgPTTSZ1CbYesqLdjby8PNJ7x2fbPc/anr99/af87ulTPqkP/KF9wWu34zTUjKVmcD3UD7mkXQkyyPaSOKVSIjXVCqpTMVO9PZPcdvWSrZggDX5r6T+pGZ4p2jJx2H51JlVSVyofSF2NngUlla1QHpNTmCGTaoVOCUJG1QYzBuqHjH3ose/P9N+7xp78mtWYjSZddiIU1Rlz/vn2Sf6lPLJdzHMyW73MLq8Yf6Vw970UgKcRfchyzo4JM29Ik2E/N3TOc3V1ZtpYzm4j9U0X2F5K9Nur7Z4bd16hdYfnDd//Ow33f70SNcWBijv8TYQ6QopsrgdSUtxue+5PHZVJnL5jwSY21cxd2NLpiZg178KOfex4O+94f+6gkClV6VeEi4bQyq7ku4rQKPx1IteJ6mLi840Eni7z8cfU0OmJyxI+dGEH/vhv3fKjzxuyydizJWxSmQMROZ0kqBw57ANkchMFLtdElM407UxXe4xOzMHwcnekMZ5nzVlol3ZiypY+OE625jA1jN4y9hV6FHvNAoNYZj2WO71AsMUaEtuisNWKeFFL32SdP1FQ4qyzkiAm7aVLr6PAHpTVJUjWiip3Ua3fKzSG6apYbipd+j2JahbaTqoN/tmGVBuma1PsKgrtLclpXC82GXtSK4XyYx7fzk6iJYhHWdYJNLEyy4JZeLHoonpdtqJ8jKJ/+y3oujTBoqF2khWovCJvIjlovLcoJyT3F9WRSyPc3V/f/oB/dvk5rfH8/vETAH6wv2FTzbw/d4xDRe08+8OGR90y9hXddsJdTrgqcFUPaDJOBaFCFlxQROLZMBm/yfTPNdFZzKUlNCK5LjMSbq/JSjPbxG+/+xSAo6/51y6+4lP3yK09cm3PfObuOaca+2uJ73/2CSFr7voNz7szU7Sc5orTWDMOlZzxg4Yld6M4cpXKGJO43gyEpNcpzs7OOJXYOYmM8Nnwbt7xeffIHxxeFPojGJsIXUIHxeyLHB7kM6z2Hj1F7ClJXRkTeYL50pG1YnjZMF1oMWoCdTk1qCxGyO7NAooA9ziRWiGhzJ9sBQ80J/zOsP2jPeRMvT/RXl9ItmJlpG9kpV8mNiazevLqB/HqmTEWZU92k3mn8FcJt/9F30mWo4dR+J1l3mrMrNfZiuZdkDPsHDDDDNagzoMUoNYQm0y7mfnu7p4fnkRVOutEbhKmEcr8ppmZg2E/txxjw9t5t9JKHn3Hu1nzu29eonXmfNdxZzJqMJiz5v6ZhaDpoyKfLOfJoNtAGkX+9dlwYQRremXO/O74GbUO8mslaWK6PmO8NPemC0Osn+LTYgWpTmibmINlGCp+oOBu2HLTnHlW9zgd+UPzyQqfOxe4wzCzC0NUAAAgAElEQVQ7fG04zRXj7OhPNWk2soP1hlRLAE/OCWzG2ERVBwnzUYtrOeM+6KZJbou4qA+xoTGBIzVxieyLCj2pdVZlWYAL9xclknJyMoRV6KnYIWFLN5xCS0lOnMBZK+aNxvgnq749iwfLHmexuyfQsUKdelHzgLQVd3DYVrj9iBo81eBRMZKaitRYws4xXxhiZTCzpb4XKV4PgXqfZCrx5zxP8vN/5DLHkYUkb63CFXuE9glzEHoKIaL6kXyxKQqOIzeO2CVuNj3fbd/zohbczlebS35Xf0JbeRQweLn43rLlz9pnfNVfUBvZWb467tAKxjcblFe070VyrY4ylz2eKvwmE7uA2gSub05ctSMxab67vWdnRuZseIwbHmPHnd/x6Fum2aKCJlnwGyn0K6u/JjfKEBWYWTNvDMNQEfcVfe3leBPsSlpcoHKPc8vdaSNI0tHxo3BF8EKOTyeHHnQBNijMKNN+eZazt5806VJzrspRKxou3IjVUYAYJDoT6FPFMdTs7MSbYSfR2EljXWByhfiuizxcbOk6iPN46eBnrdBTEFWqETaBmfI6FyN5ivL5yySlmFJDrcsQl0YFTdhZYqVxR8905XDbTpzNZ72Cs3XJklcpiYKnNfo8oqJD+4g9mVUVM/2M3vek6y1xmcH/RV8ki8oBoq1no7AnsavrwaOmGXQli6KrCbsaUzshpfiIPWl+9NMb/vvjrzNPjjjLMUOfDQ/biNvOVHUgTJbDaPmt/IrTm62cp72ifi8X0oVwI+jepPJBZslj1BA3ibr1pKQwWu6yAFMy7EPLO3OBz2atJW6rE3UVmCpJcbJDGeKanhqDZOlsh43MPdg20LQzp0fZJc77lrGqhACTFMZKlJtS0B9rtEukoPG9lii3oHAHI+O8mdKYE+J+7JC0KpPRJtI6yVDRKjMnQ/INrXmC66Ws2BiJmatNwDSJYS44VSWFyDItmaz0GUxRsHQ0JCPql0V2GO3FZbxEMySrcAdP2Dmx12vJUVzu6H4j7oKs7ToWAIXSMkxk1aD6EftoZVEYJXYbH8jbtgDplDitDyNQlQlNGdBCazmZeLCDon37C16TwAdd3BIkGVsJmLRGo4uSYU6TzAIUMDJGlBN/Gbl+duLf/vTPqLXkovts+K37z7Baztlv+h39sQZvOO9bqrIwVIT6Qe6KzX1ivJbu73yhViDD9Dxin498efNAbQO39WmdPLywE52Z2elh/V1u7LmA6vLaBPSbpQ7RhE4ROvFBJQepK1b/2rNtJk5ty0U3Mg4VVe0Zh4o0GnxUYLOwk9/LXLeLT5YeM8jPa8YyymtlnDc7SHVGdYE8G4yRK/GyHrkpR7lLJ8zkiIacmJLFZ80YHWdfcZ4r+r4mRYU5Gkkl6wscokx0yk5RTgAFFSv4WYVvNLocq/xGZk3sWWoRM2WUT5jJ4Q6zOIhHAWbHgiydLyxq6/CdZn51RaoMtnNrCjMKSe6tBCcUdhUqliGr1pbUNCnazRDkZntZQ85or/F/HvD/jY9vrZnoTmITUSFhlejgKmb0YWBJNNL7M7mu0FqTa0NyhtgWaJnKtGbGZ0OrJzo182l3WCnrnfWcRmnwhaCZryzZJfTJEJunOYn5EkAzvMz4bSZXie3LE68uDlw3Pc+rMz5rHocLtk6iF7ZmXNOvYhaG8CnW9GOF7o1M2yX5PUMnEux8nTCDgL7r65EUNRfdyBe7R0I03HZn3j9uqWykP1vUaJ74V5OifSf9CSGRQOgy7gR+V6wku0zYJHIXUTazverpKs8wO242PZ9t9mzsxIUdV0gGGt77DU4lzqFmYyfuRglCNToRgyZ7TTWqFXe6hOkkJ8zmufCYQlcMhMnKjUcv8yeU2DdF1nVxSaSV/ZxqQ2zk+KSmSGiMpCw7IeMnp5ivip+uaopHTG6sZiq7RRDmsDtEXB+w+4nYujWCLjuNv27Qc6K987Svl97Kxz2+HXXLKDHBKXA+rncRYibXdv2aJW9C9RNKKbTx2IPCHG9WsMNzd+Lz6n5lYl3bM7f2QKM8f+NClKMpOf74y1s0mR+fr3j9PTlzv39suX5+5NTXfPZsz217Yo6Wv3n1IxIKnyT/8HW/4zTXDEGwpDfVGVOJwuWzXYHXde2ZNxG/K94zLx3q2MgQVTaa1CQumpm28nTO86oVw/R11RNearZu4ocucBxqpsmtybmPt24dZdMbjzaZY2/RTSRHhWsCl83MVTfgo+HL3QO1CfgkNciV7al1oNGeO79layb2sZWouZK5MidL74UbfBprctCok8X2CjPKjL07p9W4uYSEJqPRUaiNyYnlJllwgxxf3VlGDsyYpB4b5bgZOkNobbHBqCe28BSp9gWVkuVIvogeoTXSK6o17iBfI9FvMiYMEDuBiuhYRgTGjL9w62RrLqO8H/v4FjGnJTyy+HWSMyibIWoISYZ3quIdsGIMBEhVsT4HzX0xP22N8HxfT5dszcgbf8XODKSseW6PNM7z3B7ZmZF3ux2nW8kv/L/uv8cn7YGf9Ffc1GfmJNOFfaoEeF2qu2f1mZAkfu3CjWsd4rPlGJsSBCqR0KpKzFcys25GSjRzBptJBR6x5K3XjRzZKh2pdeCzbs+V63nV7jmHemX7tsZzV37XlBVftDLPMkS3xsMlFDs7sjUTh9DyrDpJNFzh8lwWHIoh89ydJO8kG4LVRDRH3/Awt/ikOY41w1BBIToux9QFEEGJC9dRbmzGB+lzJSE46ijmRN+WY2d6cnurmNf6I1ZiqlRJFgy6lvl344Sq4jPzTktdk1kJLSA7hCmA9VQJgmiZsaeMWRBZgd7uJFCIxamcf+HzSSgFmU/owYsjdcGd1hYqU/IqKnLtJJ+7LBIVozTrFNQm8KI6cGuPxKx4Vm14aeXOfGV6rkyPU4GNmpmLhGhIaPdApSL9VcVze+KvdG/XC/+r+Ypfbt7yEDbchw1305aDl5mRSkv8WqdnLs153UUWabmygakOeGtQBdGzqiguCYw6iwR70/ZYldbgU1fSuUDSr6YC497pkauSj6JVYlPyTo6pJWbN+7ilUoG5IFcbNXMft1wZIbtcmZ534QKtElNy9Mnxer7gwo68mS6EXp+FXt+HimF2kuRb6qE15kI/fW6r/V+L4TNZMRgqJXWmO0Wqg4gxYevK4BVr9vrCEPOdW98jPQNRPH0qJCooc/BPMlRsNcO1EYCFU5hRr2PEZsqEVuLiRDiQekmVJmXeuHXm30wUV/HHPb61PslCjE/Fg5Rd0cFLeGguRbqal203S5i4kW7pPFqRRu2OV+4Rny0PvuPRdfSp5pBa+lRxZXrOWvi/nZ7QJajHqUhdeL+9v8aowD62PPqWt+aCB98xpAqtEldVTyoUd581b/2OzkwSuRBa7ucNe99ILHTS0CSCySgvkdto0C4J4zfJWfs01+g6c1qI8yZLlLUWUWDBsUp+ozCJx+R4jBte2kdi1sInJq3BpUYlai3kyJNpVsj3lCxdqd+kEfp1n3jKipOveRxbJm+Zxop0Lmzg4h7IRlwSoZY7+VMMQ+n9FFZaaMWEGBqFLvMy2jsZQIsS3COZ7pHq9ERbBAgbu6achVb6Zsmop3n6URQ8FbPMj/SxKJLi40p1obw4ObolK6+lfJSktHLt/Ys+vrWdZJkbUL5ECvtUztxOfimQGsWZdfAmO42eg8weaEgoSZjKCqMSF3ak0xNXpufWHngsGYXPzIn3cVtiqDdc6HHtlI+5YmskELTWnpg1L9yBmDXTLMeZc6y4dHI0MiqzNVNBmdYSmqOyZDaaiDaRGC16kFRenRWpySid1zty4wLP2zON9fxy85b7sKUzE50WCbZSkR45zhklMXZOBVyhyH+4QO7CTjr+WdOXg/aSlrUsCK/Mmo71GDoORf59N24Zo+QvLtT6EAzGRqKyYESLFa5vCYEdcwkCfRq6+lp8X8zoSbCp7hhxvdhSVMxlCEoRa0WsLePNMigHbhAFbMFHuXNpEYyljtDi9xtvjFjzDbijKqPbCdUHzFR6NWXh6kL7ROt10EvPURbfvxIuYP20pFWM5NoRtk4Maa0QRPToy24iYAE9B9HDs6hbN1XPtTtzYUbJRk+WMVe8Ce2aWfjS7ZmzWYv5nZb4t3OWumPpdSyU+ENoaPQGn4003GJFpcOaYVjpwM6OHFNDyppTqBmi43EWWIxSYLpAqiMkJZmoVeJiO8hFGDWd85JjiOKNF+rJPnTcNkcAdmZYSfZX5lwWtGXOho2eVmWt0Z5P3J5YErSWx5K/siRqPXrJZQHwyXDyNbpEWvdejounuWaYHTEYUuneqyggN4Fn57V4XjJEgBLgk9FzFLtRZ7HnIHCGIUi67iSThLlMJ2Ynybl2dKvKZPtUcKasg17AaoxcPH5QfHFqKcDLQrMChACYLgVsYc+LFJdWIs2ysBcSzMc8vr3CPSxKwwehLD6tZ9BUG6GJpAQhSvxwmZswEwyHiv/77Rf8eHvFn3a3ALwdt9Q6cAhPjbIxOxrl6fTEC3vkUKLcGuXXu28fa3w2QmNMFccyv97pmUs7rEUugCaXHMZAn+s1Wm0hOuYkAZpKZTIKVXoUchQTyvsUDV/1F1xWI4fQEJHO90/9FY0KZWcUu/oxttyYE0ZlGuW5Ncc1vzGiaJRnzoZjkkW6hAf5LMBwNPisMSqvUdayQBw5K3zSOJ04z45pLHEMg0WXDv5iQxGSZMlQTHLx6UkKZBWy4ERL09TvyqDVTSXzQZUUy+rDFGWlMGPC9plQJkkXW4sMaWnslJl2mjZmULrMIYlZUpWAn6f1Wo5lZaG5YyzgkILRzXl1Iy/U+499fHs1Sak5gPLGlTtEIz6gbBWpE61bT4FUWbFNp7LVF+BxpQNXRbmZnGVnRoxKXNszhizBntqvzb9KRW7MiYrIc3fkhT0wlzzDJat9Z0bu/JZ3827tQG/MxLXtMUrCQl+WxN5l8fhkuHcdvp2ZJrkj5yTHrFyK9eXsnbOi0rE0J+U4lVA0Kqw0yGMUuLdREx6DI+IxHJNMQi7x2cckP8NSuMOSnfLkBkhZMydRw8bgOHpZ3I9DSz89nTtikKExCoxb5ScbjYpy1LKjNAOhOLiL6qRKtML693Ic01ouThVEWcLJ0SdrTdguUXSg4xPxZFGz1mOTL66F0nhefVeJNcZhYUiTZRdSsahviES8nFy0T0J8+TBO4i95fHtU+eL+VcnJDmFkp9Al+D62Fj0FGMUcRwVoTWwsycl4qQ+Gh6njx/YKozIPU8dbt1svkJg1dbVYL6woPlFqEY/hIWwwJO7j5omAYiZq7fmyfs+2kOK/dt7PRTKNLeckxxatMq0RyXgJFMoZctBrr2eaLSmKHyomzclXXJuBKdk1/PQubNmasewCcvE+sOFsa6bkiCicimv09phLFmJ29LHG6UCjxIclcXMVdUEVauRnDEnT2uJSqAwhapTK4qLWEgG33IDMqEqhzAqsk4wRESMkLk6Mm7FMjs47OQ777qlha+ZceMsF02qEIClMLnnd5IpU7ApCtdjoQyvPpyRF/PJvJM5BFz+YKlGBGXcWisqivi3jxLE2mFGoMdFB/kVXt+SHF85tKsRFlbIMEjWmRArAmskdM2YQXKU7TzR3DaEz7Dcdzkbm1tIaz3UtDbNr0/PCHdbvJ/HRivu45RCboh5lai0pu1+4+1VelTx3KYjvvBzfQtK8rPfs9LjGWr8wR865WqOnQUKABudQSmLcVBNBCVRh103MwRCTprKBZ21PpQPfbe6+Fp3tsxFlS8uO0OmZjZ7Y6ImYFX1ZmGNqJX+x1EZGJU6xwdlzqVHUGn+dsuIcJQ7u9fmCWBbycWiYJ0uMGmNlxGDJMWGAWJd0KC20GDlmlUG0oiIJCGKpH+Tub3wuib2Z0OiVIi9OaClpZPBK7vh2kJ3CniJVoqCGlr6YfqojNuK6EPB2pn4IT0T7RZJOGaMLO8yUzMcyy5J2glBaFuzHPr6VRaILHdyOcm5MpaiKrRHqRSW/mOk1yVjMeSJVBt0n0qYWL9Qmsb0c2FQzN1WPJnM3b6h14PV0udYVu3Jn/sw9cKV7dnpgo2acitzaI7fm8EFhbPlqvkSrzLt5y7txS2MCOzeyDx1dNUOWI5uEi0qfZEqW91PHyVecx4qUFG03kZJm20z4qLndnBiCY/COxkp+yhgdv336gtbMnGPNq/px7ZksipVXkWNsaLRnzpaXpVC/Mmce44Zbe2RMjoguefO2BKo2HEODT4aDL+A8X2F1YiqpWzFqwmRRNhFGB+fC7joa7PCkaqmSSrZYTSQnpdQAxb+1yK2xkqErrWT6sjoKpcXMCXeWBUB8An6DSL/u4EmNIRnFfOWYd9Jw9J2m3ke5XvpYhq9KZ73UO+iFLlnEiY2mexeEfTZEmVAsxb+eE3YqytpHPr5VdSuX+DeUWrMqcvEnpUqtikTc1tKV34rz054z1b3m2O4YrytyVnRuptKRU6x5Vp34pfodc5akq8XafkgNj7Hju9UdMSvehR1OBY6xLRYTQ2fmNerNqMyVFUPgMgxlVFoz3o+0NCpQ68BlNfK238nO5i1DMQeOQ0XOkEqoZwiatJMPszaB77R39LGmMzN9rNYifglIfQgdz90JkLrrJ/6anR4Ys1hhHsJG5F2UxNSZaY2HqHRAk2mMZ8RRm8Dbk3izQtJruleeytC6ytgSLLrkHArkT3JBRO0qkOxyoacSoJNKrZEquZuHWhfDZWmgRl067II+1QUIvrym8Q7XPxE5tc/FSCmLzWsrtP/2g3CfKHJ0aI3krahFhSuTkJVedxmKMqe8OJPr/S/4jDtQIM7lmFWmEH1n160cRAHTPqGPvZBBgkSI2THLO1Innl2deLXZc1P1tGbmuTuhVeKn8zVTtqs148aeubEnjqnlMXZUKrIPHY3yvHIPooJpX2LlAk5F9qYVeTTUNLXHqMROD+vdvlMTEenRDFE61abEQmekl6NNRCnYNRPWiP28MpHLaqAPoqwl1KpKTcHSWE9NKNn0kfuwWWsLpyJ9qtfjmVaSDbk8GuVxKvJVlpkTgMPccD+IdedwaKXu0Jl0duhRk00mG4mJs4MitpKlooLM1+hS6C6JXE/mRL1ejCoBpWCvDgFdIHSLvV6iG0Sg0VBCgWRt6jJSYPsnISBrTaqkpzJeC2XfX8hU6uJGtqMc5arHufwchmwV43Xx/2nKCIQltPoJWDEnYvXxRcm3JgFnI1FwaqFelGEeU0xoyQhBESA3Nbmx6GMkVxYUuBNMe8vb+kKOLyhS3nJ90dOnihfuIANFeirn+MyVOQPwOlxhSCQUt/bIbw9f8sId8NlwHzY02tMnKYqfuyOvugexeOi+FMySsvs6XJJKPqMtqtTkLcEbmsYzz4a28fR9zWmq6EfZ9TLwg/01z7ueVIrxrRtpVOCX6zeMueKtv1iPXJ0eeQjSGP2l+h2PscOQeRs2PLdH7sKOMTlu7Jm7uKNPFedQs/cN+7llCpbKROZoeHZzYvSWEAyzycRcif1kkHok2Uz1KEWz7bOkHC9BP0YJ8MHKwrC9SKymD8V+ksjaMD4Tavxcag50icE4pLWxaOaE/n1BRS0mx/nCMF3IwvIX4A5SCzXvM/Uxon8q/y5WYqi0J0+qDOOLmnmjV6BhaBT1Pq+1kJ4TNgu3K9VWOMTNL3ifROByRrbxs1jmUUJw9JsPtnsvAzi6MgWl2YrihSQ7pTZxsR3ZVROazPP6jFGJ5+bErT2w0RM+W17YI04J5WRUFRs7cYgNMWt+b3wld975iilZHkNHqyV30WrJQHynLrgyPY+po1MTjkijPC/skfsoxxenI9tqImw0bKCfncDqSlFc2UioAt5bhtlx3Q3MxUDks6H3FbUO/Hi+XvsyqQxJ+SyZjSmLqgbSKNyakbuwI5ZQ1WNsnmRfRGa+rAZOqhYbjMo8nlqJqFOZOFpUUmQP2WVSkzGzYr7MuIMqR2JgTQVbOtlZxmWdqHepNmswkfaJah8JnaF7nSVht8i580UZd3CiaE2XqqBHyw50TFTHjJ7SWrBLrgoIK0xcw+68RF1LE9OeImYQLhqASnr1msVawHqx1UzXFndKa3DRxz6+ncLdZ+pHQVQuDKVYmZVkvuRpmDGKjeA8r6O8pER13FHtFf0scuqz+syNO2N14tL0q3t3mfU455pGK57pMxs94UriplGJX6rfcYwNn7qJMVf89ukLyUwPrSB9qsSl7YlZGndLo26n52INkYv43bjlrt/weGrRuqgxQWNMxk+WqbaMQ0UMTwVjzor385YLO+CzYasmLgUu9dTrIHIqC6OP0h3fmZGYNQ9hQ60CfRn3bbT8fPvYErMiZM1+bum9o59kZ0xJ/qc0EBRqUsUPh8yxTyL72qHUI2Ne+yIS71boknaJZlBAIqsSEtQIbX7eCcA6VuL5qg65RC6Ugak50zzIicL1JZo6FzXMStKYxOJJ/er6tPKV3Um8XNX74iKlJmxsmZ2HeSeo2cWc6R4nzGBxTuMOE2asCc3He+W/tXmS2MqbKgNKGTNG7CDdV1SR7pzGN4bUFrDyvMEexjXPr37QnLuO36k+5aIZua7lTbsppBFHXHPWZR59w7uw45V7kCNYucABUimYv9e+A+RO/Xq6wOnIKTY0ypfX6UilHli63GJzf8QqQQ75aDhNFb64CbwxaJ0wVrpflQvrLP7LWlzLY3LsYyshQMW6DtKEvK2ObM1IrQJGJXRJ+QV4CJ101oGTqtmaiXOoCUngDhsr2S4pK+ZgSKkW+bbAI1RaJiZFqtbipiEV5FOZ3C2WcyHCa5/JUa3Sai756WIhUWvvwxakqSpZkU9fC/NW2GALX1gSBuTPapk/mUuMdk4ryDuW7xVNEXRSxu/cGkyqEmtfxvaScpZai+9sOS5WxMZ8zV38lz2+pZokr13VZEp8l1qAx+UcW+zUtsSlqZTEEezDqnxknVEu0TrhR11XPZfF9/Sj+RkAb/zluhA6PUsxnw2GzI/HaxrtuS9NxSlZfjRcU+nIGC0nX3MONc9rmb+QnkgojmBd6hPLEB3vxi3vhg37vsV7Ix6ooNA2E89WXLmjJXtNigLJszbxg0F+Tq3SemFrlVav1bKQfZl1kR3M4lQkodiaaY3kFgpKXP99SFp+j7minyp8MKSgpckZFWqWeRHJ9ZDo6kXytb1c2HL3LuO6itITKUpRKv9tlvgMdOFZJRFdYiHyLxdwldJ6zFFBTI1yg8zCYQusXq7QivK5qGOmwNGzlqO2mUXwUaXWCK2kHGcDvivkHaVX+4zKiPRcoNy/8JOJFPwMSCdXzrrSVEy+SL8KyU40Mn6ZrMUASkuX1fUZd9RMveH+LMrNydeiTunI5/UDl7bn0vb0sabR4t86pgafLB5K5vuSwy533Bf1CZ81czIFw5NwKvLGX7Azw7qjHGiKs1bLjIn1bN3MXFmMTgwZkndiTZk187GSHMWopEeBJWwCD3PLdSUDYhs70RpPyopDaDAq45N4sN77jcyD2KdjQp8qCTotLoJaByYs51Djk+CUfDSyg+TlmCXKGxlx+WolpoAs8/FiMy/Nw0XizQUCkWXXgRLyWQJBl7+TpUcBBRZRS1CT/F0XEN2TqunOUeZCSsBqNgvIWgiapjgz1o59kt2F8v8XQr/f2vK91EqXFGl5SfmV7n6yao3Nzh/fJvmWZtxDpn7wYiX3ce2ZZCt+nmQX7400lxys6BrePVBtKrJuGJ5r9KiJUTN4x0UtPqgbd+Y79R3PzIk/m5+TtKbWfrVvdGaijzVDrEhZc2PPdHrmhTuU5p5nr3K5EzvOsS7DXQeeaVHIbs3Au9jSp5p9aDn5mv3UcFhA04+VTPUpOUbMzwStqTLEaEi7SDw6mYYsHfEpGe6mLaHMrlidqHRgiBs+bfbU2nOKNRd2ZEqWkAzv4hajMlZFhlhx5eTImbKitbLgclbMsyXM5glBlAWAbQZVehY8qYZXlKlKWSBiLVd/LvgmtMU1kZREaBRrymJv58yatFsdIqFbFpfUGeOV/Bxtib2uHgPupLBnvxI9SZJPo+dE2Eg6VnUoUX3nebX9hK1jvDHMO010svNVxQHgDhN6tqTa4PbSmJ6e1Xzs49tRt2rFcFsVCmDAjlHYv3NAhYbsnpa5JFEp5ssKtatwXUVqBa25+IDmyTI7OXLsfUPIWo5RZlsmB9N65DJlQs+pyIUduPNbtMrsQ8tj6NiYiTfTjjFI3+N5febzWqIWDJnH1PEYO35/drwLO/7g/JIpGULWGJ3YdiO5VTxmRZzk3J+8Qc1FeYlyXleDJu8CX3YPXLl+PT6NydHpmfd+w9ZMnGJNa4pgkAyt8sWxXHxZpZE4JUvKmnfzlnOsOPma90NHiIbJi/UkJ4Ue5cJWXiTE1VM1sR5rqsMyp7FkpVBA1xl3DGhfFDRnnmZJtEJPCVNrzFgy6o0i18X63ugPkERy84h1cRcX23osrC5/UZGM+iAcSHCqvitDVTe2LNwNZopCVknQ3gVcSfaKXYX2Eb91TM9bYq2YLgzm1n1t0vJjHv8i6bt/C/inOee7j3/5b3i9WPIOS1EYayNTh40lNvLG61iOX1ZC703xb+nDADlTWY1vHc2dZnCOE3BfeZpika+1Z2eG9fy+HJO8fnLHTtny3J5W86JWmfvCmhmCYwiOQ9UwVZadHnhphMbSlUnHmDVXrud+3jAEx+gt/VgTo0KpDC6hmkQAzMVMODuICqqEriJVJazfTstsyfLJLdOKIA7eIcrCWdwA92GzkmJAHMiLezgkGbZaMKVTMIRgpNCeTKEwSu2hfVkcSKmhC65Ijjas6CL5AlYre04FElds7bZP6xfZPhazYSJsLPU+ruGhujGkAupLRvhXesk6lMgTFIqkRT0zpQ+jg7yeOy2AcLDnIH6+EncdG9llYl0ED5/Rs1j5tU+ApnmMaxiR3/0cm4lKqWvgfwL+EfBfKjj+ba4AACAASURBVKV+A/gvgL8G/KOc839evu6/+dnnvvE1k5AzgKfuei5+rSlhfLE4+4SbZeY5VQY1B3LjQOs1/DK5LAA2nVEqE7I4g//U3HJnd4VQOGNM5tYeiGhOpUfyerrg/bxliI4pWe6nTqb3xhalMrWJ3FRnfq35Ka/cA59bkY4dPfepKUW8jPROwRKiIXiDqwLGiEVeKRiDljiDxbCUIA2WqDPvPwBAOS2d/GXaEWCIjmOQD36pW5a/gxT2IWt0MUJNyRKy+LSOQyMML6/JswDtdHhy0i5301Sxun2h9EGSHFmSAVXqx1hJMrIZ4toATlaKcomgLjTFJLFs02U5jlm1juJm8+T/QkFSJYYuQTLlOOokb7628qeOwspaclGkb2KKazwWwUA69maS/o0uPLBUS+yCLsGzukTIzern23H/68B/knP+x2XB/AZgcs5/Ryn13yqlfgX4N372uZzzH37TCyaj8EvtUYrG+jEXleRJdchOEyrzFD3mzIrUJEskWHOnITt8b3ibFCEaNtXMq27/NaPgMTaM2fLgN5yKfDonS1KJ99NGKCm+oi4jsiEaclbcTVt+UD/nkFoqfkREcUwy+fjD+TmH0HKYWzJCQYlBE6ZadoykQGfUZPCAmsxqDqRMV9Y6rFb5k5efK2TDFC1WR+ZkqXQoAoHn0gxSmJcdBqAP0gMJ2TBH+bdjsKTVtVt2NW9JtqhLUa/vvfZlkeSyUMqNS8dcvFsJPWVUUnLcmuPqhkiVxgwBleRiXGZmzN6jol0LbF1ufEsDMja6SPl5/VMl1saj8fK9jNNUj7PAscvDX1QSX27kmoi1LkW7TD8ukX+LLSa2dhUZQrvcXD/iyi+Pj0nf/d8AlFL/HvBvAjc8BYj+L0h++9/8C577xkUCT4gZoNwhrGQgluckUbc0n8p2TAbjI7r31LOEx8y7Cn1R7jBIzl9ImoNv0GQefctNJdELTfYfIHYGvlKXbM3EVDrfyxHLR4madi4wJ0OtPd917/ieG9HAnwRxAWuer2THfqoYzhW5X8Iyi93fZvSgSFgp3IPI3GSFdzLzAayTlCnrIvtqNnoiJJmYdFbAE6/niz+3OJaeSkiaMVhyVhzODX6ypLOcwcmge407iTdrJTFGyMumrp7ImklTGnzCLdZN6WcY4Q0vCykVEHhoS803phLFkBlubTE7KsxcIHLtk9oEEliqZcyjqFiZ4CQyz1aSqByixLvpUEZ8rUYfZrLRqKVwb5UgUpOVANI5rVFwsVLYkqYcmlLrqKeb8V/2+NiaRAH/IfAgbzc/Kf/pHsl43/wFz/3sa/x94O8D1O0VzftA2EjwDOopi33BzqiYodKYORV9vBAwaosdF8qjk3HSKNKkH6QfMUxiCe8bQY9KkRtWu8e7eceULHfTlsE67sYtVidOc0WIhsOxI4yW2GpOvqZRntfhkvcFV/Q6XPI7wxf8zvEVv3f3CeehIrxvcfea+qFknpRFnSpRjEInXiQdhQSiEpyjY/9XGyFO6pkbe6bWnj7W3FaGzkzc+R1vpx33c4ctaZghyfx9HyqaIhmDdPDz0jSMmjQZUbJK38mMhcKoS4ZKceCuXK2iCi1fr0OpE9KCUH2ipWRRamVIyks9sKhWCy523snNIFXAqSyGRShIZdJxqU0/sM9nLRkmiz1p+V4yL7J4xwyxkx0itBJctLyemSIqFBMsoLKiepwxk8VsZCDLb37OBseccwb+Y6XUfwb8B8B/Xf7TFjF1noD2Z5772df4TeA3AbY3X+TYaEK7RIyVDnuxPehQBrCq0pwquYCxNgLWjrmQU+KK/kwGVBXRJtHWM42VO/PD1FHpyDHUvJl2ZZTV4HSkD7ILxKSZomUOZp1FV4PBJ/jJ/pL/tf5VvtfdrQCG/+f0HX54vuFPH2443G9g0tijxp2leeZOmeokd7hkxVIx7QROoENmutTESi5CWxzEy9zL0Tfc2DM+mjLgNeKaSMrSOHQ68IPhOVOyfNIeeT9tcDquR6xhdoSoCaWjLt3v0lkPCneUhWLPcudeDIzJihS8TPp9uIOLiFJk1UPB06YCxq7VkxCDIIPcOctFSlU+16dmpIzgyoKbLmVnM3MJG53zSkLRJRg0OSXDVoa15+FbhcqyQ5ogtJQKLQGkZZY+dEa8XLk0FweJhov1svJ+jh13pdR/CnyVc/7vgCukaP93gH8M/A3g+8CP/4Lnvvk1U36aNmsUfqswk6HKopfnBCwWB4od28oEW7quxEI/R/Hl9JnZy50xHR1eZ/azRanMrhaMzinUVDrQGplGXIyFjQm8aI686XdrLeK9JZ0czRtDNoZTUrzeXHCY5UgzJcsfHW95fdxxuNtgHpwgQPeK9i7TPMaV7q5SZrowuJOclRfP0TJuOl0bTqHmRXNcAROfukdMkawXS/6I432ppa5dzznKeO67wu09zjWjl2PWMDpSNOTRoEaDPRbcqhE/1grbLo4HO8lFZccsF6JWuENcTYWLyiV393KhuyIjR6m+VUiEzqK9XNih05gpc/5EGojJSn56fYhroy85xfanATMm/FZMrfNGeF3Dcy3u3ztB/7R38vPpOeJOgdMXDdpn/FZ2sPFG47eK0DjZSYojI7qnBahjonqMTM+k9fDzTt/9TeAfKqX+I+B3gP8B+N+VUq+Afx/42/J28n/8zHPf+JA7SzGrFY9a/Rio3w5ML9qSexGluNNPXiAUuH0Q2nyImJQwvilMKEUaNNE6oSUi0OdxLkVtEhOiVYnKBFo9QwUv3JHv7d5z5Xp+Ul/x09MlP/UG+ydWLBrJ8cPpE3KT+OGza2LUjI8NatC07wz1fRlKOiU2r2fsYUL3M+rYQ8601xfo80B1e4HuvSgtfkPoDLY3VDqwNROdmVYqpCat/ZKl429ULhOTOwBpPn5gOUlZPdlhZsmTxzw1AbMtvYzAugBMuYDr/QdBQxFiZda4CDvKDW3JGFkUMOWfCunYCLE/tJJYtphT60e9QrPtmFaYA8jOP14Z3KDXYr15KE3C2T7Fc2RwfZCZ37IrrUfz4gKonNwk3VkgFe4UhDVdQpQ+FINkh8yr9P0xj48p3B+Av/fhc0qpv1ue+wc55/03PfdNDx2F1+QOoVilxWoSN241r5ELWFkJ7S9Z+dMMwuJKF600s4oVwZ7F+el7SzaZ++mKh01Au8TkLVfdgNWJoBJWxxXe5rPh8/aBa3vmmTuzsxOdm/n+dz/DnM3qjmUy9MMWshKEZ69o7jPNvfyM7hwlMjkUBFLOECPKB7KzYv+ohQQzX1j8RiTUH+xvANi5K35990OOseETtxdgd/FsvZkvOPiGWoeV+zsGhym9kcpGRm/lVBqV+LImLSCHEs0A6ml4qlzoi7lQlTDVrHkC2Mzls14IJmFRn/LX6od11yz5lyoVwHUGNyRCowU0VyR+kIVpvMC0pV+Siw8sf+17xkaLnaR2ZfGWY7lR+I1drSrVMaJLDF5yiunayYRrXOoYoTmaENHTU7ryxz7+f3Xcy8L5h3/Zc9/477V4ebLVuMcJ9yj5I/o4YIatSL1BcviyFa5TNkagZsdyB1OqJLMW/9eC4yzTaGsITLGXPPZiH49Rs2sn+lDxvDlhdeTSDlyZni/cPb/afMWfbG55d95wPDf4waFOFrfXuIPG9rL9uz5R33vsIGJDrItVfFNhcpaErpgkxi4WIqXRwjZejjAGrIkrbcWpgNNB8hiTWxfxjTtzChVWR2qUoIGi2ONj0sT0tIvkoNfuvnyP/NTAc6CC7CahkqI9VfL3WCE7daGYLAtjoSoqp3CniD37lWyTS19jviyXkSpsLi/KpTtGYqWpDn4txm3/FCOXSxsARBJmTELQyU8qmRyz0ur3UxH0ILvSUn8kY3BncQTYs0jU002NPYeymJ3UQq0hlTrHDP8KjO+G9klX11MkbStSVxFLAAvInSkrhfEBHdLXZDsxzAmZvjp/0CmOCrUBPWiSNmSXnrL/VGYaRXLtZ8dhavjKeb7ciO1kV49s9MSv1G/4d1/9CXfTlj/eP+PNmyv0+5rmvQwIbV4HqscJcxglhampiLtmtWegNdQVylmIibztSBux28TOMV4ZxmeSVRLiQlTM7JuOryQwhWNoeMwtQ3ScfM3dsBUaSxD59zjW7JqJfpLfZ+mqk5Q0DcuNIy8+uCA2EOFoZfy2UFCsPJ+LmmTmRNw8Fe4Ln0pFOQLDojYJuGMBM5gpF3i2EBunKydwB+vETaEV/sJChnkrSNPxSq0EFd8pmmJRcb1IuKGV3TZsZDGN1/L5d29lN3CHEmc+J3RIMuFoFaFyTNd2XVihqG1io1+giL/oLuAkBTqhOH5bx3Rdss5XBURR7bM0qpZCHaSra4UJjJbFFCvR9+1YMvmSWB5iNgSXibNBmUTVBMH9JI01whCuTeAYBNNjVOKcap6ZE3+t+ymmS3zZvuB3u0/5rf476MlCLiC9kMAHGJfsFIOaRVHLjSPebFdKJchMw+JazZo1EGeYHSdX0xgZGa51YEqOKUry1GFuGYLjcWg4qpphcnTNTEia01ThTGSY/j/q3qXXkiVLE/rWMjN334/ziIgb92ZWdVVR3Y2EGhA0IxASKrVgwAQJfkRP+ANMmPUIMWbQEvwLJMQIiUkPQD1BQlUlqO6srMq6j3ids/f2h70YfMvMz61HZpTUKG67lLqRJ06cs/d2N7O1vvU9AkrU7jfczPs0AbJatDS4kaQTzGWRn3MJsGEfbOAGDJfaqSZ9wOsbv8p3F8TipDu6U5dSoQNTquY3inia8Pw7ing4wK87UACYCvGJfef0w4b1NQeE8eg5cX8dwHGQ9H8TrhXDc8Hxz2cicAttb/PjiO0+YL1XeOOmxYOwBLN+1ptRN2DyjJ+6fLea+AaOw8Pibapa6y7obyKe0aGcQ6c6jB82MAdD4C8bafMZSCO1zXm0JKiT7YCzQz1k1CVgmT2QBfmUoFqQi+K76xlfny74k/ktYvH01rV+YNCE3x3f4XYe8PHvH/CL02ts345w0QM44JAKJGXU4FEnD4kJcNr1FOk8sOk9+L4b5pFo3vYAbI8F//abdyhV8Ga84UM84s/nB9yFFX9+5YmyFYdT2HA/rbgfF3r2xoDNDOQu14nOixtPEp0VmuRFT7HTT6QQ+q3K//qZwz031z4XKZ50+njiA5YnoRlE4r3SyFgGjRnpGNBUhqgACnD8dmUIz5Pnfy8jxh82sicOrv/c21vfTR3SYedbjU9ld4A03YebC822hWXt8naCv2VSTprj/Fpw90syy/3ziulx6qrX688G+IXGeXRuAfz18423vox8N1X4K323clCk10OHDxvlui2YbMmsqBb8Oe5lWpk8012NysTAHKAMlTT8JMAiyGbbWQcunLo6m+QqziOfJkVF0NQNrBvp8XfCO7z2F/y96Xv84auf4Z9/89v41fQW62PA3f09Dj8c0AJt9LZBbgtlqN88UrtwYGbg+sqQoxHYHivyWFEeEt6MV3zaJgTNuKYRSw74tB3w/nbobpDvrkeWjCD15dNlgnMVn25HlMVBVtcpJm7hSeUWwr4tH7J6oK7oabhhqyawanpxK8kmwrVN4FS8wJvjbh7CrnPfOA2HwKbgRL/8uxn1EOCfVqT7kZII8HvCNSGeBoQbA3yGZ2B6l7HdOwwXAz28w3Z2KAGYPmRsdw6T2ZyOn2hElyfF+H5FnjwwkMe3vPZwq0M8CcJtwPApIU8Bfk69xxm61SkHkJ97fTFlolsLDbJTBa4Jkgu8UxrRTfQAbkNE1pb7DWlmEO66ITiFFI9wJLYueXfoqI6Kt0ahqMLMEDhBXD0W06LnKpjcHbxmfB2e8VxobNeu53zAr7YHvN+OeF5G/g6bQqejUTTEocoZbplQnWJ5O2B5cMgjzC8KNoCDlTh8Xd8vZzKIMykxl5Xu7usSyL2qgPOFQiwjcZaiELG8E1dRvVFoYalaYFmFQpfENrnm39u8Q6V/MBWkd5F4ytkCwJIQgn6SFI8+hGt57Y10mCYGMaVXh+70no6NXFj6gLJpUtrknTOM2v27mpt8o9JIrr03BbgZSXHdX1hKhaogXAuGp4jhkyI8b5A10lkH2LMVY7UQnwJJP/FFUh3VZG7j4KnV0XkUDM+hUxIaB0dy6db+DGuxdFWvO9fLBlTFv9Bnm+lzdpwTwFdULZApI4wJtQrW6DH4jA/rkc1zPOAhzPjavKwmifjF9gZHt+HgIl4fZ1xeHbFeB0gmUqJN5roxh7x6RQ5cGPkg2O5ZWknmjl6mQsKhL/iwHJhPCGBZAuIcgK3Rc+1BBIBQ9qjozTGBeVPgxc1u9rAwmklbzACgpZVbHNBJ5pwEIJpFU2pDw6zX6ExhGxzWoSXaGlnR72rARmdh/qVaNsgAtxCBbO6MrVFPploMN6oQp7nAz7lbBpWBtPsWDtTIitvod/6VciygS4ZzjOgo9w7bqxHu5nog6fyVolgWfaBmjo39Z15fTJnoloxwifBXa75HBymK8LQhnoNl2xUugmpEuzWjZOqa3RwhS0I5BlpsNiRGdrJjg4Hdwga12vCpLg4pcCo/jAXPM/MJSxV80gw9MVewmWM/uBnPecLJZijhEBEfPDQ5Mz4Q6AoMZ4XbmN93+xljqfOBxm9lKpBNUUPhtr1SBPUX3z+gGClSZweXWiaIAFLphRUq8lGRFofq+LV8FMjNoQ7VBFRADYxkqzZEVNTdFshmGds9w041Atmc38sgwKXB58D0ieUQp/AvDB/sVK6Z3mG6mRXQp4jtIXTkKN0xhuH2TYBf9uDQcM2EgRMdIf2tYHy/QuPAzbDSCCRNivWBXLDtTuHW3YRO14QyBfgPN9TBc0M6BWwPHvGOC2i4FAwfsvW5gBT+/MY2drEgXH7iEDCVZq5Dvd6sg/xlg3te2KSfgsGLDuXe/4hGEK48YcbvM3SJCJm0j/k1+4gyVOSHBCSFrOZRBNtZk6AcDCnTgrjRTf35NiFlxd9/TU3ZK3/thnDv0wkPlm34w3DGVw8X/GoO2LL0vHYISxsXpTt7lFBR1RA3ARdIsNpPAShd6CUpdBGMP5DG4RcjFFopM38N5EOBHDP8kJGjIowJMY5E20bbFarwlBIgnQskCtKx9lrL33a1X6smpfJhB/iaXSSdIx736XyzeapqTXyuPe4gHeiQuN0rNNGkOp0osXVb7YrGeHIdRKjCxbo8OpQwYX1Q+JmzJ3LIKINwS4ZbFeGaGPnmFOl+xPxVgH81IJ5MnWrqxeO3GwYVDN9eodcZeH1GPgQsrxw0sWJphhKtt/qc64ssErcyDdUtiam7pSKePbbfmnD4PmC7p4fS+JG9h79mDE8VuphwxqDV0uOsWeJoY69uAnz0L5R1gnLM0BOPfkQzZ4sOJTKPA1mw+BH/x8cTXr264JvxyeSzE74JT5QAS8a/c/fnOHnaBn0YTl1tqDeWfjUBcMxZh/3+KiCQsCmwsaTRVQBRuJk6cxc5GW/lEXsZIyPOgnxHwwZ1BSULxjEhnxycK1BXkJKDAMibTQJzgNvEAAyYG0qbjPd9g/ahD41+YvcnVtSZ9wlQg3fpzlgGQ86spfFLxfj9AjcPcCs3rSadTcfpR84kkkp3YDm8Y186fr8gPA+WxLwTE7d7gV895rcKYOQE/zmbGQQXkMbSDeyWyeH6s4G90c8C7n5xMGM7zl28xcv13/OvmgX8/8elZq8vqcDdNnohzcXgQ6C6AH/LfNAKIJnf18N/lI2mPtP8wT2vKOEe8eyRDoLlbUU5FMgxAUUQxoTpsFGplxTpGiCbwl+MiWq7d7yveH/z+Bev3+D1cMP77UhjiDihVMHkEiW8IcK9egZeAZdlpG3o1yRHSmS5pIstgApo9qbXt0m71cbnXxaLUC5o7ujx2Ayo+YCnE5tzcRWnw4rFBUwhoRxIjR9DwsVi3ACWkyzVgHSuqKuJmhJLwPBseg6jeKQDkCb+rnC1HBCbbrfZSXFi2SH883bnuJgUSHdDn6IvbwcOiBNLve2OGYdS2bSPn4zGDg726N+rmF/pPpg0FWM2B5bhwlzN8cPaRVrpGKyJryijYrhynuON+l/NpbE6QbgUolyxoDpFvPf/GoT4GGkxH7wxQEfkIPYhTdDEqSzqQHrCQTF+iKg6Ehsv3A3y5CExdBRjOytKaHJUC6P5FFBDRXYFyxKgrmA4RgbX/MWRZgdX4PA9/WZRWQf/n+/+LcT7AhSBvF5xvlvgXcZXxxucFtxiwBo9brcR6WmAf3KYPpJ2Uazmp1/VLlt1Brv6dX/w+o5eAVkL+41B90m4cpH4u4gwJMTscD6sCC5jTQ7rSsqFSEVZPWQg0iXZeogXl7NwUE6eARRCwpLNJNCGfXkgGFGbK7zAop8FNVV4v5crLYeQPDtS5Rvfrln95JElVD4o1nvy4WhXBBy+i2YvVBCuiYYgqSC+mhDe3TD89h2m72fkQzAvL08tyUHJxli4gFrKVnN83B48oul2/FIwvkvdYd7fpCOen3N9OQj4RrPj8MxjswTORnQr/PtlQDBjunLgYErniBgO8E8rT5eYIVuEzCywx6cJ86zQlR/adgDqOcGNGa/ubziPK3JRfP90NmkrbXUOP1Tc/2LB8KcfUA+jUdkfMb9x8HPF9bcPWPWAeax4/+oBcsioV1IsdFMMZs3jFqv1Kx++4bkyeiwVOKvN/S3zVLxuiK8P8M8b8uThLxvSA93itxN3/HhX4Gexhpx39auzaU1cxuvjjGWIeBgX/Ap3qFVQrKmGAu4myAORJ5Z7nIOoxTw3fUbVnTqPyp4vHZSCLKk9nKfx5NzMpsst1LqHH242TM2Irw6dIcHN0HVZbXiOPdqBEXL8HMohIJ4Dkjl1pslhe/CoKpi/8gjP5r64JfgtIZ9HVB+IYhaeGm7jZ+xvkWTGNXMx2VxN1gjNFfHVAWly8PNPfJhIf60B6eCMOdoGVMWg4WJNoYcERRkUGhQ6+T7ZrbaoqqcuXGJGS03Ko6CMFXXKcGPG6bji8TAjFUUsit969QnXbcB3i0e8V1xUIGXEyb+hPHXOGD9kDE8Fh7+44dUfBgYMAZjf0DKTuY94wbKtlikuqBtweF8wfEpwt8SbZNp8vW00gjgG9mIPI2ctTnD7ZqTs9WtBvCsop4w4KvzrBT97/QSnBQ8Dy8tP24SvDhf8P++/QhlJ3Myb41hptSgEBcqhoK4OLrIUG55qP+UAK4E+7upEf8uIZ2eK0J1oiFIxXAr1GoulRdWK7IH41ZGw8Oixvgo4fLugesXwwxX5cIfh+xnlGLA9DIAC6wNPk+VRIPWIcK3Y7gThChze8TQ6/XIGRHD4IbGkUsH69QnxjvLc9dHt5McKDB+jkWELEByWryeGlQ4cUKf7ifC0par5a/zs5/ULQcDFBDQCXRObvfGEeKaLfAlMMBo/RLpe3IyGPUeUMxEsqVxsyAxtQa2YfnVBOtzbL3G45YDttyquGDFPKx6nGSoVtxgYy3aIWF975MEhHwSX3x77bCDeV6RjwfTdPfJUcf4FMDzXnkA7GP3bL6XX2M3MIN4ZxT6Vzg4Qo6rU4FAmQtzbAwGK5bVAN4fL77FH2L7ZcHhccJo2XOYR3mdctwCnFVt2eDATvlsa8HBY+ueqQ0ZerZxJhKXDJ4fwbL2KA7YHgb+yJG2iKmpKGkRM2yGx/6Ea0zao3RtDJkftw7kmoFPzHSijQzx76F3A5eceVU5daOdf9Bf3a0aZPHRJ2N5M3TGyKrA9DJyZHBTyocItiY71HxbobUP4ioIzutor4l1APCvC5Lq7fFgKpBbaD11WblT3E+d09z91w+ygWN9MjAt7Eki0sJ6Ncw5yhJqZmeuCfmDiB7UkIGbo0w31MAIxoQ4B6W7kA35UbPfojhgqFbctoAK4rQOmIcK7jK8fLvhBK8LPSVdXLfi9hw8AgN8/vcObcMWfr4+Yc8A/+7Pfw/t3R8jsML5XHL5VKv2MNNfkuLT6FDP/HqilEFijtDfmeRSsj4Lr7xTkI3sh9xBRsuB0XnEYIk7DhpQVJ6POjD71BR6zBfQs5vyyBuTF0ym+oCN9EtEXQ/Vs2t1WkYv1HQr4spvThUsx5jCFTYBNqks1tGvXjTT0qN0fZiQKJFEx6CvvQR53U+31kSZz6yvXOWXjpz32rXhB2BJcTJBUMYBVQr4bEe8C+6YpkMvldudIjZy7DJ82yLuCeD9Ct4x08pi/HjFMDung2GfZ+/vc64sNE8Nz5EkAlh7pRCGSn/lQVU91m1QgfFxYqlxX1MFDtoRyGpEfTpCcARdQHUuW9tD28MgsKEUx+IyHcUFQUjyyGUw/nGaMLiNY+tSb8QontbvLU9+R8c3ffQL+Lnps2x9dvsaH9YgPtwOWLWCdA8rq4D7QnCI8qdX+rmtHaB4NbPfWuIaKMlZgykBSDGOE93wt99OCu8AG/eN8wCFEBM14GLmgH6cZT+sEZ9SaMCQSHauiTESyuFh22rwaWuVWoMWjuY009driIk6MbWsMhoZwQYB0tLSoRSkaM1mvFPK/YNaobZHlSTB+NJtUL9DFSrjNKCrWF2mkcArg55OOHNLqWs15ZezG2Hnkww7hAtFUEJ7JBqbX74jtnuUizLyP3D9gfLeijOx31sef+MS9BKHW2AmGj4kl1+gwFO5eLVYYMHfHErC9GhBGfjjhXQJqhV5m1HGAXmfU4CE541hauTZAsqAMHuXm8F5PuCwjfWtdgdeCxyMXyOM4Y/IRd37Ff3z/x/iUT/id8A7/cnuLUhUf8oR38YS3wwVBMn4+fEK4z1hKwPwY8CrcsNix9X474dvlDn/07VvcPk5AEriZKsFoEuT4WKh3ORTUA/smDAXBZxzHDUELYnbQoWBNNOAGgCVRs++MwbyZGXYFsG2eepKoxmNpVB2ezq2MdJlzm+bW2KSzzRVFLJqt002aTLeyZ3Rr4f2KA6SQcFqVpEONBTk46EgN8WPTxgAAIABJREFUeRWz81kF20nhVzuN7PdK4al7eE7dkqi+4JQRwTKRVkv4VQBgDopuAimK7c5x/lGAcEkYW48bC9LkEM+K9HVAuJCFvJ3lpx+9oBkYPlEn4p8WyG1FEEE6k84gvnIgvRE90SXRDmbNLwQ/Aag0aKmRWfCyRMhphMsF4RaQD9JZsWLkQFXgPK0IWvBqvOEaR/yd40fGGvgFBdrjrH+xvsY1j3iyGYmT2rMRP8YDnuOEj9sBk4u4xhHBZVy2EU/LiG0OhI+ruUxW0PkF6DQVVACrIosHIoNrLsuIg2XPN1+tNXpMPsFpQcl0dMlVkItiWbk4S1RgddCF3l7+RliXNqRGZy9AmKtNqaWXO9U1fy2eGJCddChlL01+BFeX9p6qoXkFbisYLtzZG8mxesHwYYM+DoxXsA2+eiAb96uTRKtN6FOBrgCamnHJgDnkxLPvi7uRH4cLOhOZGe+K4TlC50Re1+qRR+UAe3Nw0XXC5+dcX+Yk8YLlq4AqwHAO8PMB62NAY5xSUyKQxN2qTN7sa9zuNg7sdaW3r20RujDLZHofINUjDwp/EczugG0qkJHH+nmihFek4inRlHotHkuh83ypirUwmHQrVA+2qOdcFc/riDXShmgMzHp3Ui0oh7wsVKBKhYsKt5pYqwLuxl0wjxUoQvKlSYu9I/GyVGDNHqkoxpCwZoe0DViix2nckIviugyoFjVdZw9dSG9pHr+6vWD11v2zb/ZNgD2w0h58O23sJJFcLTNGe7KVRqKN8exoYmfzrXgUDEGw3Sm280BazcBZ0PhAX6zhWrvM1s0F4TkiHDwlwUpT7DwJ6rhHORQv8IugWZmGS0Ieya6uXpC95R82xnhhD7QhQM4eVYQkWgBloIPjduJQ9HOvLzYnaQMlgDesMWRpom2imxfeSG4p5Bmt2YT8pKKgViocRwcMHulxRB4Uyxs2iNVM1TQKiihqEsyuMhbNSpfBZWC44d4vWCo9sAAmWF3TiHfLCc/riNs6YFs94o26d7cQ6dpsjYrNEXQVnDd76ARoLmQtB71xuQCQdyWgs0lWzEvA5mhRukbS5duMxBn95LmMKEURN488O55YKxeI2/heNe4QNY2orVSxRr4xForaQNPKsVp3b97GdtBcmbNSuWNr5vyGb4CLwa9s8IdL4eLx+yIcPibkg2OVUIFqD2iy9Kl0DLzntZ1OgL7INGzoIRkJJu02t0e+JjIw2sJvzjrF5kA5oC8KEhz/NRgmurXg+MsbdIndKkbShHw0M2ZrwN1suPaWeMpEozEEJTRYzIMrUGvtbhbjfEl9lxuePbY7wbIq8gFIU0U6ZLgTQz9rJVv2lgb8IGd8jEeoFFzTiF9eHrFmhw/PR3hfmHl48fAfPYZPguGJqbLF23Q9GjeocGrdZMUl2ANqaU7uZrSaBHLH7IqZXKs4cNIfx0bErPBDRmlew5XcsxKV/sKZzGEO+vjQh0uFW2ChNjYdFzqYsNSiRiSajlwyKSPpqH23r20BlQq1UwaNhxatXPT8vfng4JayK/4EhPRXsm7LsEPI1RlEDfY41QnU7nsoldFtZsSdB+nmEFVgzvEG8NhQ1M+Z5R3ayQaaTwizTvxtgK65o3X5aLOuz7y+2DAxPo4spwyHjyeji5uWJI8K1GAKxYECnlI73Ce1wj+v0MsK2SLqECBbhB5Yo3M4Vk2DLRieKlIUljl3Hss4oIwRzhV8P59wDhtUKn42PeHgIt6E648i2m7rgLkAenMYPwimHyqmD6UH3OQg8OtOv67aXNDr3ouAp5qBLsgTE28lSn/4pArj2ipQ7YgaH3myhZAg4rpiMW1kGUsWEy/teSNV9t+VmtDKXlcz7H7pzetK7aRF3cou1bUDg/eBcyme4nSxKUEB3ROuJFWUkT+/2bk2t0fGMgDEpu3+rIRpy+hIfTEtSfGCUCwCe8l07DTouVkTpZMNTUG73HBt6JmpWgeFVI/5q4DhyRLTDLJ+WaX8pusLcbfQw+fbcd5M1LrTPFhzSjtW285WDHER4fQ6Z2BZadcTPHRLKKM3mnWGvyXEu4D8zBuwnaihX2RAGjzEV8gjEDN354ewQM3tPVk/8jRPeDgsWKaA5eQRTwK3CiRrdyEpHnArn8RmXNB0FO0kyQP/W4a6P8TKnqW6Cnd1RiC0IV+onFAPAeoZ5RAbiiVAvXmET2ZUfePE2q1cIH4BS6Fqk/TEoeb4VLpoiQZ0rvPLmogq3jk072UOQms3q5NkzboAdeS8p1HrqyiTdLXBszSJcEum84kXxJPrZWd5dJg+OIP7KxHLWCDGPWtXOvkuFY4HNUcVK0FXUn3cKghPNKUDWHq18Nrtvs3brDfxu6/Y51xfZk4SK6bvV5u2E85NDwfUQeGuNJ/T0TG050bjB/fqaLRocwqfHPLdhO31xGP4SC/YNmByN4uP8wp/TQC8LUALsFlYalXNPTItV8WH7YBns0V9vx5xDiteHeceNfddUqSrwwIYlg/kA/YaVwBUlhSU6rJ5bnOR5javFoFWzHy6DJX2RwDgKmRRNvQCqKuAVKToUYudNIZC5alCNyJo6SjdXLosLOdoBMgeMA+tcSe/62U2u4v0HYAQeSTF3xajgI2zmTOInSakqgucY+M1PJtLY9iHplUrqnrbREh3h4KpWAYnt6uxieNRGVXdhpPFo8mGm7Q4XEiPeUmxh9kLEazZ4OaGjE5wc2KCWq59pvK515dp3JVNm3OK+DDxAz1zhwlXcnPyyONRDgGaClGtwpu03QfrWRTjtzdyiA6BlPvTQNubQYFbhXteUQ8BbkkIF49wRzIdk10r4mvg6iakY8R5XLHkgJ8PT7j3M562A45+Q66Ct9MFgybkKvi+KOJrQXwK/WEFANlozDZ8NGRL+ZDHO0K+1fFk0DN7J9UKrYLybkAdCnR23Vxat1Z2knYhrjLiuiiQ+OS6i2L4qOalxf5ITCgVrqznmYeygwb99drXc7NBHdhX5CDdbK6BJ2KDP6gZBXYgQizro20KLW+ETXy4FowfU2cEu41zC4CbXLzzCFdnDXZzziFbwW1MpQozZ2ntZGtludTa+z/JBVJJuV9eB55uB0U8cIq/3TmMn6h6lVKx3oUOpnzO9WXKLWmZ39ptK2GDJxf3o1Zigb9skNsKOU2QnFGdw1ArkREVpEcLvpkcfGN8lgr3tEGuCyAW2TB4tAxxt1b4RVA3IfauHktU/KreYxgSfrid8NXxio/LAYNLuBtW/L3j99Bjxae7A/70/hVSVbxbTliSh5OK54US4GUNuH01AFEgo0l1i0BcIUqZFM5nmloDZg4OwFcU+/6StPct1Vdg4+eUNgU2ha5qvYOhNHVfBGLEy8ZEJoeM5VIeBP6aIUX3U6HssLBbmVTV8tCbCUcvf5tOI9f94MyAosIJLPagQKqhjsb2bfSVpo+vTuBSQV3IqgipdBo8nKA4c2KpPA0b7YWlquxJwM3/YEmoTqExc9EF100mWpowgC6zYA/1UxddGS6vW0b4wKyRcp6QTgxraZah8S5geTvCbSeGQm4V03uzzByZq7g+tuZe6EGb+CGkhxFudJA1Q0qBxIzw7go3D8jjCf4mWN6QgpHuWKYMQ8LP754x+oS34wUxO3w9XnDnV5zdgrf+Gf9y/QrXYcTb4Rnfj3coELwOV0wa8ZV/hkrFv1i+wv/19FsYNOHDesR3z2fkzK2rVoH3GaVk5KyQACyrg5syskGztZD6AZJvUQcArhovS6BmOKdJEG6tnocF5YALR+yUsBOjeX71QaJN2IsDUIlyuZMz2yZrwitPJo0VdVToWuBvfCD3S5EsdZfln/abHC6UWeuWKXjy5lsQTGB1ctgePcb3iffcFmu45K5Jb/Sll/ZSHa1TQfUOy1fTj7IYNZrq8YeV7jvHAcUr0sl3yv/0w0+cBQyD8+AE6YGmWdurAfHk+AFZnRxuCcNHKhLDHQlrukRAaReqa+o0++JZh8qWyO9KhSfJy2ug5abGCi/A9L6gCuct6aB4lhNi9BhCgn+dsRXHwE8ADhW5Cr4Kz4jV4efDRxzdCgcGjS414NHdsFme+n1YoFKwFY+Hw9I9s3JR3E8LbjEwYzErVj8gDAklCdRX5EJKRtOEy6aoif2Mm5WLYbUar1nzNJluqdDcKCVGz0iwiAPF8JR+RPvhCaMYrhXDE+1kcwt2jcX8vHYkSGNBNcVf523lClfQrYMk7/JYjQQB8qHxsbg43Fr7LAOAwf47cgXA6DR2ctiAuTiBN9muf1rY7M8Ea6CkMa0PDvHEmDh9GHqv4q+JrI1X44vF/JuvL2QpxA8lTQ4eMBZwtcRUwnxwdHbUAuTTgPgQoNFDY4C/2C6g2ptLUiDUnEM4pRd3QBm9KRlpwA0TPg0fC7bHYCRARToCaw5YpGKpI94fZwSX8c3whG/CJxx1xRt/wbt0xtGte/JtdXguXOhHXbHlI35//A4AECTjT/QrrMnjGgfkoigVeFomTsvNn1hc4XMo4ODQsg5JCbHTI9mQcNsTqwCLfbjyoW1NbRvWkkTIL/XSyixK+fmh87w08WdgrRBT9wnQ6SWt0dWWPXg0s2srkwH0qDvJFdud9lQttxUrsX+s49e1Aqa+bL1N8YCznHkimebQb4vSrbyXUJqTowLxYbBIBi6ETt6MBcVOPSkV6eQJAzcH0c+8vgy6lbmzaSzQmFkSTR7Nt7VNUnXNFMpsCe7AwHsA5uLnUQPtL8lSFZRNez+mS4Ks0XZaahjEK2Rt2HtCcALAYzsLnPABbD5WozPfYAieywSViqUMGCTjwc046YpHd+thO7E6fO2e4aRgKUOPTmhTfa8FSQlvBpexeYeYmNZbNocooLNkRS+rJPFB1dWyQSL6HKS5ngDoA7Q2Wi/mekLbUhtwbnYqNcjdC+FdmOkcuIB8tQSrxM+03zM7/Xu+uuPPhog1/7UDASGacXhvZoAa0FPM0oGZ98Wg4+FZ+3toC7gKWFIfPOKZyOR2Zm/ml33679aWvMWQH10TcDCb3MyF110nY+0bbCNUfs71ZRYJ0MskFO4SbRaiW+43J09Gfz8P2B686aeBIRWKcMxEG8bh8peNZZaJm6pzpKtELpp2hXdX2pGmO+ga4NaAdFAMzw6XjYjVn9y9xuv7G2Jx+AenP8O1jHjrn3ArI7ZKguGtjD05FwCeyoR36YxJI16Z08PB3ZFntQ2YNw46RSqunw7QIaMkJXN3oKZEtO45gQqglVJxXxytIW9eWn6unYLSptRutdPZgnPaw51OrvOi8sDTJx7J0K2epoGEixkO2siHtEiS3tTHQ9vtzV1FSBXxUmwB4gW6ZlrzmRLbpk13sbAymDlHSRNj8rYHZ8Z1ZBm7OcMpzer8knc3R7v/26NHcUC4OoSrmlqUOe9eCbHrLSLfj+R9DdpPs8+5vhC6hQ6bQoW0hy1DV9ftgtzKhYMCCGyYaItpexysZrdj1VKUcg5Qrwz3GR0ti0YHBLfTx2NbWAWyRrhKJZ0H4I40m64KlOxwXQf8cnnEP3f/BoJkWyD8yE664qgrnNR+mkwacdINH/MRv9oeESTju5UKutHvi3SwP4tUxOixrA6ioPZl8dCVZaP+pTSmqvgRqtQ0KporitgD3PYev6cbt88tHlhfvQzTEZvppJGlXSjSfXKlWFLVZszhVXr8giTXKe8kozK8p0TpD//wTGWprBnVyKk6J1SlKnC7C4hH2tS2pGVNwPiBdCRNFf7CqR/NHzx18NUM08EeyS0FPleEpwg30zsB5sRTRnP6nOjq3zQsf5vri9mc3r4een1bHHed9bVg+Ni8tPgAOLtBeRTa53tm+mlkXdrqS+oXPKfXIntUg3GM6ujIMj14RraJoA4epZV5ieS88y/5WrbHCZdHjz+e3uLtcMGbcEWQjLf+CUsZ4KRgqw7v0xlLDfhuu8fHkYtj0tgXzVfjFVv2KBBs1qg/zRNu15EP2OKhV4dsjvB1qFAbPrZA0OEJezgnmH3I97b3Gg3RYrCNwN/YdPuZxm5SAX81zcfEEtUNNJsr3lnEmuXFxB09YkY6/z/jq41lMOzUkt4LgQulwcTbfYC/Ksrj2PuI0jzStmKmGJWGH5EM4PZ8xLODvxWUYeryiMZWpkkepdElEC6OR8H81qPK0Uy/az95ObPJhH3thEvj5y+UL8YCHj/lDk06AcZPFdMnwfguQjIx847JO6HyEJyxaC7AZqWZSp+7VGOINg0zlY0chullI1lyjtDLDfU6Q8cBMg2WQuUQjiNKOGO4FNw+eGj0eP9wwh8fv8bH8YI7t+A5sz8ZJGGrnsGfNeDBzz0I9JYHfExHKCreb0d8XA89GbcUTvfL4qBjhowZdVFAaXWTsyA8k8rdzORaGdVseHpNbloOfysQyzsEbD5g/CngxcPXrJxGwrNVFW7L8LN23+XWwOdREZ4TNHkrgwtRKXN9yRMn3I2ISDbDHqXRk8birvPXuHtuNVdIpmM5K7e4KYTMOAW32VR9y/yZADQV6tNtsbSj1c8Vh+82uFuzphRWFJNDmhycERyLIzl2eP78x/WzFomIfAPgf6m1/kMR+R8B/AMA/3Ot9Z/Y3/+Vr/3an9fo26lSKdc4Tp43x0X0hstfaREzproPom4JSFS4bSbsbyiMnynMCp82uOcVUgpLqy2iHif2KocROE7AvBIWtg9V14jp3cYo7BsftG1z2LJDrIof0rn7At+5BUsJuGSmVL2PJ/wpXmMtHgfHKf1aPG5pwHUbcF0GbJtHXklt12dPM7kiGJ4U8Z4MXoB557s/FmcVAOcgw/Zi5xZr3quZXb94aNpp4JaMqtxgysABXLlz3aW/eXxpkh/t0gC6azuML+cWblBi96ING91lRTkE6EzPrHQ/oYQB272iutD7Fxprk2oSLgRu3FoQ3i/wJyYJtE0t3gWagADmtcUZiV5IOdIlWRxgBeSMeCLtvkzMspG8h/b4JcM9bcjN/OFv0Y8An3+S/PcADiLyXwFwtdb/SET+JxH5NwH8u3/5a7XWP/61P61aLFdFV6txqPUCiUjcvaowXiwfSbvOB4d6A+rkzdqUxD9NZlqw5n12cgyEgK3PyUf6d/lUoJ8uhEpF0DIAYaeVv0QMTwEaaZb3R/Ub/L/DG/zpm1d4Nd7wZrzh3s8YNSFDsWbFJQ34+fSEdfMo1QRYEAya4F2Gc5y4iDP/3wK4Z4dwoU+YuzmEC5m84Yl9hlvYFI+fdkOG4gXhmjq0WQbt2u/G9G3hoc6CTv1sk++F5db4McHfyL4dPq6AjBzE2vyBZZTQL2zd1UlEtxSa7X7kBjKMpBDlinTnOjeKpnUVqKWjlm4u0KhmiZqR7gLymSzvdGQ55Cw7EZVUlmaAB5g028pmtxIebtGCFO1lTu5h79kqj3wK9PnaSGFp9JbPuX7jd4rIPwJwBfAXAP4Ae3jo/wpmt//Dv+Zrv36RmCa6xS2kSeFM/7G+pmKxYefNwoe6ZKawThbX4CyDvGkbah9MKfk8sWD44QMXgSr8DwUYyPsqb+5pKHEIKANtbSRniFEdTt8m+DnDzyPW7ydcfj/jB4tr8Fpw8is+piPW7OE142k74Gk7oEDwfj7i9gLJmteBZnggLQVJUAZzh5+YHFyd+V89s55uUtq24Lczddz8IRycaazwcyK6V2rH2ZJRVGjRtMOwnVB4JHmUcxLqMdLkoKbjqZ4083j2HdHyc0ZpdPcKEkgL6UGaClnEg7PG2eNw2bC9njB+e0U+DUhHngbrK8pv66OzENKKcHPGGKb0t2nn2XcSrm3RC2kaEM82L2p57YNYGeoADEbWLDtgYTQVP2db2NId8D/n+rWLREQGAP8tgP8SzG8/Afgz++v3AP6Dv+Frf93P+scA/jEATMMDhvcbP9ygKKPr/P/xw9pzEcm1IidnexgQLulHw61GcGtoja4ZaBY/wTIKpweKehJ9YGliV1gazCsUgPtwZf6hmcghF4TRQ3LB+MzXOH7ncNEzbvcjPpwPuDywzLoPC1IakapichFLDtiyQy7aRV3LbUBdHaOjI6MRwpPNY94Jxg9kzjaAojkTaobBnbXzr9LE07PAIhFsZ3excPiaCtyg1thy42h5LyUo4j13bU0jtnsPt3jEO/YXft7nCk1I1myQSjR9RmpNvOMCVfYgeXTwKSGfBxSniPe0/XH3E/uUUQGDgcsgQKzwM5Amlnvb2SEdAI3eIGVh9ns2/fycMSy8v/HoobEg2Mwj3jN2r7l/1qBk/RpvT3JlSfrxCowD4ldHyqv/VSwSAP8NgP+h1vpRiE1fABzs787gXvTXfe2vXLXWfwrgnwLA+dXfqdGYvJTr8nvcSravqJhARs3WRpFOrueLSEPFBvs3gcd3DdqFQOlI/YC2XiZX6BIhtpAYHV32nsQ7VO9QzhNj3XKBu0WM7z38rAg3h+HZI00e19cT/u83J/gp4XBc6eguFadpQy6C2zJieRqBqJBEtm4fApaXGvT91Ag3YHjOXXXXmuWGMPkbSwVOnCv8VoyqXjp13a8sNcI1IQ8WHze1hrc1K0QJdSsI1wx/TdSNH4h4+e82pLsBbhWzM239j0kQXsybUADYJBsiSAeHdHY9272dCjpnyq6ddoi2OjXkjIsBYKmpCZjeReulBP555XNSAHjlabUWal7a7OegPTjU3RJ1N+fQjQ7dkpEnhxAcNLJ573O6z7h+0yL5TwH8IxH5rwH8+wB+F8CfAvhnAP49AH8I4JdgifXya7/2akfrTrVWxpR513dMDpzazKQgPCWEi2WIm+gnT0Y5cXzD0ierBcNz6dwiFKBMDtkkm9xtPfRpRjmP0FmBlCEpw/3FB+6qpQAxYaj0jw2DIh2q0cEBREFWh0s6UAQ1O9zckTEMm8JvYvanJqktjQK/N+S6AeMzH3K6JaLv3NUJZNzBiE46TMVMrHfzvnZiVEFnVDeWL/uT2lWaAHq2CIyeno1wWFWQT3SX7OxdgSGIrR9w0I09gzMSols55BUDVqTCckqcVQQ7FaWFyrolwy0ZA4BwidDVGnfbHPLI/iQ+TrS5NTvchm76K0hBUVIMqlcsbwLwJnS1ZdPL+Jl0/YZ86ZZ/ZCjym65fu0hqrf9J+7OI/G8A/gsA/7uI/BaA/xzAf2i39i9/7ddeeVRcfz70ia9mQpvhWqzhA8qIXgZsDw5pFGgKcBEI10zRzpJ3OkIsQCqk0w+eLuTG2ZJaIXOBLAlwgnwcgFRQg81kVCGBpV15c9fz9nQm99x/WqGxwN88jt8rtrNieRWomT+gqw3LUHsUXXgWnhYRCE8Vft1j1prbfGtIdSOk20RE1eYPAE/Z7d6bBED7UFXT/m9gBgqa6AEguaAEq+MDvcqqFxRYUq2VpwRMbKc9cqjrZp4UHWoHvwcKOCvrAKBapDW8LQbbkDazeK3CnmG7Yz5Iy0JkH+b6xphs2Lc+cFForEQyN+7+ziDk0sw/rEra7qlHARgk1Bxh/K3A34D10XW4e35Lblc8cyYWj3v2zedcn93i11r/AABE5A8A/GcA/rta66e/6Wu/7tKt4vht5DTXHoY88IFsrigt77AKT4Z0cmbLyZIrnZzBgtxdW1kFhJ3SUcBdsIH2hwCJmfDhshEazhlQniQ1eKBQGgybvci8QbcIXUe4i0M+DgjPHuNHBtq0oVTx0gdsfqkIN6OZGN2cN3qvgxu1v80dJBXASTfnq567Z/F2ohqvKZ1puFC8AMaZyi2Oojf2rs8pihe4FsLZy9oXiJXnicigHUGqgXZBW0UWRbMZaq+5euVpNqhp6Pc+RjK9kf2Np6O7WQDs84pqkQkMLzW3Rg3woC69DZYBloj0HFaimY6LtgTpdrJN0665YvzEqXsbNvKU26FySaw8wjVBtgJvyNznXn/rYWKt9QN2NOtv/NpvuvLBNAUmutpOdtQmwK8FOQhRihsnteGS+3HrFkYyqKFTL29eq0N1zTxZWk3d+Vz2UB8HuPcXVDdALjdSFm4LkBIwjajHCWXyqMEBeuDPMkpLeNqgG3H5oYnH7AZ1op7pvAFj4yYa46n1DyiEs9PJ2ezCv+i1+PCX4HaqSaqGBHGCDiuPdhnt/pC1BUM9Ru7DvOoJYMSj7ydSQ4D4oQD0A8475OrZH5IUaTMtaQYPhN8bTEvjCIuEu3cob4OF8jDGu5Er0yQYP5YuDqOX1mDeBfxasRKQeSPo/evwXBAu5hl8SUZ2JR+r9V9VLd8G/J3hVmijWtDhafdT9wJuxyqdQcWYnYVuF7bD6sAjnmE9Cvi9RJDiiIBFZlZg8JA1mby3QMR3rynZklHoEyQmwDvku5E3dRpQx32YiJgA2MApJmhMgPVA1aLndDObo8CtnaYFrQQqKNEIdbn+iCrC6TRnCS6RiVyShXo2s4UWflleABq1Gk+Nq1Cvxexz0G1HUW0Cb2WW5GYbpP2E6A4pysUCqzbo8EhmLjcUNbo7X3tTLe4+Vi8809qmIHZ4Fbdr7J1084uuNLWFmYMgnrVvhJo8/2wLzi+7SAvY6TG77JjvJx12WFxtBtJdJSUwmSu1ZOTS52Vuk84J+5zry7CAi+mmjXOVJjGKiusmYi04Zg++4RS1jI5Kt8zypDGGy+BZazcI0HJBeu74xESsZiRBSSnLGtn47yQX4DYDIXS0q/3bdDfSCsnq4EbDaA23sxvrVw7wWo3eBlswMVKDt3sjvbFcbLtz211hZEbJ5GG1PqUF7+xCpP0Uk2L6mqA9Kq1FsVXZf79z0rUWzbg6lLr/nNUeaCEa195LswhqLvPsg6RbEDWwoEHO271DmPf77jbOU3giclDsb9kYu7vuh30jPzdGVGN3ykkV2fHza5w1txaKugxcoC7FouUsH5KhqrUziNPdTzx6AWBdLIXIQ0NW3Jz6ILCMrtvc5GlPR0IFcHTQ1bOps91XU4HcEmHCashXUMjg7MbTeUVmAbzCXXnqIGYg5W5JhFf3u5i8mHt+AAAgAElEQVTrBZgdPsxArRiop2LppgqYi2QZXDeXbqZuVe11JfY5jdOk0fIis7L9qejoDcVU+yCxivR+DHgxE7IeTGwjAcATzxZj87FqUt0ySodmSxDkSHo9vXaLnQj7kK0PZq0HLMbR0paIJQY+lIasCaC1D/0kA8NTRgli2qHaIet2jzv62Fspona6ZngjMAZQ5lCDM4CiEj4+hv67itkINaM694FsgskWlTTmQCnGsBC68nzm9cWMIGh8zKO/eblK5svxS+krvqWsNkO6KvKjhr964u0ZDjiH/jW3MPlKN8aCiXJHKpPvyI//tLLebgOnkiGXGfBMsq3Bc/E4h/j6yMVri6F6w+7t3xJqLkbtB3Uw5iwpjg9rKx9ZY5uZQ6RwqHqhtLjaKSfS+whJFnPdRe9Npy7Q3I5eLj4kW0TmP8YSR/vP51xhL1P6ZLsopOx8pzZ7qS+Q0mzQdFsoLf+ludhIgZEILSNxdB2IacPMcuRn0rzWmkZoty81Qwg7OcugkGPYN40X+vw9OjDvuvmjQ7yjapKGgeZk/9TYGHb6hp+4fFcTQ+6rE+o+VjZe1VPS2ZpETdV8aNmMSQLyUfuuVzzZn4064RZSJyTzQSuebOAWKFmC7rj5LULXiJoV+vyiJkicvNfDiGqDxjp5hHdXK+Uc0TCgL2SJNJtAYoZjDR71NPG1j86EZdpBhM6IbUQ8pQlfHRTZHujijWhYKsKcO9GwTBRBtblJPvi+E6c7kvvUqBcvXQo7WNAsfWQv7dLRkzI/7CUT7xMb8/4+zVy7NdLaAoJgpVcsHaWMU9Osaz9FNNYu5XVrZvKUU9P8AHkSxJOlnb2wOfWmF2qvrcsrWp8i6ARZKc0Nnw27xorwTAGWzpE93nlEOfzEbU7LYElXwYhr1my5i7FPDYUtToAiRl2R/RSxgSORGwC3HdHx19QRmzY7gRPOSIAf1aXIRuM+0JaoqqK+Pnd+DxyFO3rbeGKsEYhmPlErexZVwCnKGCCDRzlN9h4KS7HSpKbmY9xQMK8c4vmw1/+t7HjB5oUK4p3ftf+CH1mPylY6FUfW2jeEdnrk5sHrBNIQqH4K0kHFG6GwuCb5lZ5f0sq7tjg07yTaBnnvNHZDlHIrB3kC+lvuMDJgsLM45Mewm2iby4muzcXR4OtF+gZXJiJrTaLcXCibN0Jog9lSsT0Y6ukE65sA3TykHNAFWz/1YNFWpqAS7myngk4th49+si+VdpIALYUmdhUAuCuGa+IutuX+cDQpcPGKeqT9fn0Y+wPT2bHPK0uc28J6dd340Iug3h1RJjptlOPQ8+IRPMrge1AoAJYxMZMgmQvqcaRJAbAf61a7s6wrkK1Czaq1s1wN0gV2ryla8mCv5y2ioBral18aP49trlR/VJLyAwRPokH7CdLKnjwoy6JOZrR/UvZohaZApOHCbkDX0LteQjWSpLMJvTXRjWXRTK7dkhGeNoPmlaXpizlSDnwW8tSegwKZrcwbGkNDDEUTYOR8xZnFbGMtUO9vji4GyeeRlrefe30xZaLYoE3nulttzgl5InktR+1Ui3zgLleVD/nWosgcEG4kyA2X0ku1RnfZfx+9qZrhcjo6hOfKmt2a/HaV0UPXZJPqvQmHHCAbTSlQK9nDU7CHJu8PbkV3K2RaVOmS5Pbe3Zz7+2wzHk0JtRhJ0166bqy149HDqfA9GKXCzzYYs7hueIVYfLPeImUCL04RCPpD2KyK2k4fbjvtxS3lhZ2RwcYbE3gbTYin3O44ku6M0S3YTSFUMDxnE3YVqHHsfKRlUTl7lDCgOdo3NFNjxfB+QbiuLCdMAlEnft7lQMlEMmP0drr6G7ls/hqpinw19v6vaYzK6Bh17qRrVT7n+jIQcJs+l10cxAnuQGz9BSbu1sLIOBP5EAMX1vlKA7t0ZKNbRqAmPhBuLZ0GDqDLeYtXaNYd8m2vKRJmdu8vqN5BnaJMA8smEM2SjSWbPjN+rtW4ACAzTSfKFAhTjjS+K4NQs/6CTlIG17NVZCvQLbLkCGLyWqO4S/uMLLqguA55VxXUyfVZAgDIwKa4HAMaVcXNmTOdVqLZhL7NcvK4Uz20zaQAQ+z0xRxEkMf9+zqPKjV+GE+IcKn99aESgkZpEPV+0riloCpnGG7O3fWmfT5lOO7v0xjhXS58jTjOiS471idWAfKJMdht6i6h2mI3NaW915fZOJ9zfTFzOmewY8PGNVLrUB1vKP2Rdue+eOf6gEu3HVIMnzb4WfvOwA9T9iy/0fWvt14CmTtyddxpUQphXwXy3T2Zwt4enmbZmSvqSFpLuTvw+4ND8QZZH3yfhDe5bBvGNWUh3wvjqJshtQjMBT8Z1NrgUfu9kE78A9pmwtfmlxe7oYK6EpUenQahv29ratUGdM0pvlsRWa9XvPYTEL5R8YEWY92yFouDOWiyL2nDRqoj7eWYo3yzle16li2jLrxHmovRTbSzB0qmcWATgGkq0Oe1z5aqoYb54JFtQbQTWzIDa5vwqi8Eg42JtNmmFn/iJ0nD6nlzmFJVvACnPQ+v7Xx+zjaF3ecBxZCidPLII93LW8nW2KZ+4fQ1XJPtxjwpyosHTpcdK5eFp4J/t5HyMQ5swpWnSL7zNJXA3hg3tqxGg1cNaCrGZ2qa7WakwMwUQDftSFtjLhevHXCojk29A2vzakiOe9FEQ6kNb71MVYF6m9jb6ZKHdoLBfn+DlUF1ZDZI1FzgUanvqMo6vmlb+mRdgZLp6VWJqewafANT1PhSGktH2TQXuqQ4szm13iyPjuwDEWjmQmn+vjyl+L35OPTngaOCQk+2OfWKooqgDsxzhwz9OVIDczjY1Q6A/OTRLcmMG0YB3GWD5Ix8HvfpedAO46npRIoNoOBIKdAtw3vF9jgaLbr+FcO7NujTORL/V85EAKDl68F2UgTPPPjJJrHB738HIHx/g2yxl2k1eNQp2AlDfUQNinRw2O4U8bQjVMMzM0sa8sQQTwvIMboKKuHwRk0HeNI4Q3pUSCmXmJHux94vUOFpM49WKr2wzKlqSJa5ZnZ6iSFKrbfrpoDWWDeafbZGP3OWiUYpgpVabRhI7hYBl6qC7Z4neZo4q/DLQFDgyplQ+LhyoOcV7tMV+fWpD5WlNDjcqoBmLFHBnmOOhNYBQBVp8gZo6H5aeenCK/e8oo4OPigZ41vupfPnXF8oxEeQmkYZ+03JB84A0smh2ZfGe9dvlp+bFU2ExATdIiZbALI2bYHt2ocBudHGj4zDllS445cCWTjPkHlDuT+QGjIEPmCVpVVT+knM+4LxDnXgkV9smp/NU2r+KiCeBOsrQZpA/X4C0pkeuC0TcrtTg0YrJteGpuQiNbIgPxigKF9DOniWEP4Feuf2Zrp5BTTdedvFW7NeSxt60tMMsBOvZbZPtngcbMeviAfpvUA7UboupDfp9vpjo/4D/pLgncBfE/LRE8UCkE6BenPvkI+BsPOgGI6e8xFzSJE1cwHZPcstvcyxjPZbwh4kWjoUni0qrn2vu1aIAnV0SPcj4ok5lx6AewGm/Kbri9FSqtXkNSjyOBJrt51KMgC1iezyIqRSiXTNv3uHZso8v1asj8T1/Y20jnA184RqNeqSoFfuHGUMnIecR/YXZ4u5FoEsK+Q6oxbjPZ0OqKcD8t1IHfzgu+wXGKGFlBPZHOpsAqnFIY8O8U6QJpY6w0crVV7YjzY6RzInkWYG3RpxNX1EdcB2DGg+ZG2yTLUeYXC3FaORa3dslGKDuJllUx6k9xad02QoVMuXdFtFPJGCDthDGQDojlpphj2gJhxL1WTGvK9uzn2zW95aLMZxQngy7Y+hcm6OCO1BVUDXAenExRDvB8LSLV7PGnZJ/Hc12NFmGpNk+pQGUfM+2AxtzdBlg1fdzR8qmRefe33R6AWplc7wMUOtEQYAOQ+95m47Ybe9SYwpllwQniLCEw0GdCsUBBVYOWTDuqDIhwA1dEoyJ71IGXUcoHFDOfL31eOI8nDsbNESXEdWdMssrURQ7w4kSwbOVMpAuTDdzAXxLKhqtXkGygBgA2oAUgCW19I3A9qJ2sJpMGgC061gfYRVFm1qDqCXWI0mD5tQS6YhRFMDlmGfWwBtAIfeBPOEIHLVmnCCBkCeXgAeps9pPUhjKVcVZLU/O6OR2IBweKYdlH/eOvW/cbdqcCjHQMm1IXqADZWvEcFAFllfnOIv9OrVgBZGUFS4NfXfHT4xl0af5n76N81N9Yo6KPTpJ84CbtTqKrszePVq7h5tEMTvbVg+QBSjTILtfkQJYN0P3tzhmclKbmPd6+cMFZucD9xtqgw7tLwQVpYbA35cYgkm8wZJmR5dA3le6UjqTEv37e9DTduyAu4qkDTCz459yQPoiJIFdayMfnPtAaU+X1fSagAKtX68w++/pzXDbs5m3dme+PbQ7qyFZj3aPHslVRrXlb3E6q7xDXSQ/WErbqeXx8I0MLKTd/+vzsBFg4PZYzXEsdFmqsUm5FOgfdDJwytLJqycXaDsnyNEdh8CgII4EVRvnlqjR7N/IowufUDaeV6hooQD6ShGZtTb1iXOfk6Mj7Pwp8+5vtBJwjKj2e2/nBBLqqQegCVC0yWkg/bvGz+xQT//WelUFWeMWAA7H6pFmRlPqhlri9WyjYPlzFQNAOppQk2Fzbg12v6a6G4freETQY3KutbQr3SkO8h2Niw+m0u97bK9efZAOoIQsAMg2ssdlpuVJ2auHdFJRzN4lr90u+zGF4Nz26KpDiii5hbPByUPu6dZcSyVqttpPlX24WCDVfvv0P2/2uFsLqwWBFsCDRr0xRC3ZIN6N5IYnbEGtIWGdqY1Yziqs6xMg8PF6P7IxqSwUUHX4GuD3HfwQjJpMCy/WIbFc2DU3UAE1YUf+4n9puvLoFupYnyf4GY68YlJZtMDp6TNDFuKdH6XJurEpVQMn1481IMiG7W92qKSQpp4OrCxdZvrGhZdE2Otlw3lOBHROpJ+0kyVIYbFm3Ng8dKlp40O32FKWzxuFrhRMYAoUzzvwzdSNOx0UJ6UZahws5U5o6De+KD72dwbPeCiGH+p7mVTe6gbVaTJbg/SH+LWZPfhpdvnHSQ+2usSg3K99NBRCBDND5hlo/3MADuhwBg67EidmOMkoNBEK1O3lR+hS5IzyokIpq6596P9mbDJPrNqbHAcrcQNjvC7UVDUvqdJEFqpUVq8tak13fMCJxSfpYcRcnLw14zw8S+FO/2G64s17nlUaFTWpZ5eSvGOJsnp0GYoL6ajFZ2pCiWTGKkAUYDJQ7cMd1mZcjVvQCmohwFNrVg9Ke9wgjqYLFcEFaFLc+W2sil3CjgHPU6oE00l3JIgc+SC3mI/hcS08eqTaThY52+vCvK5AL4YX0MAX4EiyAcrfUbA36wEs506j0zS1SSgiAo2pTaNWeED22DcbA13c3f0S+lNb3XSP7NmBFc8EK38Kp4nW2+614p0EoRLM31jP1XCixK5PdfVFoYtnNZcN+ltnhT1kRT3cBd4ApjYK00O4ZLgrxEtMSsfiHBpsrAdR0FWc2GhYUaC3lLvj1wru5xHGSgB53xKqXL1XJAtjsPfrBd7IeP+nOvLLBIF6eCDTcpNLNOFPDZ0arMSZm1QI+JnMDTU6OnlZAxer0ivjtyBJt9Zt+66oUIBpV4C1QRC1pCLE8THCW72dsOP+y5mU2//vBINGf+/9s4t1LItveu/b1zmnOuyd52qc/ockiheIC8hRNAgiTdaSVTUJwlG8AJGyUuSF1+CRAUfIj4JIvjQIBIfFFrFoKJ0IqjdirfkJebVS2NCutN9TlXtvdda8zLG+Hz4xphrd506VefI6dq7w/6gqF2zaq81au055vgu/4tHJcAm2sTdy2oroM7IUcvW1ZsTSqrv5RWi4rqMFiEdHRoVfzRariRry5ogQi2Ma5Gstwx2pNIHtFKe2xwmd7KqkSy4OgQ8S4224t8UTM7DPxCygE+m+tI2Q9ra5soD5yEe9ftqd07SuS5RT3X9rV2vMa+MR0N3Gw6rgT7bjGi57GqLvVTJn4Q/zpWp2VI/w8nZ+zjTAlBdrc3dKTFUKaOubjRfO1tS76XS+9UIyJR2Pv6MBO4QBSxJVwGyEk3pe3rkCWMjJcmK3PTHBMUTjom8CTYt3VgRp15WLSh/Mv9xmTLuMOJuqZ8U7yldXJG2WkFuLtXjebIJrzvOdsLUCe4KdKwCeGBPNBVBHLibcS0m0Uskdyy7OtUeMm7IdH3C+8K2n5mWwNXscH0mxQh4y+2jkDdKOp057unKpuErZ2Y2fjawcsnXLlZNh8JoKZxLtfaoUJ6WVoGS+3PXrFm5NRBo6UCmb6w9btckK+zEnbkn2tTscxXWXoGbgqrg6qlbotUVufeEpawbxP6yTkxrqmt040zx4TwTqTguapeqzbxYbHGrosoQTJy7vp9Lhg8LaiIeMi2kR01P8fVxZycJsE6cmzy/6SblVeig+fuVzrNchqrM6Aj176VoJf+rQR/q6QHWzm0tZUsVzrCPVtBrdA2xbyoaIpS3d8bwgxWW3tam0eGOdepeCjSkLEDfUQZP8/1Tr0hQvC+EYJ226O33666YoF7XRB1qm7XCTSRBE7Cjom1b67U9tZvLlPrzDQ2129XkUeU86yix1SttZqKryMPq+tTq6fY+FWG7tnuLvYZbWitZ1+8roXYfqx31WmOkYg+V9lBarGPVFGCgkr4qTKV13VqmIKUghwokdQ6p6a+BIP2Z91+L+u4qrZu14bNKH9De1aYQJox+i5D2urizwj0e0wpLMBCirPlpo382AxY/JsLB7IqlRLqnk0FUGvZLKnejbjrJtb6IwaDWIjYDGYJhpOSstNFOMbC0rkFe5Gg2U37br+1HUVZ7OclqTMRpsRrmNBG94OaBZTdwGIV88pQuk5InhMySzSdRF0fOYl7vt5osBjK0tnHjlauzzdK6SCtPPdjNmjvOJ0L9/+ehKbhgVnj51mZq9/WtWUc7kQyAWWuMckYN2N9r3aCmTOky5gAsdgKBWUM0Kq5LyvQ4Ek63aAJ1RlEqvdrN2eq8eqK4TTAn3VsaXRoc9FZz0oa3Cv5mwnX19hWpnSxZ0cTxWiFW0ZBU8JOsnopyGCHsP/b9endqKbM9YYoLSHZr7h2OC25piLxKljnOxgVYauq0CTVlq/bVFUksNyd0NxhYscLpdduvT40SLGWSm5lwLWsnqyl1aLDXLn2gPNkYg65JjR4zaKpzG4/kqnTYJIn6zuAvrmKaktUbJTn8sBB9JvrMNi6kJyaknZJj8j3MjrwRtCrNl4MNGP1cyWhZVm5EGbDW8q0bWxsU51b90GqQVpyvYEVHrTXEhoW1IF8lhCKrYHerjYzIJWg8n3Jwbqh8wwnkzqdUm5s0iImdiAUZzF68UQ1K55HoWS4isq+MQrE1qjc9YEo9GUTW3+1NK+c9F9yoBGkqNrX7VZmIooq/mpBxAudWNuXHibuh7wZnjDq3MdxTVwdEUVj2ccVgaXBmZ0a3Qt5LNJddPGhvr5P7KnUzb2rxP6xtxsYZae3KM96nanblAro5c0NUTX9LBN0N5F23ciPcLXi1egEfkLHOXEqdfNd83yUgCzo7lsXjXVl93KcxEjvbZHG3kKJHkzPvktGTh9pd6q0msYJZ1qf/KpNUISOWh9u/y4O1c8F+91NNhWq61eDst4eVjYRVot34edNey06Q5leiQXEqaE3pmhCEIRIgx3piLSBUXnvDvmUo+77ONSytWi77Vc60ASzDoar7N3khEbupB4deDHby944whm9ADVuTIK9dqzbBt/9XpUQ83hCuxNrK932TQF14HZgZnbSqW4SmJK8VrBZwvhjGKZmmbHdVVsPKRrohFdxxQvtgwg7zYtx154xyO4TKcowGQa8dEzcl8jbaE6gyD6UoLAu66eyHuA0VF147LjnZZH5J6M1hNf9xzkHq8Y+jDUSdIrHgnJKyW33c0+LJdVPkU33tLLhhIWtNbYqwXLb5RjtRWCfUeivdus3j8JOus5WmXp87SPVG1jrQ1MU2Tx5u1RUZpncy8blRF+a3M9qV80nRZfRkGskt7ZJShcE3dYOdzEHXz4X5Ilhd9aJaYkUHxKvJpuGPTYlm2Z+xW+qM5pCjM/RzVtz1iAfk8cacq/Ym8qG9X02NmvxSc+vyY175OBqE+e2t/Uz7+75Jbg+xNmbmEkatE/eCL2dVRCuqLfdtOlJp8HgRPOCuJ3vyVONK7QL5nUsrAqNJbpZatJXOmd3xKJabFkXmtOLHyKVKCDnwpu6Yt4E0eLNGbnzq0OOdQ1NB+u6skNJbkR9uMv1Tc+JKc8f4RAh9phRHCBkfCuIKfZ8Iu5FxjqhCCIXZe5JEtFhHTkO96Wu3ylx6zx+lwVxAbtFgoZ5CXdsIsOzAd7aZ0s5ypLTT85DRUatx2zha6xAjyAiSxAr30eFmqQX8Ob9rOK7iG+DRfqbWoayfXf1sc1+VJfeBsItMb8V6Msl6EpjhkJkq+adHq/uWBDEYssI3uaVziufqQ9ONmbwJq85xGyqHm0xjOn6SuLPCPZzyqnuV9h0lCvM+kPbenK/mOqHuhP5psqL6mFcgo9F1PcvlRf2BCmHMKwiwKc5313Ntd97qbi2ZsusgF0rXMz82rkPxQv90Mpmjm9ng1jcz4Wk2VuJpoew7SwVjtSAbs0Hsa1FZtsHWejKj0BIhLw4ZEs4VIzu5wn47MadgxfzSTiIlzcEoyIsx/4qr6N869JMMEm3DnNMd1ul+6YS0NVxY6Vhlf3DnVMjNdk0WIFp7r2xqodFnSiigAdkns5XIYrMmOdc9TdC8hSnoK2HU1W8dsNrz+RHtoqGpq9CgS8p8acPDeGPi4m7Oq1OWBptv5N4zP3lM46zk3tLO/qk7p1o3mbIJLI86ju+GVX7Iz2re8VOFD1V/FEmFtL/vCo7OukNlE8wmrD7phw9S7WBVdl7vTf6/2DHaaLwm6GYbYfjVa4Oxzwk5jpTdxj6QLqy5u/Gi52r7ZuhPn6y9qNEznNKZK103hiR73+YF6I4zzAt+nIyQ1VQTYzCrhqGj9LHWVsYXKb4+2SsiWAT6uDDPnnGOeF/I2QhXeXaMs0ez4G5ssBmurdbIg204+7/UjzBDOJyLbFNUqV2nmlat2rkBcm+bIQ9K2ipebOKvzjaLzBVKrwFJgpuF/DyeTy6x12nt5tJX2FCwOixvqi1b9LjkCKdo2cGibLOd8pIL8dmI25jBzma0btP8ZICiLI/iarfQ0ulQCu7ZjaW0paB9R3rHOlPLPlhq1Xu7f75yID6PuDmRLvp1GJ03dn+Fp6dqMNuvmgcfJ+6MmehvbGqOQnIGWzBvPFd79PXGql2wDkPu+jl+Q7GWd936VJCyI23sqdzEk/2YTHWxNzNKlzpkKaR9JNxYF8zckIwK6q8qrmde0IstOCHtO5aLWHkbhgtys3Hy3XEBn5Fxxi12BwXvCKduTYVIjlKsgE/JkaZAm8CFkMnZ4Xym6zLTGMmxIKKMvkP7goyeZV8L6HTWxHIX58/U7OSMvJUHtZt8UPwkK25MfUUle60QE0U7NQ3dodj0/3KmLB49etzjGecKpdg8qe8T06FDR49UXJnBRqTyTKoqTTKvmYYdW+dVUaockFvTq+4pqyYYGAgyV30D76oPYxUrl8WAp2nj6Z5NdM3Wb06145jRRz3FxXVG1Jy5QmXANv00ufewlFJnGdNsjlL1iRfUELmrIkgVpW6cDUlGsmkgxrYBmid4uJ5wS20vHiZWa+reNpHb9qvAQ+4cPtYpbX3t5uaKCHI44essBsA/2q1WDya4gP2Axhlt4tqq6xAz30qFcErJQtdbuuViwfnCfmOzmHkOdF1m0y1rSjbPgXmbka7YTZ0t15GpDkCr7i7N+88p2VmObqmXTc81WH2RLmoBm6A8SrbmTSbuZ9Ic6IeFZQq8/eSGZ1dbFlF2u3Htyk1zIMbE5KwFJtnhx9pAmKRuwPMAUr2wbMzTMRxNodOUOQ0BHo6166hGkGrTclkK9J4cBJWwClnYBsyr/2LpKvZu3YAelvp+04Kb1ATMryfyvjf813E06VrnVjj+x4m74ZNEx/TuDthZ7ln5I8ULcahDpNonD1nxqbYSsz3Bw82MjOksJucd6pq9gtUP+dHGCnCAYlCSMkTccSE8P7C7MTCjxgBNPb4CH9V75L0npIveNtyUcDcn5DgicmkDRRHy5QD7fvVEaazB3ButN5ygXNVBFzBqh482eHBOURV23YzbK94VOp/pfOYwdbh+YT4Y14bZ4Q+1blnO3cCmXNJmIkayMkxV7mwjNbiKqKwoZEZnm6sIefHoyTMDzivvP93jfYHZcTz2aC1CtEDJDl3se9Ub4xGn5N5OrNzB+LZxe4oXYoXTmLq9bYo4ZSAQrxbS3sCtzaraZlCO+MweHqYiY7Vlg72LKvH5sv5cV/pDnZ00FZyb3zTUh+dQlWV6thVinzeR+z9xz2oYmso+K73xtxu3RCqRhgo10VCFIKK1JpdHPbLvkDSsiFHJSvfUPlwpir+eWfVw6+mg3qG9J799wfSkp/9gorn/SlN1n/PKoLM2tSP7zqi7XSRXEQatp5CfskkJ1dMwd45l58j9eZAnSZDRTrBUXXhPgyNnx2mOLItN5IduQVUoKlZrdxlxStklclSb0F970mUtiqvGmDo9g0aTrMQrjYoGG1BqV1VKZkG22TpzXWHYzowCw2YmV5V7VSAoIZ6ftqUI3pc60zm3w433wargot7s2SQbUDL3ILkCGxcr7pddrRV685eM84yb/Vn9/RapqjRNraFBkez+MeiJpaCuOg9TIUxuzvi5gisnrQjghD8YOhy4/5JCrdtUumpNUJo6B6tWrd2IwoIVefOjQDgYwaZ/f7bTZE6Eq4rwXTJyc0SHHrwjXw6kapLZvM5L7wmHBXczsjnOZtQDdpKkvEqY+rRU9XnBLc5Sq+Zv0FIAAAp8SURBVK9dIaeJkDKlpm1twGl2dYG0MUG66S3j3Zce0qCUbUFjQfpMiJllDIQ+0/cLu37GbZVcHG8Npi96M/cEV5jn6tEBpKUSjDbF8tI63COoNQZcpbRmA0hqsI6OGxJl8fg+kyePRnC+oOrOm0AhZ4f3hfHU2XXFoDNVpNh7xTlFRGtNk613UWsddzJ7OEv1agfqmZ0k3aGsnP3uasE/inTPprNyZjGle1Ezf+2eTqu6ZTws56e/s7pEUjEDVG8Pq3kf13/vUlVLcQYMVQFxVYnGC6L2FPjUNomIBOB/1V8APwH8EPDHgP+mqj9W/93fePHaK0Owp7cq0qQzhXXK2k4TFbNHEFXcbKlP6attWnDIIVH2O/v+zuMaBD5Yzhmnqs+binHau7h2sZYnW+Kz0XLhTcAfF5pIdu5juzfwxxn/9GA5fEq1S2PiZ3gh177/sq8q9vuzD7s0xVIFstipoIJ4xflC9Jnnhw3TKeJD4frUr7MUgGUOOKd0/YKrnbB8CvghG+sP0OQMgp8FLWKFudM1//LBPl/nMxqhjIHQZbKDEDPvXt7wdbfjnf2B0xK52EyIKM+c8tb+iKrgXWFcAkNM5OyYgTI38KgBwMpQKJNfp/fN17CJ8M2XVaSi65gurQ08PfLEY6kaalbMh1Mh7eJKPWiAzrSRSiNQ85lUc9/1h5nYPGacUHY9Mqcz3q0pNzoh9JEyQNp3dJ/iSfI9wD9W1Z+sm+F3YXbUvxv46yLyA8DTF6+p6r991Ys2qmiOjiYknbbW2m0Dv6Zs4Zv6yC7gerNILl1V7HtnQ9q6lXi0/bUTzSDGLU0jS624PhxxQ2+txD7ijwtyGJEYcMfJ/BJVwTtcDPVE2ljt8XhnYhWnbpXmafI2ZxsIIzblTlj2sOytHtBoT30pdkMXBU6eeXEcnZKTs8Fhzf2HbiEGq01ydvQx8dsev89Xjxdcjz2TL2yHmeNoKUwODgFyK+AFZHE2Kfd2A4uzQSUq+P1M3y/kkK32wFKp0xK5Og6kqgy/XPe8X7+OXaqyvJ55DJTFrwNGS+UUUuXQNKwYFRJThe/CWPCnwvDVI/HtDf1XbugvTLHGXY/k+BZpXynTuXXyTOwuHBIuxRX27pbCfBmtG+r61cOlTdXZROaLai46NeCqdcGkyiytYucfI163Sb4P+BMi8geB/4F5tP8zVVUR+QJmSf38JddeuUlEtbbmqrxnKuZcVfFTWtGdaeuNmLOYmny8se/ffHXCHRf802vK5dYK7XqElq3hvE6/9WIdSnbPE/70qILcRuQ04YtBrzU4iH59CqWLbjWHkaXgrk7I1Q2qCjFStj3TuxvmR4FlIyvFdbmAtK01QIOSL4ZnQqzVKqLEIZFjwYdMFxNE0I2lO0O34J2SizBj7WIRz1ePFxynzgr92hHrukRKHpHMdphJxTF20dq1WdjuZkSU3/zWM75+3DGExAeHLaWInQZTZLudWLInJc8QEhePn/Pr13ve2R94thu4HCZOS0REGUJiExa+nB3LHPChMPoeX9PGZQ5MfYcMmfJ+JD63B6AfoX+WVhu4JleaL3qmt62+i9c9h2/vyLGqQ9YTYLr0xFNBfaz6YJ6SFSmetHW4dEaOx+vFGjSTcYL8ex3h0FRvhPHdnu2Xq5bzXM4uAZ/CJvnvwA+o6q+JyD8ENnWjAHwAvIdZVP7PF659eGOI/CjwowD98JYNEaNDSqTp/bpK30RYn9INg2NFdZ1TzBl3nGCckO3Q3gDmxdRnJuuPN4X49QNpXazgyY+3uJvZULx1g7nrkTifDUqN4FNgu0G3A3kbOX7HlvGxY3psRWnpIHd2apRO0U22zlFv1exwMeF9wbvC463VHGMKiCjftrtizJGbuV+5JpuwMGdPVkcughPofKZ0C+McmZbA0C2I2KZrXbK1C5UtnbMNBlfTwLjUh05ypCWw241MtTmggPeFonaadCFzXGJFA1SLaVHm7OmcQWtydoY9O3hyEk4He/1w5SlHZ3z/uQpeOEurShC6G0G0q0PAYlPxMRM/ODLsA806LozZWvSzrsPTBmZ0sw0mw6ms6Itcmy+NGBa8pb4thVs5Mw5KZ7oFuv301FJ+SVWn+vUvABHbKAB7e1tuXnLtQ6GqnwM+B3B58R3qp7LONiQVa7c2cYembbuw8g5i701Cv7rNagxwsWN5sjVBAQW/iWdGYTAPijA64mh6W4CZ8KSMO86440hxoH00rsOuN4G0OkdRJ3TPepPJjDbotL+DNMByoZRerYvUF9wm0XWJUoSSPdrorQquYjiiz4wp0PvMMXXczD1z9hzmiHfKFAJjCnQ+c5o6QsjsKnuwqFCKowvZNkWwG/jRZiQVx7X0+O1EKo7LYcKJ8p2PvsavHN7CO9uox6mz79+N7PqZi27iJvRr0+BXnj/ivf2RlD19SOQlosAQEt4ZgSwnh/OFaedxMRO6bKDNxcEukbAhUfe8wvNFbhHGqiDHnFGJpjuWygpVAQjXMy76NfUu1Vw0bR2uE8KNed034YiwtGJdrGZcMirDCv8Pp1K1ERz+ONtpdvr4uluir+gXi8jngZ8Gfhn4eeDfA++q6o+LyF8Avg34j8Cfun1NVf/mK99U5GvAAfj6x17p3cY7PKz1mxF3vdbfoqqfed0/et0m+W7gH2FNmn8B/DXgS9ip8kfrry+/eE1V//dr31jkF1T1e1///7j7eFjrNye+Vdb6ynRLVX8Z63CtUTtafxz4O20zvOzaQzzEb5T4xMNEVT0B//R11x7iIX6jxCdjn3y68bk7fO9PGg9r/ebEt8RaX1mTPMRDPMTdniQP8RDfEvGwSR7imx4i8kREflBE3rnrtfz/xBvfJCLy90XkP4vIX33T7/26EJH3RORL9esoIv9SRP6TiPzIR127gzU+EpF/IyI/JyL/XES6l32m9+VzFpHHwL/CsH3/TkQ+c5/X+7J4o5tERP4k4FX1+4HfLiLf+Sbf/1VRf5g/A1RYMT8B/KKq/l7gh0Tk4iOuven4M8DfVtU/DHwF+NO88Jnes8/5e4C/rKo/DXwB+EP3fL0fijd9knwW+Hz9+ucw9PB9iQz8MHBV//xZzmv9IvC9H3HtjYaq/j1V/fn6x88Af5YPf6affcm1OwlV/Q+q+l9E5A9gp8kfecnaPvuSa/cm3vQm2QG/Wr/+SDDkXYSqXqnq81uXXrbWe7N+Efl+4DHwf1+ypnuzTgAREewB9BTDVN7r9b4Yb3qTfCww5D2Jl631XqxfRJ4Afxf4kY9Y071YZwu1+DHgl4Dfwz1f74vxphfzi5yP0t8B/J83/P6fJF621jtfv4h0wD8B/oqqfvkj1nTn62whIj8pIn++/vEt4G9xj9f7snjTHPefBb4kIt+OkbO+7w2//yeJnwH+tYj8fuC7gP+KpQQvXnvT8ReB3wn8lIj8FPAPgD/3wmeq3J/P+XPA50XkL2Fo8p8FvniP1/uheOMT99pF+kHgi6r6lTf65p8w6g/t9wFfaPXKy67ddbzsM73Pn/O33HofYCkP8RCvjntVID3EQ9zHeNgkD/EQr4mHTfIQD/GaeNgkD/EQr4mHTfIQD/Ga+H8PAXeZZwFMcgAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "pl.imshow(img20)" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "pl.imshow(img50)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.4" } }, "nbformat": 4, "nbformat_minor": 1 } ================================================ FILE: 4.scipy/4.scipy-stats.ipynb ================================================ { "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import pylab as pl\n", "from scipy import stats" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "import matplotlib as mpl\n", "mpl.rcParams['font.sans-serif'] = ['SimHei']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 统计-stats" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 连续概率分布" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "['ksone',\n", " 'kstwobign',\n", " 'norm',\n", " 'alpha',\n", " 'anglit',\n", " 'arcsine',\n", " 'beta',\n", " 'betaprime',\n", " 'bradford',\n", " 'burr',\n", " 'burr12',\n", " 'fisk',\n", " 'cauchy',\n", " 'chi',\n", " 'chi2',\n", " 'cosine',\n", " 'dgamma',\n", " 'dweibull',\n", " 'expon',\n", " 'exponnorm',\n", " 'exponweib',\n", " 'exponpow',\n", " 'fatiguelife',\n", " 'foldcauchy',\n", " 'f',\n", " 'foldnorm',\n", " 'weibull_min',\n", " 'weibull_max',\n", " 'frechet_r',\n", " 'frechet_l',\n", " 'genlogistic',\n", " 'genpareto',\n", " 'genexpon',\n", " 'genextreme',\n", " 'gamma',\n", " 'erlang',\n", " 'gengamma',\n", " 'genhalflogistic',\n", " 'gompertz',\n", " 'gumbel_r',\n", " 'gumbel_l',\n", " 'halfcauchy',\n", " 'halflogistic',\n", " 'halfnorm',\n", " 'hypsecant',\n", " 'gausshyper',\n", " 'invgamma',\n", " 'invgauss',\n", " 'invweibull',\n", " 'johnsonsb',\n", " 'johnsonsu',\n", " 'laplace',\n", " 'levy',\n", " 'levy_l',\n", " 'levy_stable',\n", " 'logistic',\n", " 'loggamma',\n", " 'loglaplace',\n", " 'lognorm',\n", " 'gilbrat',\n", " 'maxwell',\n", " 'mielke',\n", " 'kappa4',\n", " 'kappa3',\n", " 'nakagami',\n", " 'ncx2',\n", " 'ncf',\n", " 't',\n", " 'nct',\n", " 'pareto',\n", " 'lomax',\n", " 'pearson3',\n", " 'powerlaw',\n", " 'powerlognorm',\n", " 'powernorm',\n", " 'rdist',\n", " 'rayleigh',\n", " 'reciprocal',\n", " 'rice',\n", " 'recipinvgauss',\n", " 'semicircular',\n", " 'skewnorm',\n", " 'trapz',\n", " 'triang',\n", " 'truncexpon',\n", " 'truncnorm',\n", " 'tukeylambda',\n", " 'uniform',\n", " 'vonmises',\n", " 'vonmises_line',\n", " 'wald',\n", " 'wrapcauchy',\n", " 'gennorm',\n", " 'halfgennorm',\n", " 'crystalball',\n", " 'argus']" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from scipy import stats\n", "[k for k, v in stats.__dict__.items() if isinstance(v, stats.rv_continuous)]" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(array(0.), array(1.))" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "stats.norm.stats()" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(array(1.), array(4.))" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X = stats.norm(loc=1.0, scale=2.0)\n", "X.stats()" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(1.0048352738823323, 3.9372117720073554)" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x = X.rvs(size=10000) # 对随机变量取10000个值\n", "np.mean(x), np.var(x) # 期望值和方差" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(1.0048352738823323, 1.984240855341749)" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "stats.norm.fit(x) # 得到随机序列期望值和标准差" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "max pdf error: 0.018998755595167102, max cdf error: 0.018503342378306975\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\ipykernel_launcher.py:1: VisibleDeprecationWarning: Passing `normed=True` on non-uniform bins has always been broken, and computes neither the probability density function nor the probability mass function. The result is only correct if the bins are uniform, when density=True will produce the same result anyway. The argument will be removed in a future version of numpy.\n", " \"\"\"Entry point for launching an IPython kernel.\n" ] } ], "source": [ "pdf, t = np.histogram(x, bins=100, normed=True) #❶\n", "t = (t[:-1] + t[1:]) * 0.5 #❷\n", "cdf = np.cumsum(pdf) * (t[1] - t[0]) #❸\n", "p_error = pdf - X.pdf(t)\n", "c_error = cdf - X.cdf(t)\n", "print (\"max pdf error: {}, max cdf error: {}\".format(\n", " np.abs(p_error).max(),\n", " np.abs(c_error).max()))" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#%figonly=正态分布的概率密度函数(左)和累积分布函数(右)\n", "fig, (ax1, ax2) = pl.subplots(1, 2, figsize=(7, 2))\n", "ax1.plot(t, pdf, label=u\"统计值\")\n", "ax1.plot(t, X.pdf(t), label=u\"理论值\", alpha=0.6)\n", "ax1.legend(loc=\"best\")\n", "ax2.plot(t, cdf)\n", "ax2.plot(t, X.cdf(t), alpha=0.6); " ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(array(1.), array(1.))\n", "(array(2.), array(2.))\n" ] } ], "source": [ "print(stats.gamma.stats(1.0))\n", "print(stats.gamma.stats(2.0))" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(array(4.), array(8.))" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "stats.gamma.stats(2.0, scale=2)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([4.40563983, 6.17699951, 3.65503843, 3.28052152])" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x = stats.gamma.rvs(2, scale=2, size=4)\n", "x " ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([0.12169605, 0.07037188, 0.14694352, 0.15904745])" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "stats.gamma.pdf(x, 2, scale=2)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([0.12169605, 0.07037188, 0.14694352, 0.15904745])" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X = stats.gamma(2, scale=2) \n", "X.pdf(x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 离散概率分布" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "x = range(1, 7) \n", "p = (0.4, 0.2, 0.1, 0.1, 0.1, 0.1)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([2, 5, 2, 6, 1, 6, 6, 5, 3, 1, 5, 2, 1, 1, 1, 1, 1, 2, 1, 6])" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dice = stats.rv_discrete(values=(x, p))\n", "dice.rvs(size=20)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "np.random.seed(42)\n", "samples = dice.rvs(size=(20000, 50))\n", "samples_mean = np.mean(samples, axis=1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 核密度估计" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#%fig=核密度估计能更准确地表示随机变量的概率密度函数\n", "_, bins, step = pl.hist(\n", " samples_mean, bins=100, normed=True, histtype=\"step\", label=u\"直方图统计\")\n", "kde = stats.kde.gaussian_kde(samples_mean)\n", "x = np.linspace(bins[0], bins[-1], 100)\n", "pl.plot(x, kde(x), label=u\"核密度估计\")\n", "mean, std = stats.norm.fit(samples_mean)\n", "pl.plot(x, stats.norm(mean, std).pdf(x), alpha=0.8, label=u\"正态分布拟合\")\n", "pl.legend()" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXYAAAD7CAYAAAB+B7/XAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzsvXlwHNd97/s53bPPYLCT4L6Ii/aNlERqpW1ZiyXb2kJZsmXZz46T59SLK66yc289v8hxfO9LUrf8KnGVb0qx7ETypsWSbEWRQlESJVGLJdIiKYrauIkESYDYZjCDWbv7vD+6e2YAzAADYAYggfOpYmE4c7rPGQr6nl9/z+/8jpBSolAoFIrZgzbTA1AoFApFbVHCrlAoFLMMJewKhUIxy1DCrlAoFLMMJewKhUIxy1DCrlAoFLMMJewKhUIxy1DCrlAoFLMMJewKhUIxy1DCrlAoFLMMz0x02tbWJpcvXz4TXSsUCsVpy86dO3ullO3jtZsRYV++fDk7duyYia4VCoXitEUI8XE17ZQVo1AoFLMMJewKhUIxy1DCrlAoFLOMGfHYFQqFohL5fJ7Ozk4ymcxMD2XGCAQCLF68GK/XO6nrlbArFIpTis7OThoaGli+fDlCiJkezrQjpaSvr4/Ozk5WrFgxqXsoK0ahUJxSZDIZWltb56SoAwghaG1tndITixJ2xSlH92CG7R/1kjXMae03a5hs/6iXI32pae0XYP/JBDs/7kcdVWkzV0XdZarfXwm74pQinTP5l5cO8PQ7J3h2b9e09v3cvm6efucEP3v1EKmcMW399iaz/PzVwzy28xivfNQ7bf0qKvP973+fbdu2Tera++67j0suuYS/+Iu/qNgmn89z5513ct111/HJT36SgYGBSY60PErYFacUB3qSZPIWALuPxrGs6YlgpZTsPTYIQNaweO/E4LT0C/D+iQTu19x1NDZt/Sqmxn333cemTZsKf775zW+yc+dOtm/fzptvvsm8efPYunVr2WufeeYZbrjhBrZs2cL111/PQw89VNOxqcVTxSnFod6hwut03qRvKEd7g7/u/fYP5Yin84W/H+1Ps25Z3bsFbBvGpWswQ9Yw8Xv06en8FOe/P/5OXe77/9523rhtfvSjH3HfffexYMEC+vr6ePjhh1m9ejUffPABN9xwQ9nd8z/60Y+4/fbbEUJw/fXX88wzz3DttdeOave5z32u8Lqnp4f169dP7QuNQEXsilOKI/22v+3TbY/xRDw9rf36Pfb/El2D05dq1zmQLvQtJZwczE5b34rKrF+/npdeeonGxkY+/vhjnn76aS6//HKefvppzjzzzLLXDA0NsWjRIgBaWlro7u4es4+DBw/ywgsvcPvtt9d07CpiV5wySCnpSdiiduHSJt48NMCJeIbzF9e/775kDoDzFzfy1uEBuuIZpJR1X8RL50yGciZeXbC2o4E9nXG6BzMsaQnVtd/ThWoi63px2WWXAXDxxRezdOlSHnnkEW666SYeffRRPvWpT3Hffffx0ksvFdqfffbZrF69mnTanqiTySSWZVW8fzab5Stf+Qr333//pPPVK6EidsUpQypnkjUs/B6NlW0RwF5YnA76h2xhX9YaIuLXyRoWg+n6L6D2DdnfrzXsp6MxAEC3ithPCXbu3AnAnj178Hg8PPvss1x//fU8//zzXHzxxfzt3/4t27ZtK/z5yU9+wrp169i+fTsAu3fvZqwqtl/96lf5yle+UnMbBpSwK04hXHFtDftoCtkRTCyVH+uSmtHrCGxL2E9TyGf3nc7VvV/3SaE14qNlGvtVjM8rr7zCNddcQ3d3N9/+9rdpbW1l+fLlLF26lIsuuqjsNVdeeSVvv/023/rWt/j7v/977rrrLvr7+/n6178+rN0zzzzDE088wYMPPsimTZv4p3/6p5qOXVkxilOGPkfYWyK+griWLmjWk35HYFucSaVzIE0slWdZa537db5zW2T6JzNFZb7//e+Peq+ry06//eCDDypep2kaW7du5emnn+Zb3/pWYefoT3/602HtbrzxxoJlUw+UsCtOGVwRbwr6aPB70AQkMgZ508Kr1+/h0jAthnImmoBowENT0I2c6y+wgxm7j2jQS2PQFvbBaZrMFPUhGAxyxx13zOgYlBWjOGVIZmxPuyHgQdNEQejqHbUns3a/kYAHIURJ5Fx/SyThfme/l2jAixCQyBoYZuVFN4ViPJSwK04ZEk70GgnYD5LTZU0UxdXudzoj59JJRdMEDQEPUsJgZvp2vipmH0rYFacMrshFHWEPO0Jb7+39rrBHnP4anP6T2frXqnEnM7fPaMCeVJJK2BVTQAm74pShKLBe56crsPUVOff+DY6ohgv91jdil1IWnxbcycyn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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#%fig=`bw_method`参数越大核密度估计曲线越平滑\n", "for bw in [0.2, 0.3, 0.6, 1.0]:\n", " kde = stats.gaussian_kde([-1, 0, 1], bw_method=bw)\n", " x = np.linspace(-5, 5, 1000)\n", " y = kde(x)\n", " pl.plot(x, y, lw=2, label=\"bw={}\".format(bw), alpha=0.6)\n", "pl.legend(loc=\"best\");" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 二项、泊松、伽玛分布" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([4.01877572e-01, 4.01877572e-01, 1.60751029e-01, 3.21502058e-02,\n", " 3.21502058e-03, 1.28600823e-04])" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "stats.binom.pmf(range(6), 5, 1/6.0)" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0.00675531110335309\n", "0.0006301754049777564\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#%fig=当n足够大时二项分布和泊松分布近似相等\n", "lambda_ = 10.0\n", "x = np.arange(20)\n", "\n", "n1, n2 = 100, 1000\n", "\n", "y_binom_n1 = stats.binom.pmf(x, n1, lambda_ / n1)\n", "y_binom_n2 = stats.binom.pmf(x, n2, lambda_ / n2)\n", "y_poisson = stats.poisson.pmf(x, lambda_)\n", "print(np.max(np.abs(y_binom_n1 - y_poisson)))\n", "print(np.max(np.abs(y_binom_n2 - y_poisson)))\n", "#%hide\n", "fig, (ax1, ax2) = pl.subplots(1, 2, figsize=(7.5, 2.5))\n", "\n", "ax1.plot(x, y_binom_n1, label=u\"binom\", lw=2)\n", "ax1.plot(x, y_poisson, label=u\"poisson\", lw=2, color=\"red\")\n", "ax2.plot(x, y_binom_n2, label=u\"binom\", lw=2)\n", "ax2.plot(x, y_poisson, label=u\"poisson\", lw=2, color=\"red\")\n", "for n, ax in zip((n1, n2), (ax1, ax2)):\n", " ax.set_xlabel(u\"次数\")\n", " ax.set_ylabel(u\"概率\")\n", " ax.set_title(\"n={}\".format(n))\n", " ax.legend()\n", "fig.subplots_adjust(0.1, 0.15, 0.95, 0.90, 0.2, 0.1)" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "time=1000, max_error=0.01964230201602718\n", "time=50000, max_error=0.001798012894964722\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#%fig=模拟泊松分布\n", "np.random.seed(42)\n", "\n", "\n", "def sim_poisson(lambda_, time):\n", " t = np.random.uniform(0, time, size=lambda_ * time) #❶\n", " count, time_edges = np.histogram(t, bins=time, range=(0, time)) #❷\n", " dist, count_edges = np.histogram(\n", " count, bins=20, range=(0, 20), density=True) #❸\n", " x = count_edges[:-1]\n", " poisson = stats.poisson.pmf(x, lambda_)\n", " return x, poisson, dist\n", "\n", "\n", "lambda_ = 10\n", "times = 1000, 50000\n", "x1, poisson1, dist1 = sim_poisson(lambda_, times[0])\n", "x2, poisson2, dist2 = sim_poisson(lambda_, times[1])\n", "max_error1 = np.max(np.abs(dist1 - poisson1))\n", "max_error2 = np.max(np.abs(dist2 - poisson2))\n", "print(\"time={}, max_error={}\".format(times[0], max_error1))\n", "print(\"time={}, max_error={}\".format(times[1], max_error2))\n", "#%hide\n", "fig, (ax1, ax2) = pl.subplots(1, 2, figsize=(7.5, 2.5))\n", "\n", "ax1.plot(x1, dist1, \"-o\", lw=2, label=u\"统计结果\")\n", "ax1.plot(x1, poisson1, \"->\", lw=2, label=u\"泊松分布\", color=\"red\", alpha=0.6)\n", "ax2.plot(x2, dist2, \"-o\", lw=2, label=u\"统计结果\")\n", "ax2.plot(x2, poisson2, \"->\", lw=2, label=u\"泊松分布\", color=\"red\", alpha=0.6)\n", "\n", "for ax, time in zip((ax1, ax2), times):\n", " ax.set_xlabel(u\"次数\")\n", " ax.set_ylabel(u\"概率\")\n", " ax.set_title(u\"time = {}\".format(time))\n", " ax.legend(loc=\"lower center\")\n", "\n", "fig.subplots_adjust(0.1, 0.15, 0.95, 0.90, 0.2, 0.1)" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#%fig=模拟伽玛分布\n", "def sim_gamma(lambda_, time, k):\n", " t = np.random.uniform(0, time, size=lambda_ * time) #❶\n", " t.sort() #❷\n", " interval = t[k:] - t[:-k] #❸\n", " dist, interval_edges = np.histogram(interval, bins=100, density=True) #❹\n", " x = (interval_edges[1:] + interval_edges[:-1])/2 #❺\n", " gamma = stats.gamma.pdf(x, k, scale=1.0/lambda_) #❺\n", " return x, gamma, dist\n", "\n", "lambda_ = 10\n", "time = 1000\n", "ks = 1, 2\n", "x1, gamma1, dist1 = sim_gamma(lambda_, time, ks[0])\n", "x2, gamma2, dist2 = sim_gamma(lambda_, time, ks[1])\n", "#%hide\n", "fig, (ax1, ax2) = pl.subplots(1, 2, figsize=(7.5, 2.5))\n", "\n", "ax1.plot(x1, dist1, lw=2, label=u\"统计结果\")\n", "ax1.plot(x1, gamma1, lw=2, label=u\"伽玛分布\", color=\"red\", alpha=0.6)\n", "ax2.plot(x2, dist2, lw=2, label=u\"统计结果\")\n", "ax2.plot(x2, gamma2, lw=2, label=u\"伽玛分布\", color=\"red\", alpha=0.6)\n", "\n", "for ax, k in zip((ax1, ax2), ks):\n", " ax.set_xlabel(u\"时间间隔\")\n", " ax.set_ylabel(u\"概率密度\")\n", " ax.set_title(u\"k = {}\".format(k))\n", " ax.legend(loc=\"upper right\")\n", " \n", "fig.subplots_adjust(0.1, 0.15, 0.95, 0.90, 0.2, 0.1);" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "202.3388747879705" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "T = 100000\n", "A_count = int(T / 5)\n", "B_count = int(T / 10)\n", "\n", "A_time = np.random.uniform(0, T, A_count) #❶\n", "B_time = np.random.uniform(0, T, B_count)\n", "\n", "bus_time = np.concatenate((A_time, B_time)) #❷\n", "bus_time.sort()\n", "\n", "N = 200000\n", "passenger_time = np.random.uniform(bus_time[0], bus_time[-1], N) #❸\n", "\n", "idx = np.searchsorted(bus_time, passenger_time) #❹\n", "np.mean(bus_time[idx] - passenger_time) * 60 #❺" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "199.99833251643057" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.mean(np.diff(bus_time)) * 60" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#%figonly=观察者偏差\n", "import matplotlib.gridspec as gridspec\n", "pl.figure(figsize=(7.5, 3))\n", "\n", "G = gridspec.GridSpec(10, 1)\n", "ax1 = pl.subplot(G[:2, 0])\n", "ax2 = pl.subplot(G[3:, 0])\n", "\n", "ax1.vlines(bus_time[:10], 0, 1, lw=2, color=\"blue\", label=u\"公交车\")\n", "ptime = np.random.uniform(bus_time[0], bus_time[9], 100)\n", "ax1.vlines(ptime, 0, 1, lw=1, color=\"red\", alpha=0.2, label=u\"乘客\")\n", "ax1.legend()\n", "count, bins = np.histogram(passenger_time, bins=bus_time)\n", "ax2.plot(np.diff(bins), count, \".\", alpha=0.3, rasterized=True)\n", "ax2.set_xlabel(u\"公交车的时间间隔\")\n", "ax2.set_ylabel(u\"等待人数\");" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "200.0" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from scipy import integrate\n", "t = 10.0 / 3 # 两辆公交车之间的平均时间间隔\n", "bus_interval = stats.gamma(1, scale=t)\n", "n, _ = integrate.quad(lambda x: 0.5 * x * x * bus_interval.pdf(x), 0, 1000)\n", "d, _ = integrate.quad(lambda x: x * bus_interval.pdf(x), 0, 1000)\n", "n / d * 60" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 学生t-分布与t检验" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "max error: 0.006832108369761447\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXsAAAD7CAYAAACL+TRnAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzt3Xl4XNWZ5/HvW5tK+y5ZtiTbsmV5t2ULY2NjBF7CFsIWSAIkJKSh051MepJOJ3lCZzoJ3enO9NCddkKmSchDEiYhZoewGQMGY7zgTV7lXbIlS9a+S1WqqjN/SNjGyKhsl3RreT/Po4cr6ZxbvyqsV1enzj1HjDEopZSKbjarAyillBp5WuyVUioGaLFXSqkYoMVeKaVigBZ7pZSKAVrslVIqBmixV0qpGKDFXimlYoAWe6WUigFa7JVSKgY4gmkkIo8B04GXjTEPfUK7XOA1Y0zphfQDyMrKMhMmTAg2t1JKKWDbtm1Nxpjs4doNW+xF5FbAboxZJCK/FZFiY8yh8zT/dyD+IvoxYcIEtm7dOlwcpZRSZxGR6mDaBTOMUw6sHjxeAyw5zwNeA3QD9RfSTyml1MgLptgnArWDxy1A7rkNRMQF/CPwvQvsd7+IbBWRrY2NjReSWyml1AUIpth3MTg0AySdp8/3gEeMMW0X0s8Y86gxpswYU5adPeyQk1JKqYsUzBu02xgYgtkEzAEODNFmOXCNiPwtMFdEfgO8G0Q/pVQM6+/vp6amhr6+PqujhD23201+fj5Op/Oi+gdT7J8H1ovIWOA64HMi8pAx5sEPGxhjln54LCLrjDFfFZGUc/otvKiESqmoVVNTQ3JyMhMmTEBErI4TtowxNDc3U1NTw8SJEy/qHMMO4xhjOhh4s3UTcLUxpuLsQj9E+/Lz9Gu/qIRKqajV19dHZmamFvphiAiZmZmX9BdQUDdVGWNajTGrjTH1w7e+9H5KWa67CQ6thdpt0F4DPq/ViaJWuBV6n88HQG9v76g83oYNG4J6rEt9nYK6qUqpmNLdBBt+Dp6Oj3y5xSTxQaOTjQ12plx+PV+4Zr5FAVWoXX755WzevBljDNdffz2vvvoqd911Fw899BDTp0//SNtVq1YRHx/PV7/61fOe7/HHH+f222/nvffeQ0T41Kc+NWS7rq4u7rnnHnbt2hXS5zMULfZKna23DTb+cqDQpxbgdaZw6OgRamqO09x5HIApQNfbB6me9jDj83QWWTRITk4GYO3atcycOZP//u//5tChQ2zfvp3k5GTy8vJwOAbKpdPpPH0MA38JnP15dXU1q1at4ktf+hKlpaXceOONXHXVVbjdbgBeeeUVfvrTn2K322lvb6erq4sbb7zxdP9AIMA3v/lNbrvttpA+Ry32KuYZY+j2+mlpacGx+RcEOuppdozhGW85z+5qpsszDhsB8l3d3FbioqBpPTRW8e5T/8U93/gxhNkwhAreE088wapVqzhw4AC33HIL3/72t7nyyitZtWoV3/jGN0hISMBms7Fs2TKcTid9fX1s2LABGLh6dzgc9Pf38+c//5kxY8YA8I1vfIN/+Zd/QUTIzc3l7rvv5q677uLJJ5/E6XRy7bXXsnLlSvr7+1m4cCEHDx7kzTffDHlxP5cWexWzjDF87YntvH2gAXx93Gd/hXxp4pRJ51H/HHo5BcC8wjQ+d1khN8zOIzHOQWPDQl775bexN+xhx7svUXrVTRY/E3Wx7r77bhwOB//5n//Jc889h8fjwW6388ILL7By5Ury8vKIi4vjnXfeAeCXv/wlxhgCgQAPPPAAn//85z9yvv/4j/8gLS2NlStXnv7aN7/5TWpra1m8eDG/+c1vmD17Njabje985zs88MADpKWlsWrVKi32So2UD6paeW1vPU58/JXrDaY42/C6sjmc/XluTM4gLy2eG2fnMSU3+SP9snPGkrTgbno3/obq9/7I9JlziMscb9GziB4TvvfyiJy36l9v+MTvP/HEEzQ3N/OFL3yBm266iV//+tfs37+fw4cP43A4eOGFF0hNTaW5uZnVq1efLvC/+tWvuO6660hLSwMGhm/eeustpkyZwsyZM2lqamLixIn4/X4Avv71r9Pd3Q3Az3/+cx555BFKSkpYvXo1FRUVlJeX09XVxcKFC/nFL34R8tdBi72KWX/achw7fh6ZWsGKTCe4p8Hiv+OOhIxh+97wqev437u3MrFrJ3te/C/m3/3P4HSPQmoVSmvWrCEpKYnx48ezZMkSli5dyuc+9znuvfde/umf/okJEyZgjMHj8XD33Xfzk5/8hH379uF2u/n7v/97brnlFp566imysrIYP348L730EgDz58/n8OHD/PCHP6S6uppvfetbfOlLXwIGhn+efPJJ/uEf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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#%fig=模拟学生t-分布\n", "mu = 0.0\n", "n = 10\n", "samples = stats.norm(mu).rvs(size=(100000, n)) #❶\n", "t_samples = (np.mean(samples, axis=1) - mu) / np.std(\n", " samples, ddof=1, axis=1) * n**0.5 #❷\n", "sample_dist, x = np.histogram(t_samples, bins=100, density=True) #❸\n", "x = 0.5 * (x[:-1] + x[1:])\n", "t_dist = stats.t(n - 1).pdf(x)\n", "print(\"max error:\", np.max(np.abs(sample_dist - t_dist)))\n", "#%hide\n", "pl.plot(x, sample_dist, lw=2, label=u\"样本分布\")\n", "pl.plot(x, t_dist, lw=2, alpha=0.6, label=u\"t分布\")\n", "pl.xlim(-5, 5)\n", "pl.legend(loc=\"best\")" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#%figonly=当`df`增大,学生t-分布趋向于正态分布\n", "fig, (ax1, ax2) = pl.subplots(1, 2, figsize=(7.5, 2.5))\n", "ax1.plot(x, stats.t(6-1).pdf(x), label=u\"df=5\", lw=2)\n", "ax1.plot(x, stats.t(40-1).pdf(x), label=u\"df=39\", lw=2, alpha=0.6)\n", "ax1.plot(x, stats.norm.pdf(x), \"k--\", label=u\"norm\")\n", "ax1.legend()\n", "\n", "ax2.plot(x, stats.t(6-1).sf(x), label=u\"df=5\", lw=2)\n", "ax2.plot(x, stats.t(40-1).sf(x), label=u\"df=39\", lw=2, alpha=0.6)\n", "ax2.plot(x, stats.norm.sf(x), \"k--\", label=u\"norm\")\n", "ax2.legend();" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [], "source": [ "n = 30\n", "np.random.seed(42)\n", "s = stats.norm.rvs(loc=1, scale=0.8, size=n)" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2.658584340882224 Ttest_1sampResult(statistic=2.658584340882224, pvalue=0.01263770225709123)\n" ] } ], "source": [ "t = (np.mean(s) - 0.5) / (np.std(s, ddof=1) / np.sqrt(n))\n", "print (t, stats.ttest_1samp(s, 0.5))" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "-1.1450173670383303\n", "Ttest_1sampResult(statistic=-1.1450173670383303, pvalue=0.26156414618801477) Ttest_1sampResult(statistic=-0.3842970254542196, pvalue=0.7035619103425202)\n" ] } ], "source": [ "print ((np.mean(s) - 1) / (np.std(s, ddof=1) / np.sqrt(n)))\n", "print (stats.ttest_1samp(s, 1), stats.ttest_1samp(s, 0.9))" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#%fig=红色部分为`ttest_1samp()`计算的p值\n", "x = np.linspace(-5, 5, 500)\n", "y = stats.t(n-1).pdf(x)\n", "plt.plot(x, y, lw=2)\n", "t, p = stats.ttest_1samp(s, 0.5)\n", "mask = x > np.abs(t)\n", "plt.fill_between(x[mask], y[mask], color=\"red\", alpha=0.5)\n", "mask = x < -np.abs(t)\n", "plt.fill_between(x[mask], y[mask], color=\"red\", alpha=0.5)\n", "plt.axhline(color=\"k\", lw=0.5)\n", "plt.xlim(-5, 5);" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.012633433707685974" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from scipy import integrate\n", "x = np.linspace(-10, 10, 100000)\n", "y = stats.t(n-1).pdf(x)\n", "mask = x >= np.abs(t)\n", "integrate.trapz(y[mask], x[mask])*2" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.012695" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "m = 200000\n", "mean = 0.5\n", "r = stats.norm.rvs(loc=mean, scale=0.8, size=(m, n))\n", "ts = (np.mean(s) - mean) / (np.std(s, ddof=1) / np.sqrt(n))\n", "tr = (np.mean(r, axis=1) - mean) / (np.std(r, ddof=1, axis=1) / np.sqrt(n))\n", "np.mean(np.abs(tr) > np.abs(ts))" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Ttest_indResult(statistic=-2.2391470627176755, pvalue=0.033250866086743665)\n", "Ttest_indResult(statistic=-0.5946698521856172, pvalue=0.5551805875810539)\n" ] } ], "source": [ "np.random.seed(42)\n", "\n", "s1 = stats.norm.rvs(loc=1, scale=1.0, size=20)\n", "s2 = stats.norm.rvs(loc=1.5, scale=0.5, size=20)\n", "s3 = stats.norm.rvs(loc=1.5, scale=0.5, size=25)\n", "\n", "print (stats.ttest_ind(s1, s2, equal_var=False)) #❶\n", "print (stats.ttest_ind(s2, s3, equal_var=True)) #❷" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 卡方分布和卡方检验" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "max error: 0.0030732520533635066\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYAAAAD6CAYAAACoCZCsAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzt3Xl8VfWd+P/X+y7Jzb4RQth3BJFFdhEMKIhb61a1LrWjHf3229rOdG91xrFj218733HG0lrXGa22KlqhtW64gCICEhRk35SdQEgge27u8v79cS8YYkJuIMm5yX0/H488PDn3c855n4/hvO/5nPP5fERVMcYYk3hcTgdgjDHGGZYAjDEmQVkCMMaYBGUJwBhjEpQlAGOMSVCWAIwxJkFZAjDGmARlCcAYYxKUJQBjjElQHqcDOJUePXrowIEDnQ7DGGO6lDVr1hxR1fzWysV1Ahg4cCDFxcVOh2GMMV2KiOyOpZw1ARljTIKyBGCMMQnKEoAxxiSouH4GYIxJPIFAgH379lFfX+90KHHP5/PRt29fvF7vaW1vCcAYE1f27dtHRkYGAwcOREScDiduqSplZWXs27ePQYMGndY+rAnIGBNX6uvrycvLs4t/K0SEvLy8M7pTsgRgjIk7dvGPzZnWkyWAdvCnVbu58+linvpgF3vLa50OxxjTzoLBIAB1dXWdcrzly5d3yrEsAZyh/3n/M+5euJ73N+7iP/62mkt/8wrXzn+Hkgp7gGVMVzZlyhQg0tZ+6aWXEgqFuOmmm9i0adMXys6fP5/HH3/8lPt78sknqa6u5vXXX+eNN95osVx1dTW33HILoVDozE4gBvYQ+Aw8s3I3v//7Cr7pfpe5veup9gcpqajHf0hZ9MxH3PmP30SS0pwO0xhzGjIyMgB46623GD16NI888gjbt2/no48+IiMjg8LCQjyeyCXU6/WeWIbIHUPj33fv3s38+fO59dZbGT9+PJdffjkXXHABPp8PgFdffZVf/epXuN1uKioqqK6u5vLLLz+xfTgc5rvf/S7XXHNNu56jJYDT9JfivSz861/4tmcl0wemM7x3T3AnUdMQ5pXibWQeXM7uF/YwcPp1MGA6WJumMV3CM888w/z589m6dStXXXUV3//+95kxYwbz58/nrrvuIjU1FZfLxYUXXojX66W+vp7ly5cDkW/5Ho+HQCDA888/T69evQC46667+OUvf4mIUFBQwM0338xNN93Ec889h9frZd68ecydO5dAIMDUqVPZtm0bb7/9drtf8JuyBHAadhyu5oO/Psw17k2M75/D8PEXwDlfgaRU0gB32kq2vf1HfDsP0DvteZIqD8I511oSMKaNBv7klQ7Z767/77IWP7v55pvxeDz893//NwsXLsTv9+N2u/nrX//K3LlzKSwsJDk5mXfffReA3//+96gq4XCYO++8k69+9asn7e+//uu/yM7OZu7cuSfWffe732X//v1Mnz6dxx9/nDFjxuByufjhD3/InXfeSXZ2NvPnz7cEEG9CYeV3zy1ism5iQM8sRl7yTeg78aSL+1VFU/jT5iCr9n1M731rmOp+H9weGHWlJQFjuoBnnnmGsrIybrzxRr70pS/x2GOPsXnzZnbs2IHH4+Gvf/0rWVlZlJWVsWDBghMX/T/84Q9ccsklZGdnA5Gmn3feeYfhw4czevRojhw5wqBBg06073/729+mpqYGgAcffJCHHnqIESNGsGDBAtatW0dRURHV1dVMnTqV3/3ud+1+npYA2uipd7cw4vDrpCS5GTvnFug36QtlXC7hV9eM5bLfVnLvAS8P+ooZoUsRdzKcdakDURvTNZ3qm3pHWbx4Menp6QwYMIDzzz+fmTNncsMNN/D1r3+df/u3f2PgwIGoKn6/n5tvvpl///d/Z9OmTfh8Pn7wgx9w1VVX8cILL9CjRw8GDBjAyy+/DMCECRPYsWMH//qv/8ru3bv53ve+x6233gpEmo6ee+45fvSjHzF9+nTmzZvHRRddxFtvvcXatWt58sknO+RcLQG0wc7Sata/82cmUcOY0eNIHzGrxbIjemXwz3OG8x9vKN/fGeSfj37A1IZXSE/JhgHndWLUxpi2KCkp4de//jW33347d955J9OnTyc1NZUtW7awY8cOkpKSuPLKK1mwYAFFRUXcfffdlJeX43K5yMrK4qKLLmLSpEm89NJLjB8//sR+X3zxRX784x8DcODAAfr163fis+uuu47rrruOhx56qFPP1RJAGzz4wmKm6EYG5mcw5MJvgOvUb9F+a9ZQhuSnc/fCJB4qD1BevYxJtc8w6OqhkN6zk6I2xrTF1772NSDy5o3b7WblypUAJ90B7Nq1i8LCQr7yla8AkecAPp+P22+/HYCvfvWr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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#%fig=使用随机数验证卡方分布\n", "a = np.random.normal(size=(300000, 4))\n", "cs = np.sum(a**2, axis=1)\n", "\n", "sample_dist, bins = np.histogram(cs, bins=100, range=(0, 20), density=True)\n", "x = 0.5 * (bins[:-1] + bins[1:])\n", "chi2_dist = stats.chi2.pdf(x, 4)\n", "print(\"max error:\", np.max(np.abs(sample_dist - chi2_dist)))\n", "#%hide\n", "pl.plot(x, sample_dist, lw=2, label=u\"样本分布\")\n", "pl.plot(x, chi2_dist, lw=2, alpha=0.6, label=u\"$\\chi ^{2}$分布\")\n", "pl.legend(loc=\"best\")" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#%fig=模拟卡方分布\n", "repeat_count = 60000\n", "n, k = 100, 5\n", "\n", "np.random.seed(42)\n", "ball_ids = np.random.randint(0, k, size=(repeat_count, n)) #❶\n", "counts = np.apply_along_axis(np.bincount, 1, ball_ids, minlength=k) #❷\n", "cs2 = np.sum((counts - n/k)**2.0/(n/k), axis=1) #❸\n", "k = stats.kde.gaussian_kde(cs2) #❹\n", "x = np.linspace(0, 10, 200)\n", "pl.plot(x, stats.chi2.pdf(x, 4), lw=2, label=u\"$\\chi ^{2}$分布\")\n", "pl.plot(x, k(x), lw=2, color=\"red\", alpha=0.6, label=u\"样本分布\")\n", "pl.legend(loc=\"best\")\n", "pl.xlim(0, 10);" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[80 93 97 64 66]\n", "[89 76 79 71 85]\n" ] } ], "source": [ "def choose_balls(probabilities, size):\n", " r = stats.rv_discrete(values=(range(len(probabilities)), probabilities))\n", " s = r.rvs(size=size)\n", " counts = np.bincount(s) \n", " return counts\n", "\n", "np.random.seed(42)\n", "counts1 = choose_balls([0.18, 0.24, 0.25, 0.16, 0.17], 400)\n", "counts2 = choose_balls([0.2]*5, 400)\n", "\n", "print(counts1)\n", "print(counts2)" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "chi1 = 11.375 p1 = 0.022657601239769634\n", "chi2 = 2.55 p2 = 0.6357054527037017\n" ] } ], "source": [ "chi1, p1 = stats.chisquare(counts1)\n", "chi2, p2 = stats.chisquare(counts2)\n", "\n", "print (\"chi1 =\", chi1, \"p1 =\", p1)\n", "print (\"chi2 =\", chi2, \"p2 =\", p2)" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#%figonly=卡方检验计算的概率为阴影部分的面积\n", "x = np.linspace(0, 30, 200)\n", "CHI2 = stats.chi2(4)\n", "pl.plot(x, CHI2.pdf(x), \"k\", lw=2)\n", "pl.vlines(chi1, 0, CHI2.pdf(chi1))\n", "pl.vlines(chi2, 0, CHI2.pdf(chi2))\n", "pl.fill_between(x[x>chi1], 0, CHI2.pdf(x[x>chi1]), color=\"red\", alpha=1.0)\n", "pl.fill_between(x[x>chi2], 0, CHI2.pdf(x[x>chi2]), color=\"green\", alpha=0.5)\n", "pl.text(chi1, 0.015, r\"$\\chi^2_1$\", fontsize=14)\n", "pl.text(chi2, 0.015, r\"$\\chi^2_2$\", fontsize=14)\n", "pl.ylim(0, 0.2)\n", "pl.xlim(0, 20);" ] }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1.0724852071005921\n", "0.300384770390566\n" ] } ], "source": [ "table = [[43, 9], [44, 4]]\n", "chi2, p, dof, expected = stats.chi2_contingency(table)\n", "print(chi2)\n", "print(p)" ] }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(0.43434343434343436, 0.23915695682224306)" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "stats.fisher_exact(table)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.4" } }, "nbformat": 4, "nbformat_minor": 1 } ================================================ FILE: 4.scipy/5.scipy-integrate.ipynb ================================================ { "cells": [ { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import pylab as pl\n", "import numpy as np\n", "from scipy import integrate\n", "from scipy.integrate import odeint\n", "import matplotlib as mpl\n", "mpl.rcParams['font.sans-serif'] = ['SimHei']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 数值积分-integrate" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 球的体积" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "def half_circle(x):\n", " return (1-x**2)**0.5" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "3.1415893269307373" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "N = 10000\n", "x = np.linspace(-1, 1, N)\n", "dx = x[1] - x[0]\n", "y = half_circle(x)\n", "2 * dx * np.sum(y) # 面积的两倍 " ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "3.1415893269315975" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.trapz(y, x) * 2 # 面积的两倍" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "3.141592653589797" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from scipy import integrate\n", "pi_half, err = integrate.quad(half_circle, -1, 1)\n", "pi_half * 2" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "def half_sphere(x, y):\n", " return (1-x**2-y**2)**0.5" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2.094395102393199 1.0002356720661965e-09 2.0943951023931953\n" ] } ], "source": [ "volume, error = integrate.dblquad(half_sphere, -1, 1, \n", " lambda x:-half_circle(x), \n", " lambda x:half_circle(x))\n", "\n", "print (volume, error, np.pi*4/3/2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 解常微分方程组" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#%fig=洛伦茨吸引子:微小的初值差别也会显著地影响运动轨迹\n", "from scipy.integrate import odeint \n", "import numpy as np \n", "\n", "def lorenz(w, t, p, r, b): #❶\n", " # 给出位置矢量w,和三个参数p, r, b计算出\n", " # dx/dt, dy/dt, dz/dt的值\n", " x, y, z = w.tolist()\n", " # 直接与lorenz的计算公式对应 \n", " return p*(y-x), x*(r-z)-y, x*y-b*z\n", "\n", "t = np.arange(0, 30, 0.02) # 创建时间点 \n", "# 调用ode对lorenz进行求解, 用两个不同的初始值 \n", "track1 = odeint(lorenz, (0.0, 1.00, 0.0), t, args=(10.0, 28.0, 3.0)) #❷\n", "track2 = odeint(lorenz, (0.0, 1.01, 0.0), t, args=(10.0, 28.0, 3.0)) #❸\n", "#%hide\n", "from mpl_toolkits.mplot3d import Axes3D\n", "fig = pl.figure()\n", "ax = Axes3D(fig)\n", "ax.plot(track1[:,0], track1[:,1], track1[:,2], lw=1)\n", "ax.plot(track2[:,0], track2[:,1], track2[:,2], lw=1);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### ode类" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "def mass_spring_damper(xu, t, m, k, b, F):\n", " x, u = xu.tolist()\n", " dx = u\n", " du = (F - k*x - b*u)/m\n", " return dx, du " ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#%fig=滑块的速度和位移曲线\n", "m, b, k, F = 1.0, 10.0, 20.0, 1.0\n", "init_status = 0.0, 0.0\n", "args = m, k, b, F\n", "t = np.arange(0, 2, 0.01)\n", "result = odeint(mass_spring_damper, init_status, t, args)\n", "#%hide\n", "fig, (ax1, ax2) = pl.subplots(2, 1)\n", "ax1.plot(t, result[:, 0], label=u\"位移\")\n", "ax1.legend()\n", "ax2.plot(t, result[:, 1], label=u\"速度\")\n", "ax2.legend();" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from scipy.integrate import ode\n", "\n", "class MassSpringDamper(object): #❶\n", " \n", " def __init__(self, m, k, b, F):\n", " self.m, self.k, self.b, self.F = m, k, b, F\n", " \n", " def f(self, t, xu):\n", " x, u = xu.tolist()\n", " dx = u\n", " du = (self.F - self.k*x - self.b*u)/self.m\n", " return [dx, du] \n", "\n", "system = MassSpringDamper(m=m, k=k, b=b, F=F)\n", "init_status = 0.0, 0.0\n", "dt = 0.01\n", "\n", "r = ode(system.f) #❷\n", "r.set_integrator('vode', method='bdf')\n", "r.set_initial_value(init_status, 0)\n", "\n", "t = []\n", "result2 = [init_status]\n", "while r.successful() and r.t + dt < 2: #❸\n", " r.integrate(r.t + dt)\n", " t.append(r.t)\n", " result2.append(r.y)\n", " \n", "result2 = np.array(result2)\n", "np.allclose(result, result2)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "class PID(object):\n", " \n", " def __init__(self, kp, ki, kd, dt):\n", " self.kp, self.ki, self.kd, self.dt = kp, ki, kd, dt\n", " self.last_error = None\n", " self.status = 0.0\n", " \n", " def update(self, error):\n", " p = self.kp * error\n", " i = self.ki * self.status\n", " if self.last_error is None:\n", " d = 0.0\n", " else:\n", " d = self.kd * (error - self.last_error) / self.dt\n", " self.status += error * self.dt\n", " self.last_error = error\n", " return p + i + d" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "控制力的终值: 19.943404699515057\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXYAAAFnCAYAAACy1GJbAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzs3Xl8FPX9x/HXd69s7pszhBAuuRUCEoWCFi/UelZUtN4H1qOHtrX1/lWrbb2rVlQq4gnaqogKXlFEUBIuRQhyEyCQhJD72OP7+2M3IYSEbJLdzO7m83w89rEzs7OzH4bNe2a/M/MdpbVGCCFE+DAZXYAQQgj/kmAXQogwI8EuhBBhRoJdCCHCjAS7EEKEGQl2IYQIMxLsQggRZiTYhRAizEiwCyFEmJFgF0KIMGMx4kNTUlJ0RkaGER8thBAhKy8vr1hrndrWfIYEe0ZGBrm5uUZ8tBBChCyl1A5f5pOmGCGECDOG7LELYSStNbUON2U1DsprHZTVOKisc1Jb76LG4X3Uu6h1uKj2Tqt1uHG63LjcGqdbe5+bjbs0Go1JKZTC+6xQgEmBUuqwZ4vZhM1swmpW2CwmrI3jpsbxhtdsZhMRVhORVjN2q5lIq5lIm/nQeJNhs0kZvYqFwSTYRVhwuNwUVdRRVFHH/sbn2sZpJVX1HKyup6zGSXmNg3qX26flmk2KKKuZCKsZq1lhNiksJoXFbMJiOjRu9j4UChdu3NqzAWl41oBba7QGtwa3d8PgcGnqnW4cLjf1Ls+zw+XZUHSUzeLZADSEv2dDYCLKZiE6wkx0hIWYCAvRERaibZ7xlqY1jkeYsZlNKCUbjFARNMHucDgoKCigtrbW6FL8zm63k5aWhtVqNbqUkKW1Zn9FHduLq9hVWkNBaTW7DtSwq7Sa3aU17C2roaUsTIq2kRoTQXKMjaG9YomPtBJntxIXaSW+ySM6wkKUd683ymbG7h22mo1prXS59aGwd3rCvtbhotbp+TXh+RXh/UXh/XXh+aXhbnytptkvkKp6J/sraqmq8wxX1TlxuHzbgFhMqknYezcGndhQRFjMAV6D3VvQBHtBQQGxsbFkZGSE1Z6B1pqSkhIKCgoYMGCA0eUEPa01uw7UsGlfBZuLKtm83/PYUlRJRa2zcT6loGesnX5JkUwYkES/xEh6xUfSIzaC1NgIesRFkBwdgc0SmoeRPL8APHvbgVTndHmCvs7ZGPaVdS6q65xU1jm9072ve19rOm9RRZ1nvnon1XUun38JWc2KKNvhG4oY78a16Uag5WlNNyyyoWhJ0AR7bW1t2IU6eNpTk5OTKSoqMrqUoONya7YVV7F+TxnfF5Txw54y1u8pPyzAU2MjGJQaw7nH9mVQjxgGpETTLymKPgl2+WP2gwiLJxSTom1+WV690+3dABwK/4YNR9MNRWWd07vxOLShqKxzsq+8Y78orGbV8q8Im4WoCPNhG4pom5moJhuNhiarKNuh4xdRNgsRFhOmED1eETTBDoRdqDcI139Xe1XVOVmz6yArtx8gd3spq3eWUlXvAjztwsN6x/GLMX0Y2TeeIT1jGdQjhvhIab4KJTaLCZvFRqKfNhSt/aJouqGo9m4oDtt41LkO21A0THe289iF3XvAOspm8QzbzERZLd6mOpN3esPG4fDxhg2F3WryPnuGk6Js9Iiz+2X9tManYFdK9QTe1lpPbuV1K/BfIAl4SWs9x38lBqeamhq++uorjj/+eADeeecdrrnmGoOrCi419S6+3VbC1z8V8932A6zfU47LrVEKjukVx/lj0xidFs/IvvEM6hFjWHu2CF7+/EWhtabO6aa6/tCGobr+0PGIaoer8cyo6ibHMWrqXYfmc7iorndSVuNgX9mheWu9033Zbpw5ujfPXDq20/+eo2kz2JVSicBcIPoos90C5Gmt71NKfaiUWqC1rvBXkV3tlltu4Z577iE1NZUXXniBkSNHkp2dDcC2bdu46aab2LRpEzNnzmTIkCG8+eabLF68mIqKCpRSzJo1C5vNP3ssoURrzYa9FSz9qYil3jCvd7qxWUyMTU9g1pSBZGUkMrZ/InF22RMXXUsp1bjn7K+mp6a01tS73NR6D2A3bARqvafLNjz3jIvw+2c358seuwuYAbx3lHmmAn/yDn8FZAFfdKoyg2zdupXPPvuMJ554Aq01xx57LAsWLCA7OxutNRkZGXz00UfcfPPNXH311Rw8eJAlS5bwwAMP4HK5ePDBB7ntttuM/md0GYfLzXfbDrB4fSGf/LiPvWWes5qG9ozliuz+TB6cyoQBSQE/CCiE0ZRSjb8w4jF2x6XNYNdal0Ob7cTRwG7v8AGgZ/MZlFLXA9cDpKent7fOLvPEE09w9tln8+abbzJnzpzGf/e0adPQWjN16lSWLl1Kfn4+a9eu5ZRTTuGRRx7h9ttvx2Qy8dBDDxn8Lwi8eqebnPz9fPxDIZ9t3E9ZjQO71cTPBqfyu1OG8LMhqfQMcBuiEKJ1/jp4WglEAmVAjHf8MFrr2cBsgKysrKO2RN2/cD0/7in3U2kew/vEce/ZI446T35+Pq+99hq33HILM2fOxGKxMGPGDAAeeughLr74YjIzMwEYNGgQ8+bNIyMjgxUrVlBZWcmtt97KCSec4Ne6g4XWmrwdpfxv9W4Wfb+Xg9UO4iOt/HxYD04b0YufDU4l0iZ75UIEA38Fex4wCXgbGAOs8NNyu9S7777LfffdR0lJCQAvvPACEydOJD09neeff57f//73ACxfvpwtW7Zw9913k5CQwOLFi+nfvz+7du0ysvyAKCitZv7KXfxvzW52HajBbjVx2ohenHtcXyYNSpEDnkIEoXYHu1LqZGC41vpfTSbPBT5USk0GhgPfdqaotvasA+WPf/wjX3/9NZ9++ikAl19+OW+++SZnnnkm2dnZRER4Dnr87W9/Izs7m9TUVCIjI3n99de54IILcDgcvPzyyzzwwAPMnDnTkH+DPzhdbr7IL+L1b3eQs8lz/v2kQSn8dtoQTh3Ri5iIoDpLVgjRjM9/oVrrqd7nz4HPm722Qyl1Cp699nu01i5/FmmUM888k/vvv5/Fixczffp0ABYuXIjFYmHs2LHceuutVFZWct111/G73/2OSy+9lJtuuonzzz/f4Mo7pqSyjldX7OTNlTvZW1ZLj9gIbjlpEDMmpNM3IdLo8oQQPvLbrpfWeg8w31/LM4rWnub/mTNnsmOHp+vj+fPn06dPH2bPns2VV17Jiy++yD333APAyJEjWbZsGStXrmTs2LG89tprREaGVghuLarkxa+38U5eAXVON5MHp3Dv2SP4+bAe0tQiRAiS39TN1NTUUF9fz9y5c7FYjlw9LpcLs9mM0+mkvr6exx57jJycHFJTU1m8eDHDhw83oOqOyd1+gOe/2sqnG/ZhNZu4YGxfrpmUyaAeMUaXJoToBNWwh9qVsrKydPM7KG3YsIFhw4Z1eS2dtXv3bhISEoiOPtr1W8H178vdfoDHP93Ess0lJERZ+dXE/lyenUFqbOAvnBBCdJxSKk9rndXWfEG1x661Drl+Vfr27dvmPEZsPFuSt6OUJz7dxNKfikmJsXHXmcO49Ph0omxB9TUQQnRS0PxF2+12SkpKSE5ODrlwP5qGbnvtduMu2MkvrOBvH20gJ7+I5Ggbf55+DJdN7C+BLkSYCpq/7LS0NAoKCsKye9uGG210tf3ltTz2ySbm5+4iJsLCn844hl9lS6ALEe6C5i/carXKjSj8pLreyeyvtjL7q604XG6uOnEAt5w8iISo7tcxmRDdUdAEu+g8rTVLftzHAwt/ZPfBGs4c1Zs/nD6U/slHP7ArhAgvEuxhYteBau57fz2fbdzP0J6xLLgxm/EZSUaXJYQwgAR7iKt3upn91Rae/nwzZpPiL9OHceWJGXJhkRDdmAR7CFu/p4zbF6xjw95ypo/qxd1nDad3fGhd9SqE8D8J9hBU73Tzry828+wXm0mMtjH78nGcOqKX0WUJIYKEBHuIabqXft5xfbn37OFytosQ4jAS7CHC7dbMWbaNRz7eSEKUjRd+lcUpw4+4UZUQQkiwh4LiyjpuX7CWnPwiThnek79fMJrEANyMVwgRHiTYg9zSn4r47VtrKa918H/njOCyif3DqssFIYT/SbAHKZdb88Snm3j6880M7hHDq9dO4JhecUaXJYQIARLsQehgdT23vbmGLzcV8ctxaTxwzki5UbQQwmcS7EFm/Z4ybnw1j8KyWh48bySXTkiXphchRLtIsAeRd1fv5k//XUdCpI23bshmbHqi0SUJIUKQBHsQcLs1j36SzzNfbGHCgCSeuXSs3M1ICNFhEuwGq3W4+P38tSz6fi8Xj+/H/507Uvp5EUJ0igS7gYoq6rjulVzWFhzkz9OP4brJmdKeLoToNAl2g/y0r4Ir/7OSkqo6nps5jtNHSl8vQgj/kGA3QN6OUq5+eSU2i4n5N2QzOi3B6JKEEGFEgr2L5eTvZ9arq+gZF8G8a46nX1KU0SUJIcKMBHsXem/Nbn4/fy1De8Xy8lUT5MwXIURASLB3kZeXbeO+hT9y/IAkXrgiizi71eiShBBhSoK9Czybs5m/f5zPqcN78tQlx2G3SvcAQojAkWAPsKc/+4lHP9nEL8b04bGLxmCRc9SFEAEmwR5AT3y6iSc+/Ynzj+vLP345BrNJzlEXQgSeBHsAaK15/JNNPPX5Zi4cl8YjF4yWUBdCdBmf2gWUUi8ppZYrpe5q5XWLUmqnUirH+xjl3zJDh9aafy7J56nPN3Px+H78XUJdCNHF2gx2pdT5gFlrnQ1kKqUGtzDbaOANrfVU7+N7fxcaKp75YjPPfLGFSyak89B5ozBJqAshupgve+xTgfne4SXApBbmmQicpZT6zrt3f0QTj1LqeqVUrlIqt6ioqMMFB7M5X2/jn0s2cf5xfXnw3JES6kIIQ/gS7NHAbu/wAaBnC/OsBKZprScAVmB68xm01rO11lla66zU1NSO1hu03lq5kwc++JHTR/Ti7xeOllAXQhjGl4OnlUCkdziGljcG67TWdd7hXKCl5pqw9f7aPfzpv98zZUgqT15yrJzSKIQwlC8JlMeh5pcxwPYW5pmnlBqjlDID5wJr/VNe8Ptswz5+99Yaxmck8e/LxhFhkYuPhBDG8iXY3wUuV0o9BlwErFdK/bXZPA8A84A1wHKt9af+LTM45e04wE2vrWJEnzheuiJLbjgthAgKbTbFaK3LlVJTgVOAv2utC2m2R661/gHPmTHdxub9lVwzN5c+CZHMuXI8sdL3ixAiSPh0gZLWupRDZ8Z0e/vKa7lizndYTIq5V00gOUZ6aRRCBA85ytdO5bUOrvzPSg5W1/OfKyeQniz9qQshgot0KdAOdU4XN87L46d9Fcy5cjyj0uKNLkkIIY4gwe4jt1tzx4J1fLOlhMcuGsPPhoTfufhCiPAgTTE+euKzn3h/7R7uOG0o549NM7ocIYRolQS7D95bs5unPvuJX45L46apA40uRwghjkqCvQ2rdpZyx9vrmDAgiQfPG4VS0lWAECK4SbAfRUFpNde/kkuvODv/vmwcNousLiFE8JODp62orHNy7dxc6pxu3rw+i6Rom9ElCSGETyTYW+Bya257YzU/7a/kP1eOZ1CPWKNLEkIIn0nbQgse/mgDn23cz71nD5fTGoUQIUeCvZm3Vu7khaXb+FV2f36VnWF0OUII0W4S7E0s31LCX/73A5MHp3DPWcONLkcIITpEgt1re3EVs17LIyMlmn9dOlZuliGECFmSXkBZtYOr565EAS9dkUV8pHTBK4QIXd3+rBiHy82vX1/FrgPVvHbtRPonRxtdkhBCdEq3DnatNfe9v56vNxfzjwtHM2FAktElCSFEp3XrppiXv9nOa9/u5IYpmfwyq5/R5QghhF9022D/In8///fBj5w6vCd/PO0Yo8sRQgi/6ZbBnl9YwS2vr+aYXnE8PuNYTCbp2EsIET66XbAXV9ZxzdyVRNnMvHRlFtER3fowgxAiDHWrVKt1uLhhXh5FFXXMvyGb3vGRRpckhBB+122C3e3W/OHtdeTtKOWZS8cypl+C0SUJIURAdJummIc+3MD7a/fwx9OP4czRvY0uRwghAqZbBPsLX23lxa+3ceUJGdw4JdPocoQQIqDCPtjfW7ObBz/cwJmjenPPWcPl1nZCiLAX1sH+8Q97+d38tUzMTOLRi8bIaY1CiG4hbIN98fpCbn59NWPS4nnxivHYrWajSxJCiC4RlmfFfPzDXm55YzUj+8Yz9+oJxMi56kKIbiTs9thfWb6dWa+tYmTfeF65ZgKxdumCVwjRvYTNrmy9083DH21kzrJtTBvWk6cvOY5ImzS/CCG6H5/22JVSLymlliul7urMPIGyvbiKi55fzpxlnlMa/33ZWAl1IUS31eYeu1LqfMCstc5WSs1RSg3WWv/U3nkCYX95LXOWbWfO19uIsJh45tKxcvGREKLb86UpZiow3zu8BJgENA9tX+bptILSal5ZvoPyGgfbiqvI21GKS2vOPbYvd55xDD3i7P7+SCGECDm+BHs0sNs7fAAY25F5lFLXA9cDpKent7tQgIPVDl5Zvp1Yu5VecXaunZzJjPH9GJAit7MTQogGvgR7JdDQDWIMLbfLtzmP1no2MBsgKytLt7tSYESfODb+3xkdeasQQnQbvhw8zcPTtAIwBtjewXk6TboDEEKItvmyx/4usFQp1Qc4A7hYKfVXrfVdR5lnov9LFUII4Ys299i11uV4Do6uAE7SWq9tFuotzVPm/1KFEEL4Qmndoebuzn2oUkXAjk4sIgUo9lM5/iR1tY/U1T5SV/uEY139tdapbc1kSLB3llIqV2udZXQdzUld7SN1tY/U1T7dua6w6ytGCCG6Owl2IYQIM6Ea7LONLqAVUlf7SF3tI3W1T7etKyTb2IUQQrQuVPfYhRBCtCLogr2jXQQHutvgtpavlIpXSn2klFqilPqfUsqmlLIopXYqpXK8j1EG1NViDUqp+5VSK5VSz/i7Jh/rmtWkpjVKqee7Yn15P7unUmrpUV63KqUWKqWWKaWubm2aAXWle9fL50qp2cqjr1KqoMk6a/NUuADU1WINXfA32VZd9zepaaNS6s5Arq+WMqCV+QKeX0EV7E27/wUylVKDfZnHl/cFui5gJvCY1vpUoBA4HRgNvKG1nup9fG9AXUfUoJQah6cLiAnAfqXUtK6uS2v9XENNwFLghZZq9Wdd3toSgbl4Oq5rzS1Antb6ROBCpVRsK9O6uq4bgFla65OBfsAo4HjgwSbrrMiAuo6ooQv+JtusS2t9b5Pv2A/AKy3V6seyWsqA5nV3SX4FVbDTcve/vszjy/sCWpfW+lmt9Sfe0VRgP56uFc5SSn3n3SL7+45VbdbVSg1TgHe05wDLYmCyAXUBnr09oKfWOreVWv3NBcwAyo8yz1QO1f8VkNXKtC6tS2v9F631Bu9oMp6LXCYC1yqlVimlHvJzTT7V1UoNUwns36QvdQGglBoPFGitd7dSq1+0kgHNTaUL8ivYgr159789fZzHl/cFui4AlFLZQKLWegWwEpimtZ4AWIHpBtTVUg1Bs76AXwPPHaVWv9Jal/vQ5UWXf8d8rAsApdQMYL3Weg/wEZ5gGA9kK6VGG1BXSzUEzfoCbgOe9g4HdH3BERnQXJd8t4It2DvaRbAv7wt0XSilkvB8gRraYNdprfd6h3MBv/4c9bGulmoIlvVlAk4Cco5SqxGM+I75RCmVCdwO/MY76RutdYXW2gWsxph11lINwbK+EoAeWust3kkBXV8tZEBzXfLdCrZg72gXwYHuNrjN5XsPlCwA7tRaN/SDM08pNUYpZQbOBdZ2dV2t1GD4+vKaDHyrD51zG+j15SsjvmNt8rYrvwFc3WRvdbFSqrdSKgo4FU9bcldrqQbD15fXOcCHTcYDtr5ayYDmuua7pbUOmgcQh+eP+TFgg/cf+dc25olvaZoBdc0CSvHsfebgaf8bCawDvsdzwMaI9XVEDXg26MuAJ4F8YEBX1+Wd7yHg/KPVGsDvWo73+WTg5mav9QfWe9fPSsDc0jQD6noE2NvkOzYFzy+ejd71dnMgavKhriNqCPTfpC91eae/Dow9Wq1+rKV5Btzbwt9jl+RX0F2g5N0rOQX4Smtd6Os8vrwv0HUZoaN1KaUigTOBVVrrrcFSV7BQnnsLTAIWa+/ecUvTROtC/TsQKF2RX0EX7EIIITon2NrYhRBCdJIEuxBChBkJdiGECDOBuLKvTSkpKTojI8OIjxZCiJCVl5dXrH24NZ4hwZ6RkUFubq4RHy2EECFLKeXTvaKlKUYIIcKMIXvswcLhcrNsczErtx+gqKKOKJuF9KQoJmYmM6x3LEopo0sUQoh267bBvnDtHh7+aCO7D9ZgMSmSY2zU1Lsor3UCMKRnDJdnZzAjqx82i/ywEUKEjm4X7C635p73fuC1b3cyqm8895w9nJ8NTiXSZgZgb1kNOflFvPndTu5+9wdmf7WFP58xjDNG9Ta4ciFEUw6Hg4KCAmpra40uxe/sdjtpaWlYrdYOvd+QK0+zsrK0EQdPtdb86Z3veSt3Fzf8LJM7ThuKxdzy3rjWmi83FfHIx/ls2FvOGSN78cA5I0mNjejiqoUQLdm2bRuxsbEkJyeHVbOp1pqSkhIqKioYMGDAYa8ppfK01m3eC6BbtTG8/M123srdxS0nD+LO6cNaDXUApRRTh/Zg4c0n8ofTh/LZxv2c8eRSlm8p6cKKhRCtqa2tDbtQB0/2JCcnd+qXSLcJ9g17y3noww1MG9aD350yxOf3Wcwmbpo6iA9umUR8pIWZL67g2ZzNSB87QhgvFEO9vr6+zXk6++/qFsGutebe99cTE2HhHxeO6dBKG9IzlvdunsT0Ub35+8f5/PatNdQ5XQGoVggRKl566SW01uzcuZPCwkIWLlzIn//8ZwoLCykoKKCmpuaw+fPz8znrrLMax51OZ0Dq6hYHTz/6oZDvth3gwfNGkhjd4o3DfRITYeHpS45jWO84/rE4nz1ltcy+fBwJUR1fphAidH388ccMHjyYb775BovFQkFBAVu2bOHVV1/F5XIxY8YMHnjgAbZt20Z0tOe+2zabjTPPPBO3201ERATvvvuu3+sK+2DXWvPUZz8xqEcMF49P7/TylFL8+qRBpCVGcseCdZz/7DfMvXoC/ZKi/FCtECKUPPXUU6SmpvLhhx+yfPlyamtrKS0tpaamhurqav74xz9isVh45plniIyM5L777mPu3Ll8+umn5OTkcPfddwekLr8Fu1IqHngTz91mqoAZWuu2G5MCLGdTERsLK/jnL8dgNvmvPe6cY/vSJyGSa15eyUXPL+fVa49nYGqM35YvhPDd/QvX8+Oecr8uc3ifOO49e0Srr7///vv8+OOPXHTRRVRUVDB37lyKi4vJycnh9ttvZ8qUKQC43W4WLFjA119/TX5+Pueeey7FxcUUFxezdu1aFi5c6Ne6wb9t7DOBx7TWpwKFwOl+XHaHvbR0G73j7fxiTB+/L3t8RhJv3ZCNw+Xmon8vZ/0euamOEN1FRkYGGzduZOvWrWRmZnLllVeSnZ3Nc889x9SpU0lN9fTVVVtbyw033MALL7zA4MGDycrKYvTo0Vx77bUBCXXw4x671vrZJqOpwH5/Lbujdh2o5uvNxfx22pCAXT06rHcc82/I5rIXv+Xi2St4+arxjOufFJDPEkK07Gh71oEyevRoBg0ahMVi4fe//z0pKSnYbDb69+9PeXk5c+bMAaCsrIzt27dzzz33EBER0dgBYmlpKU6nE4vF/y3ifk87pVQ2kKi1XtFs+vVKqVylVG5RUZG/P7ZF76wqQCm4YFzfgH5OZmoMC2adQEpMBJe9+B3fbC4O6OcJIYKH0+nk8ccfZ8mSJdx///0MHjyYSy+9lJ///OccPHiQyspKJk6cyMKFC3E6nTz55JOMGzeOCy64ICChDn4OdqVUEvA0cHXz17TWs7XWWVrrrIafKIGktebtvAJOGJhMWmLgD2z2TYhk/g3ZpCdFcfXclSyTcBcirGmt2bp1KwsWLMBisTBv3jzsdjsJCQmcc845LFiwgD179tC3r2fHMiIigltuuYXx48fz/fffM3369IDV5s+DpzZgAXCn1tqnPoMDaf2ecgpKa7j15MFd9pmpsRG8ft3xzHzxW65+eSUvXTGeSYNTuuzzhRBd5/HHH2fw4MFMmDCBV155hZNOOgmHw4HT6eRf//oXFRUVXHnlldx4443MmjWLAwcOkJmZyQcffEBubi5XXHEFe/bs4YEHHuDnP/+5X2vzW18xSqlZwEPAWu+k57TWb7U0b1f0FfPYknz+9cVmVv5lGskxXdu/S0llHTNf/JZtxVW8eEUWkwcH/heKEN3Nhg0bGDZsmGGfr7UO6JWvLf37uryvGK31c1rrRK31VO+jxVDvKkt+3EdWRlKXhzpAckwEr183kQEp0VwzN5cvN3XNMQUhRNcJ5u4MwrJLgV0HqtlYWMGpw3saVkNStI3Xr5vIwNQYrnsll5x8w08SEiLshGufTZ39d4VlsH/tPXA5dWgPQ+tIirbx+rXHMyg1huvn5fGFhLsQfmO32ykpKQm7cG/ottdut3d4GWHZpcCyzcX0jItgYGq00aWQGG3jtWuP57KXvuWGV/J4/vJxnHSMsRscIcJBWloaBQUFdNXp012p4UYbHRV2we52a5ZvKWHKkNSgaQM7LNzn5fHszLFMM7CZSIhwYLVaj7gRhfAIu6aY/H0VlFTVc8Kg4DrNMCHKxmvXTOSY3rHMei2PxesLjS5JCBGmwi7Yv93qucNR9sBkgys5UnyUlXnXHM+IPvH8+rVVfPT9XqNLEkKEobAL9tW7DtIrzk7fhEijS2lRfKSVeddMYEy/BG5+YzUfrNtjdElCiDATfsG+8yDHpScYXcZRxdqtzL16AuPSE7n1jdW8t2a30SUJIcJIWAV7SWUdOw9Uc2y/4A528NyN6eWrxzNhQBK/fWsN/11VYHRJQogwEVbBvmbXQQCOS080uBLfRNks/OfKCWQPTOb3C9YyP3eX0SUJIcJA2AW72aQY1Tfe6FJ8FmkzezoLG5R5LX8KAAAgAElEQVTCH95exxvf7TS6JCFEiAu7YB/aM5ZIm9noUtrFbjXzwq+ymDo0lTv/+z2vrjC8c0whRAgLq2DfsLeckX3jjC6jQ+xWM89fPo5pw3pw17s/MPurLUaXJIQIUWET7EUVdRRX1nNMr9AMdoAIi5lnZ47jrNG9eejDjfz9441h1w+GECLwwqZLgY2FnjuUD+sdusEOYLOYePLi44iLtPJszhbKax088IuRmEzB0T2CECL4hU2wb9jrCfZjesUaXEnnmU2KB88dSXykledytlBe4+TRi8ZgNYfNDywhRACFTbBv3FtBrzg7idE2o0vxC6UUfzz9GOLsVh75eCOVdU6euXRsyB0YFkJ0vbDZBdxQWMExvUN/b725WVMH8tB5o/gifz9XzPmOshqH0SUJIYJcWAS7w+Vm8/6KkD5wejSXHp/OUxcfx+pdpVz07+XsOVhjdElCiCAWFsG+vbgKh0sztFeM0aUEzNlj+vDyVRPYc7CG85/9pvGYghBCNBcWwb61uAqAzJTwDXaAEwelsGBWNgC//Pdylv4UfneOEUJ0XngEe5En2AcEwa3wAu2YXnH879cnkJYYyVX/WcnbedJ5mBDicGER7NuKK0mJiSDObjW6lC7ROz6S+Tdmc3xmErcvWMtTn/0kFzIJIRqFRbBvLaoisxvsrTcVZ7fynysncP7Yvjz2ySZ+89Yaah0uo8sSQgSBsAj2bcVVDOxmwQ6eq1Qf/eUY7jhtKO+t2cOM2SvYX15rdFlCCIOFfLCXVTsoqapnQEr3C3bwXMj065MG8fzl4/hpXwW/+Ncy1hUcNLosIYSBQj7YtxZXAuF/RkxbThvRi3dmnYDZpPjlv5ezcK3cS1WI7ir0g70bnRHTlmG943jv5hMZnRbPLW+s5pGPN+J0uY0uSwjRxfwa7Eqpnkqppf5cZlu2l1RhUpCeFNWVHxu0UmIieO3aiVwyIZ3ncrbwqznfUVxZZ3RZQogu5LdgV0olAnOBLt11LiitoXd8pPR82ITNYuJv54/iHxeOJm9HKWc+tZS8HQeMLksI0UX8mYYuYAbQpde67zpQTVpiZFd+ZMj4ZVY//nvTCditZmY8v4L/LNsm57sL0Q34Ldi11uVa67LWXldKXa+UylVK5RYV+e9S+ILSGvpJM0yrRvSJ5/2bJzF1aA/uX/gjN7+xmvJa6SFSiHDWZe0XWuvZWussrXVWamqqX5ZZ53Sxr6JW9tjbEB9pZfbl4/jj6cfw8Q+FTH9yKXk7So0uSwgRICHdML3nYC1aQ1qi7LG3xWRSzJo6kPk3eDoRu+j55Tz92U+43NI0I0S4CelgLyitBqCf7LH7bFz/RD68bTJnje7No59s4pIXVkj/7kKEGb8Hu9Z6qr+X2ZpdBzyBlCZt7O0SZ7fyxIxjefSXY1i/u4wznlzKe2t2y4FVIcJEyO+xW0yKXnF2o0sJOUopLhiXxqJbJzMgJZrb3lzDrFdXyTnvQoSBkA72XaU19EmIxGxSRpcSsjJSonln1gn86Yxj+Hzjfk557Es+WCfdEQgRykI62AtK5Rx2fzCbFDdOGciiWyeRnhTFza+v5qbX8mTvXYgQFdLBvtu7xy78Y3DPWN6ZdQJ3nDaUT37cx7THvmT+yl3S9i5EiAnZYHe63BRX1tE7XtrX/cliNvHrkwax6NbJDO4Rwx/eWceM51fw074Ko0sTQvgoZIO9qLIOt4ZeEuwBMaRnLG9dn80jF4wif18F059ayj8Wb5S7NAkRAkI22AvLPHcKkjNiAsdkUswYn87nv5/C2WP68MwXWzj18a9Ysr5QmmeECGIhH+w9JdgDLjkmgscuOpbXrzsem8XE9fPyuOylb9mwt0v7exNC+Ch0g917b09piuk6JwxM4aPbJnP/L0awfk85Zz61lD//73tK5OwZIYJKSAe7zWwiKcpmdCnditVs4ooTMsi5fSq/ys7grZW7mPqPHP795RZq6qX9XYhgELrBXlZLj7gITHJxkiESomzc94sRLP7NZLIyEnn4o41M+ccXvLpiBw65HZ8QhgrpYJcDp8Yb1COW/1w1gfk3ZJOeFMVd7/7Azx/9kndX78YtPUcKYYiQDfZ95bX0lPb1oDFhQBILbszmP1eOJzrCwm/eWsMZTy5l4do90jWwEF0sJINda01heS29ZY89qCilOOmYHiy6ZRJPX3IcTrebW95YzSmPfcmC3F3SRCNEFwnJYC+rcVDrcMsZMUHKZFKcPaYPS347hWdnjsVuNXPH2+uY+o8c5i3fLhc5CRFgIRnsDac6yjnswc1sUkwf1ZtFt07iP1eOp1e8nbvfW8+JD3/OY59sYn9FrdElChGWLEYX0BH7yz3nTUuwh4aGJpqpQ1NZsfUAL329lac//4nncjZz9ug+XD1pACP7xhtdphBhIySDvaE72ZQYOYc9lCilyB6YTPbAZLYVVzH3m+3Mz93Ff1fvZkJGEpdn9+fUET2JsJiNLlWIkBbawR4bYXAloqMGpERz3y9G8NtThrAgdxcvf7OdW95YTVK0jfOP68vFE9IZ1CPG6DKFCEkhGuz12CwmYiNCsnzRRHyklWsnZ3LViQP4enMxb363k5e/2c6LX29jQkYSF0/ox+kjexFlk/9rIXwVkn8txRV1pMZEoJRcdRouzCbFlCGpTBmSSlFFHe+sKuDN73byu/lruevdHzhtRC/OObYPkwalYDGH5DF/IbpMSAZ7UWWdtK+HsdTYCG6cMpAbfpbJd9sO8O6a3Sxat5f/rd5NSoyNs0b34Zxj+3BsvwTZuAvRgtAM9oo6uddpN6CU4vjMZI7PTOa+X4wgJ7+I99bs5nVvc02feDunjujFqSN6MiEjSfbkhfAKyWAvrqzn2H4JRpchulCExcxpI3px2ohelNc6WLJ+H4vXF/KGN+QTo6z8fFhPTh/RixMHpRBpkzNrRPcVcsHucmsOVNWREiNnxHRXcXYrF45L48JxaVTXO/kyv4jF6wtZvL6Qt/MKsFlMHD8gqbHNflCPGGmyEd1KyAV7aXU9bi3nsAuPKJuFM0b15oxRval3ulmxtYQvNxXx5aYi/rpoA39dtIHe8XamDEll8uBUJgxIIlVOkxVhLuSCXc5hF62xWUz8bEgqPxuSyt3A7oM1fLWpiC/zi1i0bi9vrtwFwMDUaE/b/YAkJmYmyxXMIuyEXrBX1ANIU4xoU9+ESC6ZkM4lE9JxuNx8v7uM77Yd4NutJSxcs4fXv90JQP/kKMalJzKmXwJj+iUwrHesXP0qQlroBXtjdwIS7MJ3VrOJsemJjE1P5MYpA3G5NT/uKefbbSV8t+0ASzcX89/VuwGwmU0M6xPHsWnxjOmXwPA+cWSmxGCzyFk3IjT4NdiVUi8Bw4FFWuu/+nPZDRqCXdpJRWeYTYpRafGMSovn2smZjX38r9l5kDUFB1m76yAL8gqYu3wHAFazYmBqDMN6x3FMr1iG9oplWO84esTKhXIi+Pgt2JVS5wNmrXW2UmqOUmqw1vonfy0fwOlys6WoEpvZRJw95H5siCCmlKJ3fCS9R0VyxqjegOcMrC1FlWzYW87Gwgo27i1nxdYS/ufdsweItVvITI0hMyWazJRoBqRGk5kSw4CUaDnlUhjGn+k4FZjvHV4CTAL8Guzr95Tzxne7GJgaLXtJIuDMJsWQnrEM6RnLOU2mH6yubwz6LUVVbCuu4ttmgQ/QO95OWmIkfRMi6ZsYSd+EKO9zJGmJkditEvwiMPwZ7NFAwzf7ADC26YtKqeuB6wHS09M79AF9EiK59+zhjM9I6kSZQnROQpSNiZnJTMxMPmx6Tb2LbcVV3kclW4ur2F1aQ+6OUj5Ytxdns3u/Jkfb6BlnJzU2gtTYCHp4n1NjI0iNiaBHnJ2UGBsxERbZkRHt4s9grwQarvOPodndmbTWs4HZAFlZWR26u3FqbARXnTigMzUKETCRNjPD+8QxvE/cEa+53Jp95bXsPljD7tIadh+soaC0hqKKWvZX1LFpXwVFFXVHhD+AxaRIiLISH2klIcpGQqSV+CgrCZE2EqKsJERZiYmwEGWzeJ4jzN5xc+N0OfB7JK01TrfG4XLjcGrqXC4cLo3D6cbhclPvcnvGXW4czmbjLjf1zkPj9Y2vNzz0oWlNXqt3arIyPAfwA8mfwZ6Hp/llBTAGyPfjsoUIaWaTok9CJH0SIhmf0fI8brfmYI2Dooo6iirq2F9RS3FlHQerHRyscVBW7eBgTT17y2rZWFjBwep6qup9u3+szWwiKsKM3WLGZjERYTFh8z48w+bGaRFmExFWE1azCZNSmE2eh0kpTIrG4abTzSa8rys0ntAE0Bo0Grc+NOx9Ca21d1qT+dyesHUd9uz2PLtamd4w7jp8etMQdrj0oeB1HhoPBLNJYTUrbGbvOjabsDY8m02U1wT+PgP+DPZ3gaVKqT7AGcBEPy5biLBnMimSom0kRdsY2ivWp/fUO92U1TioqnNSWeekut5FVZ2Tqnon1XUu7zQnlXWe6XVOF/VON3XOQ3uZdQ7PMuocLuq9e5913r1Wl9sTti6tcbvBrT3DukO/uX1jNXs2GBaTyfusDj2bW5neZP4Iq6Vxus3iCdOGh82sPMOWZuON4Xto3NYkjK1mdVg4W73zHVr+ofeZTcY3m/kt2LXW5UqpqcApwN+11mX+WrYQomU2i6mxXb4rae3ZO24IfJd3XGuNQoEC5XnCpJR32PMMHDau8JyVpPBs3ETn+fWcQa11KYfOjBFChCmlFBazCr0rHLsJOaIihBBhRoJdCCHCjNKBPArS2ocqVQTs6MQiUoBiP5XjT1JX+0hd7SN1tU841tVfa53a1kyGBHtnKaVytdZZRtfRnNTVPlJX+0hd7dOd65KmGCGECDMS7EIIEWZCNdhnG11AK6Su9pG62kfqap9uW1dItrELIYRoXajusQshhGhF0AW7UuolpdRypdRd7ZnHl/cFsi6lVLxS6iOl1BKl1P+UUjallEUptVMpleN9jDKgrhZrUErdr5RaqZR6xt81+VjXrCY1rVFKPd8V68v72T2VUkuP8rpVKbVQKbVMKXV1a9MMqCvdu14+V0rNVh59lVIFTdZZm6fCBaCuFmvogr/Jtuq6v0lNG5VSdwZyfbWUAa3MF/D8Cqpgb3oXJiBTKTXYl3l8eV+g6wJmAo9prU8FCoHTgdHAG1rrqd7H9wbUdUQNSqlxeHrinADsV0pN6+q6tNbPNdQELAVeaKlWf9blrS0RmIvn/gGtuQXI01qfCFyolIptZVpX13UDMEtrfTLQDxgFHA882GSdFRlQ1xE1dMHfZJt1aa3vbfId+wF4paVa/VhWSxnQvO4uya+gCnZavguTL/P48r6A1qW1flZr/Yl3NBXYj6eHy7OUUt95t8j+7lqjzbpaqWEK8I72HGBZDEw2oC7As7cH9NRa57ZSq7+5gBlA+VHmmcqh+r8CslqZ1qV1aa3/orXe4B1NxnORy0TgWqXUKqXUQ36uyae6WqlhKoH9m/SlLgCUUuOBAq317lZq9YtWMqC5qXRBfgVbsDe/C1NPH+fx5X2BrgsApVQ2kKi1XgGsBKZprScAVmC6AXW1VEPQrC/g18BzR6nVr7TW5T70PNrl3zEf6wJAKTUDWK+13gN8hCcYxgPZSqnRBtTVUg1Bs76A24CnvcMBXV9wRAY01yXfrWAL9qPeheko8/jyvkDXhVIqCc8XqKENdp3Weq93OBfw689RH+tqqYZgWV8m4CQg5yi1GsGI75hPlFKZwO3Ab7yTvtFaV2itXcBqjFlnLdUQLOsrAeihtd7inRTQ9dVCBjTXJd+tYAv2hrswgecuTNt9nMeX9wW0Lu+BkgXAnVrrhn5w5imlxiilzMC5wNqurquVGgxfX16TgW/1oXNuA72+fGXEd6xN3nblN4Crm+ytLlZK9VZKRQGn4mlL7mot1WD4+vI6B/iwyXjA1lcrGdBc13y3PLenCo4HEIfnj/kxYIP3H/nXNuaJb2maAXXNAkrx7H3m4Gn/GwmsA77Hc8DGiPV1RA14NujLgCfx3MJwQFfX5Z3vIeD8o9UawO9ajvf5ZODmZq/1B9Z7189KwNzSNAPqegTY2+Q7NgXPL56N3vV2cyBq8qGuI2oI9N+kL3V5p78OjD1arX6spXkG3NvC32OX5FfQXaDk3Ss5BfhKa13o6zy+vC/QdRmho3UppSKBM4FVWuutwVJXsFCeWzxOAhZr795xS9NE60L9OxAoXZFfQRfsQgghOifY2tiFEEJ0kgS7EEKEGQl2IYQIM4bcZDwlJUVnZGQY8dFCCBGy8vLyirUPt8YzJNgzMjLIzc014qOFECJkKaV8ule0NMUIIUSYCblgzy+s4KtNfu3ATgghwoohTTEd5XC5Oe2JrwDY+H+nY7eaDa5ICCGCT0gFe43D1Tict6OUEwelGFiNECIQHA4HBQUF1NbWGl2KYex2O2lpaVit1g69P6SCvelFst9tOyDBLkQYKigoIDY2loyMDJRSRpfT5bTWlJSUUFBQwIABAzq0jJBrY2+wcvsBo0sQQgRAbW0tycnJ3TLUAZRSJCcnd+oXS8gG+6qdpdQ73UaXIYQIgGANdZfL1fZMbSgqKmpzOZ3994dWsHubYsZnJFLrcPPDHulgTwgRGB988AF/+MMfGsf379/PCSeccNg8X3/9NStWrGDmzJlHvP/6669nw4YNR0y/7LLLyM/P93/BTYRUG3uD8RlJrNxeysptBxibnmh0OUKIMBQTE0NUVBSff/45N998M8OHD6dfv35ceOGFFBUVMXz4cBYuXMidd97J/v37+fDDD+nVqxd79+5l0KBB1NfXt7jnbbVaiY31673QjxBSwa69u+wpMRFkpkTz3bYD3DBloMFVCSHCzauvvsqjjz5KaWkpFouF22+/ne3bt/OnP/2Jp59+mhNPPJHVq1cTGxtLZWUl9fX1lJWVER8fz6pVq4iKijpseSeeeCJaa2w2G+vWrWPGjBnYbDYACgsLWb16NZGRkS2V0iEhFewNlIITB6XwzqoC6pwuIixyPrsQwn8uu+wy0tLSyMnJ4a677uLhhx+msLCQqKgo0tPT+ec//8mMGTPYvXs3mzdv5uDBg6xfv56CggKUUkfsqS9btqxxeMyYMXz66aeN4Z+ZmenXUIcQC/ampztOGZLKvBU7yNteygly2qMQYen+hev5cU+5X5c5vE8c9549os35qqqqWLRoESNGjGDTpk08//zzAFxyySXs3r2bk08+mUmTJrFhwwbKysq48cYbsVgsvPjii60u0+FwUFNTc9gevcXi/xgOrYOnXgrIHpiM1az4UroXEEL42dNPP81tt93GuHHjuPDCC9m/fz/nnXceqampnHXWWaxZs4aKigouvfRS/vWvf7Fq1SruuOMO7r333qMud/78+UybNq1x3OVyYTL5P4ZDa4+9yXB0hIXxGUnk5Bdx5/RhhtUkhAgcX/asA+Gaa65h1KhR5OTkoJTigw8+AGDatGmNwxs3bmTgwIH85je/4YknnuDee+/lD3/4A4mJidTV1R2xzJKSEh5++GHeeeedxmnFxcUkJyf7vf7Q3GP3tl9NGZJK/r4K9pbVGFyRECKcNG0qcTgcuN2HXzPjcrmOOBf98ccfZ9SoUTz88MOcdtppVFdXN762c+dOzjjjDG677TaGDBmC2+0mPz+fefPmMXToUL/XH1J77M2dfEwP/vbRRj75cR+/ys4wuhwhRJiorq7mxhtv5N577+WTTz7hySefRCmFxWLh9NNPR2vNCSecwPPPP8+6deuor69vnAfgqquuYv369fTu3ZuSkhLOPvts7rvvPs477zwATCYTv/3tb4mKiuJvf/ub3+sPqWDXTY+eAoN7xjKoRwyL1u2VYBdC+E1UVBTLli1rbCaZPn16q/OOHz+e119//bBpc+bMOezMmDVr1hxxpsyHH37ox4oP1+GmGKVUT6XUau/wS0qp5Uqpu/xX2tE++9Dw9FG9+W77AfZXdN+e4IQQ/teZtu/mId7VXSR0po39n0CkUup8wKy1zgYylVKD/VPakXQL084c1RutYfEPhYH6WCFEF2v+67y76ey/v0PBrpQ6GagCCoGpwHzvS0uASZ2qyJfPbzI8pGcMg3rEsHDt3kB/rBCiC9jtdkpKSrptuDd022u32zu8jHa3sSulbMDdwHnAu0A0sNv78gFgbCvvux64HiA9Pb0jtdLS/7NSivOO68s/FueztaiSzNSYDi1bCBEc0tLSKCgooKio+16j0nCjjY7qyMHTPwHPaq0PetuNKoGG62FjaOVXgNZ6NjAbICsrq3Ob4mbtVb8cl8Zjn2xifm4BfzrjmE4tWghhLKvV2uEbTAiPjjTFTAN+rZTKAY4FzuZQ88sYYLtfKmuBbrGVHXrE2Tn5mB68nVeAwyV9tAshurd2B7vW+mda66la66nAGjzhfrlS6jHgImCRf0s8UkvHly8e34/iyjoWr5eDqEKI7q1TV556A74czwHUFcBJWmtD7n4xdWgPBqRE8/yXW7vtQRchhAA/dSmgtS7VWs/XWgd2d/koeW02Ka6bnMn3u8tYvrUkoGUIIUQwC9G+Ylqefv7YvqTERPBczpauLUgIIYJISAV7Ww0sdquZG6dksvSnYpZtLu6SmoQQItiEVLA3UC0ePvW4bGJ/+iZE8rePNuB2S1u7EKL7Calg9+WYqN1q5vbThvDD7nLeXlUQ+KKEECLIhFSwN2irP51zxvRlfEYiDy7aIJ2DCSG6nZAK9tYuUGrOZFI8fMFoahwu7nl3vZz+KIToVkIq2Bv40gHmwNQYfjttCB+vL+TVb3cGvCYhhAgWIRnsvrrhZ5mcNDSVBxauZ9XOUqPLEUKILhFSwd7eFhWTSfH4jGPpFW/nurm5bC2qDExhQggRREIq2Bu052YkCVE25l41AYDLXvyWXQeq23iHEEKEtpAK9o4eAs1MjWHu1ROorHNy/nPfsH6PId3ZCCFElwipYG9wtAuUWjOybzzvzDoBq0lx0b+X8/7aPQGoTAghjBdSwd7Z0xYH94zlvzedyNBesdz6xmpuX7CW0qp6P1UnhBDBIaSCvVEnbvjdK97O/BuyueXkQfxv9W5OejSHecu3U+d0+a08IYQwUkgFu7+uM7KYTfz+1KF8eOtkhvaM5e731jPl7zm8uHQrB6tlD14IEdpCKtgbdGKH/TBDe8Xy5vUTmXfNBPonR/HXRRuY8OBn3PRaHovW7aWsxuGnTxJCiK7TkZtZhxWlFJMHpzJ5cCrr95Txdl4B763Zw4ffF2I2KcalJ5KVkciYfgkc1y+BHnF2o0sWQoij6vbB3tSIPvGM6BPPX6YPY82ug3yRv5+lPxUz+6utOL1dACdF2xiYGs3A1BgyU6NJS4yiZ5yd3vF2esRGYDGH5I8gIUQYCclgV+25QqkDLGYTWRlJZGUkccdpUOtwsX5PGWt2lbF5fwVb9lfxyY/7KGl2Ro1JQUpMBCkxESRGW0mIspEUZSMxyjPcMC3ObiXObiHWbiXWbiHKZg74v0kI0X2EVLAb1Umj3WpmXP8kxvVPOmz6wep69hysZV95LYXltewtq6WwrIYDVfUcqKpn78FySqvrOVjjOGrtZpMiJsJCXKSF2AhP2Mc2hv+hDUBcpPXwcbvFs5GItGK3mgO8FoQQoSKkgr1BsOzbJkTZSIiyMbxP3FHnc7k15TUOSqvrKa12UFHroKLW6X04KD9i3MnugzVsbJzuoK2bQdksJm/IHwr7OLuF+MiG4cNfi/e+3vCazSJNSEKEi5AKdl/7Yw82ZpMiMdpGYrStQ+/XWlNV72qyQfCEf3mNZ7y81kF5jee5rMZBeY3nueBAdeM0h+vo685uNbUa+kduEA79gmhoUpINgxDBI6SCvUF3a45WytNUExNhoXd8+9+vtabW4fZuAByHbQgaNgING4qG10qq6tlaXOWd5sTVxk+GSKvZ05Rkb32jEGs//NdEXJONhDQlCeE/IRXsciOkjlFKEWkzE2kz07MDp2tqramudzXu/Vc02wiU1zioqDt82oGqerYXV1FR66SsxtF4VlFrWmpKOrQhaLZBOGKaFbvVJAeghfAKqWBvIH+/XUspRXSEhegIC73jI9v9/hZ/MTRuHA7fIDRtZioorW78ZVHvdB/1M8wmRbTNTIy3zhi75xdOtM07HmFu/DfE2ptOtxAd4XlfjN0zLdpmwWySL5kIXSEZ7CK0dPYXA3hOOT10POHwYwxlNQ4q6xxU1bmorHNSWeukqt5JZZ2TfeW1h6bXtd2k1CDSaj5sgxBp9dTf8BxlM2O3ep490xrmMRFptTTOc9j7vMMRFvl1IQKrQ8GulIoH3gTMQBUwA3gOGA4s0lr/1W8VNiEtMd2X3eoJ0tTYiA4vQ2tNndNNZZ2TKm/QH9oIuKhqZXp1nZMa74alqKKOGoeL6noXtfUuqh0unzcWDUyKxpBvunGIsHpCP8JiJsJqIsJs8jxbPNNtFtNhr9uavR5hMR+ax3po3GpWWE0mrBYTFpPCZjZhkl8kYa2je+wzgce01p8opZ4DLgbMWutspdQcpdRgrfVP/ivzcB3pj10IpVTjBiIlpuMbiObqnW5qHC5q6l1Nnp3U1Lu9GwEntd6NQY3Du0FomNc7f3W9izqn55fFgap66pxu6pwu6hzuQ8NOt9+OM5lNqjHkLWaF1WzyPhSWJsNWs3djYDE1DlstJqwm72tmEzazwuRdXsOzWSnMJhNmE4c/KzCbTZjV4fM3Pnunm5tPMzd7TSlMJjzPCsDz7BlXKOVpsm0YNymg2bhCoZosw+T9FdV03LOc0MubDgW71vrZJqOpwGXAE97xJcAkwO/B3tn+2IUIBJt3bzo+0hrQz9Fa43R7fnXUOTxBX+88PPg9GwLXYdPrXRqny43D5cbh0jhcbpze58Zxt5t6p8bp9szXdNjh0lTWOZu8xzPN6XJT79NaapUAAAeWSURBVJ3mdntqc2ndOBxOmm40PBuIJhsRaLy4RuHZEHhn8wzTcFzQM/3U4T158LxRAa23U23sSqlsIBHYDuz2Tj4AjG1h3uuB6wHS09M787Fy8FR0S0qpxr3omIjgPzzWEPBu7wbJ1fyhNS6X99ntxuUGp9uNu+FZa5yuho3F4dPcWqM1uDW4tWccvMNuz7PGszE8NA/QbFw3LufQ9IbaG8YPLafJPN5nl/vQ9TUN+5268T2e17yze1/XjOzbgXOW26nD3w6lVBLwNHAB8Dug4XSJGFroDlhrPRuYDZCVldWhzXl47QMIEd5MJoVN2vIN0aHLBZVSNmABcKfWegeQh6f5BWAMnj14IYQQBujodeDX4Glu+YtSKgdPc9LlSqnHgIuARf4p73DSxC6EEG3r6MHT5/Cc3thIKfU+cArwd611mR9qa1UoHqUWQoiu4rcjMFrrUmC+v5YnhBCiY0KsSz5pixFCiLaEWLB7SEOMEEK0LqSCXQ6eCiFE20Iq2BvIsVMhhGhdSAW77LALIUTbQirYG0gnYEII0bqQCnZpYxdCiLaFVLA3kDZ2IYRoXUgGuxBCiNaFVLBrOXwqhBBtCqlgbyAtMUII0bqQCnY5eCqEEG0LqWBvIAdPhRCidSEV7LLHLoQQbQupYD9EdtmFEKI1IRXsclaMEEK0LaSCvYG0sQshROtCKtiljV0IIdoWUsHeQHbYhRCidSEZ7EIIIVonwS6EEGEmJINdydFTIYRoVUgFuxw8FUKItoVUsDeQ/XUhhGhdSAW7XKAkhBBtC6lgbyBN7EII0Tq/BrtS6iWl1HKl1F3+XG4DaWMXQoi2+S3YlVLnA2atdTaQqZQa7K9lH/lZgVqyEEKEPn/usU8F5nuHlwCTmr6olLpeKZWrlMotKiry48cKIYRoyp/BHg3s9g4fAHo2fVFrPVtrnaW1zkpNTe3QBwzpGcuiWyeRlZHUuUqFECKMWfy4rEog0jscQwAOzEbazIzoE+/vxQohRFjxZ/jmcaj5ZQyw3Y/LFkII4SN/7rG/CyxVSvUBzgAm+nHZQgghfKS0H88hVEolAqcAX2mtC48yXxGwoxMflQIUd+L9gSJ1tY/U1T5SV/uEY139tdZtHqT0a7B3FaVUrtY6y+g6mpO62kfqah+pq326c10heeWpEEKI1kmwCyFEmAnVYJ9tdAGtkLraR+pqH6mrfbptXSHZxi6EEKJ1obrHLoQQohVBF+y+9BDZ0jyB7lmyreUrpeKVUh8ppZYopf6nlLIppSxKqZ1KqRzvY5QBdbVYg1LqfqXUSqXUM//f3vmESlWGcfj5JS4K+mNRElFR6zKo1KTEm4hEBUUELtpJEJeMWrSRFhKY0EaIIKlWFeQiWgXFJYhLYlSalSbaolaW4SaytfxanO/iMPOdmQ/v+dfwPjDcmW++M/e5L9/5zbln7nlv006FXosjTj9JereLeqXvvV7SkSnPr5X0maSjknbXjfXgdUeqy1eS3lPFbZLOjdTsyvp1rM4r69DBPjnL6/URp7OS9rZZr1wG1MxrPb8GFewlHSJzc9ruLFn4+s8BB23vBP4CHgM2AIdtL6TbqR68JhwkPUB1lfAm4IKkHV172T604gQcAd7PuTbpldzWAR9Q9Taq4yXgB9sPA89KurZmrGuvF4BF29uB24F7gc3AGyM1a7TDXqHXhEMH++RML9v7RtbYL8CHOdcGtXIZMO7dSX4NKtiZ0SFyypyS7Vr1sv2O7S/Tw5uBC1RX3z4p6fv0jtzklb5FXjUO24BPXX3AsgRs7cELqI72gPW2j9e4Ns0lYBdwccqcBS77fw08WDPWqZft12yfSQ9vorrI5SHgeUknJB1o2KnIq8ZhgXb3yRIvACRtBM7Z/qPGtRFqMmCcBTrIr6EF+9QOkVPmlGzXthcAkrYA62x/CxwDdtjeBKwFHu/BK+cwmHoBLwKHprg2iu2Ltv+ZMa3zNVboBYCkXcBp238CX1AFw0Zgi6QNPXjlHAZTL+Bl4O10v9V6wUQGjNPJ2hpasJd0iMzNabuzZNHrS7qRagGtnIM9aft8un8caPqfj5R45RyGUq+rgEeB5SmufdDHGitC0t3Aq8Araegb2//avgT8SD81yzkMpV43ALfY/i0NtVqvTAaM08naGlqwl3SIzM1pu7PkzNdPH5R8Auy1vdIH5yNJ90laAzwN/Ny1V41D7/VKbAW+8+W/uW27XqX0scZmks4rHwZ2jxytLkm6VdI1wE6qc8ldk3PovV6Jp4DPRx63Vq+aDBinm7VlezA34DqqnfkgcCb9kPtnzLk+N9aD1yLwN9XR5zLV+b97gJPAKaoPbPqo14QD1Rv6UeAt4Ffgrq690rwDwDPTXFtca8vp63Zgz9hzdwKnU32OAWtyYz14vQmcH1lj26h+4zmb6ranDacCrwmHtvfJEq80/jFw/zTXBl3GM2BfZn/sJL8Gd4GSCjpE5uaUbNe2Vx9cqZekq4EngBO2fx+K11BQ1X76EWDJ6eg4NxbU839fA23RRX4NLtiDIAiC1TG0c+xBEATBKolgD4IgmDMi2IMgCOaMCPYgCII5I4I9CIJgzohgD4IgmDP+A2ijS/bShp4NAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#%fig=使用PID控制器让滑块停在位移为1.0处\n", "def pid_control_system(kp, ki, kd, dt, target=1.0):\n", " system = MassSpringDamper(m=m, k=k, b=b, F=0.0)\n", " pid = PID(kp, ki, kd, dt)\n", " init_status = 0.0, 0.0\n", "\n", " r = ode(system.f)\n", " r.set_integrator('vode', method='bdf')\n", " r.set_initial_value(init_status, 0)\n", "\n", " t = [0]\n", " result = [init_status]\n", " F_arr = [0]\n", "\n", " while r.successful() and r.t + dt < 2.0:\n", " r.integrate(r.t + dt)\n", " err = target - r.y[0] #❶\n", " F = pid.update(err) #❷\n", " system.F = F #❸\n", " t.append(r.t)\n", " result.append(r.y)\n", " F_arr.append(F)\n", "\n", " result = np.array(result)\n", " t = np.array(t)\n", " F_arr = np.array(F_arr)\n", " return t, F_arr, result\n", "\n", "\n", "t, F_arr, result = pid_control_system(50.0, 100.0, 10.0, 0.001)\n", "print(u\"控制力的终值:\", F_arr[-1])\n", "#%hide\n", "fig, (ax1, ax2, ax3) = pl.subplots(3, 1, figsize=(6, 6))\n", "ax1.plot(t, result[:, 0], label=u\"位移\")\n", "ax1.legend(loc=\"best\")\n", "ax2.plot(t, result[:, 1], label=u\"速度\")\n", "ax2.legend(loc=\"best\")\n", "ax3.plot(t, F_arr, label=u\"控制力\")\n", "ax3.legend(loc=\"best\")" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "C:\\ProgramData\\Anaconda3\\lib\\site-packages\\scipy\\optimize\\_basinhopping.py:282: OptimizeWarning: Unknown solver options: approx_grad\n", " return self.minimizer(self.func, x0, **self.kwargs)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "[56.67106149 99.97434757 1.33963577]\n", "Wall time: 55.1 s\n" ] } ], "source": [ "%%time\n", "from scipy import optimize\n", "\n", "\n", "def eval_func(k):\n", " kp, ki, kd = k\n", " t, F_arr, result = pid_control_system(kp, ki, kd, 0.01)\n", " return np.sum(np.abs(result[:, 0] - 1.0))\n", "\n", "\n", "kwargs = {\n", " \"method\": \"L-BFGS-B\",\n", " \"bounds\": [(10, 200), (10, 100), (1, 100)],\n", " \"options\": {\n", " \"approx_grad\": True\n", " }\n", "}\n", "\n", "opt_k = optimize.basinhopping(\n", " eval_func, (10, 10, 10), niter=10, minimizer_kwargs=kwargs)\n", "print(opt_k.x)" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "t=0.5000000000000002, x=1.07098, u=0.315352\n" ] }, { "data": { "image/png": "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ehBstmbTOrn/utbb1rmFurKNzv87Ai+RHBf6rlOrgn05MA34NzARWGrRenvcAw88wDnnnMMLL7zAk08+2fSfM2PGDIwxTJ8+nY8//pj169ezcuVKTjvtNP70pz9xww03YLPZuPPOOy2p47VVe/jlv1eSEu/ghblTmTwkveOFeqHEODu5cUnkpid1e13GmIAB3/xP90AtEmerAFcq3Dod7CJyCjDGGPNws8lPA6+LyAnAGOCz7hR1+8LVrNld0Z1VHGbMwD7ces7YdudZv349//rXv5g3bx5z5szB4XAwe/ZsAO68804uuugihg0bBsCIESN45plnyM/PZ+nSpVRVVXHNNddw3HHHdbvWJz/Zyh2vrmFSXhqPXDyZfn0Sur1O1TERIc4hxDn0VEwV3YL+BBtjpvsf328V6hhjtgOnAYuBGcaYtjs+I9jLL7/Mbbfd1vT6scceY/v27RhjePTRRxk0aBAAS5YsYfPmzdxyyy3MmzePH/zgB2RmZrJz585ubd8Yw0PvbeSOV9fwrbH9eH7uFA11pVSnWXblqTFmN/CiFevqqGUdKr/+9a/55JNPePfddwG45JJLeOGFF5g5cyZTp04lPj4egLvuuoupU6eSnZ1NYmIizz33HOeffz4ul4unnnqKO+64gzlz5nRq28YY/vjmOh79cAuzjhrE3RdM0LFZlFJdosnRjpkzZ1JUVMRbb73FWWedBcDChQtxOBxMmjSJa665hu9973vMmzePn//85yxYsIBJkyYxa9asTm/rgXc38uiHW5hzbB73XjhRQ10p1WWaHq00HiibM2cO5513HitWrODuu+/m/vvvZ9q0aezbt4/HH3+8af5x48axePFipkyZwqRJk5g3bx6JiYmd2uYzS7fz4HsbuXByLr8/b5wegFNKdUvEDAIWKWpra2loaODpp5/G4Th893g8Hux2O263m4aGBu677z4WLVpEdnY2b731FmPGjOnU9l5btYff/e8bZozO4a5Z4/XKSqVUt0XMIGBr165l9OjRPV5Ld+3atYu0tDSSk9sfpyXQv2/59nK+N/8zJuT25ZkrjiWxB85vVUpFL0sHAespxpioa7E2ninTnkBfnvsq6rjy2S8ZkJbA4z8s1FBXSlkmYvrYExISKCsr65FxHHpS47C9CQmHTlusd3u48tnlVNe7mX9JIWlJ1gw/oJRSEEEt9tzc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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#%fig=优化PID的参数降低控制响应时间\n", "kp, ki, kd = opt_k.x\n", "t, F_arr, result = pid_control_system(kp, ki, kd, 0.01)\n", "idx = np.argmin(np.abs(t - 0.5))\n", "x, u = result[idx]\n", "print (\"t={}, x={:g}, u={:g}\".format(t[idx], x, u))\n", "#%hide\n", "fig, (ax1, ax2, ax3) = pl.subplots(3, 1, figsize=(6, 6))\n", "ax1.plot(t, result[:, 0], label=u\"位移\")\n", "ax1.legend(loc=\"best\")\n", "ax2.plot(t, result[:, 1], label=u\"速度\")\n", "ax2.legend(loc=\"best\")\n", "ax3.plot(t, F_arr, label=u\"控制力\")\n", "ax3.legend(loc=\"best\");" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.4" } }, "nbformat": 4, "nbformat_minor": 1 } ================================================ FILE: 4.scipy/6.scipy-signal.ipynb ================================================ { "cells": [ { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "import pylab as pl\n", "import numpy as np\n", "from scipy import signal" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "import matplotlib as mpl\n", "mpl.rcParams['font.sans-serif'] = ['SimHei']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 信号处理-signal" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 中值滤波" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "True\n" ] }, { "data": { "image/png": "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hx7gY+PYlWOvhb+/vzZNf8WKFdx7770kJCRQVFTEnDlz2Lp1K0ePHqVbt274+flx48YNPvroIwCysrK0PPSJEyd48cUXeeedd+jUqRNpaWkkJiYSFRXF9evXmTZtGiEhIfzwww88+eSTrFixgnvuuaeePtnZ2VoVxt27d9u15eTkMGvWLK2MsI3KykqHTxpws/KjqiipUFiw5djVizZagx8+g2vnXLvPdl2g3/hGRZpyPH379mX16tUYDAbAEgWfPHkSgEuXLmlyPXv2ZPny5Zw4cQKTycTy5cs5ffo0M2bMIDo6mszMTAD69evHV199RXFxMdevX2fDhg2sW7eOBx98kKioKEaOHMnatWvr6WEwGJg/fz47d+6kc+fOdm1Xr15l+PDhbNy4kXPn7G349NNPM2bMGEBVlFQooHbnqYrYfRaTyaR1XNpSMRkZGVRUVNCuXTv69OljV5PlwoULWger0WgkPj5eawsNDeXMmTPodDoWL17MgAEDmD9/PoGBgcycOVOTCw8P591336V///68/vrrZGZmsnfvXl566SWeeOKJejpmZWWRnJzMF198QceOHeu1nzlzhuHDh3PhwgXtBwjgwIED7NmzR/usKkoqFLVKCqgceyvQRGTtLjZs2KB1SNZOxdTNY9vo2LGjVrSr7hDAlJQUoqOjMZvNbN68mYsXL9KrVy/mzZtHRkYG48ePR6/X88EHHwCWVMv8+fMpLi4mOTmZ3Nxcli1bZrfP9PR0MjIyyMrKokOHDg7PITc3l+TkZIdPH009kaiKkoo7jUC9deapjw139E7H7iFqjzKx5Y0BgoKCiIqKAizD/2pqajCbzbRv354RI0YAN2uvm81miouLycrKYuDAgej1en7++WeKiopYtWoVFy5coEePHnz++edERESQkpJCZmYmM2fOpF+/frRp04bIyEjWrl1rV9Vx2rRp3LhxAykle/fuJT4+3s65SykxGAwEBwcTGBhISUmJ3bDJ0tJSxo4dq31WFSUVito5duXY7whslRTrUllZyW+//cbYsWMJCwtjyZIlWlteXh4mk4l+/fqxdOlS1q1bR2JiIt27d2fu3LlMmjSJixcvsnnzZqKjozl+/DgpKSlkZWWRmJjIK6+8wrFjx/juu+9Yv349I0aMYN68eTzyyCMMHjyYuXPncvHiRVatWsWyZcu4cuUKANeuXWPN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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#%fig=使用中值滤波剔除瞬间噪声\n", "t = np.arange(0, 20, 0.1)\n", "x = np.sin(t)\n", "x[np.random.randint(0, len(t), 20)] += np.random.standard_normal(20)*0.6 #❶\n", "x2 = signal.medfilt(x, 5) #❷\n", "x3 = signal.order_filter(x, np.ones(5), 2)\n", "print (np.all(x2 == x3))\n", "pl.plot(t, x, label=u\"带噪声的信号\")\n", "pl.plot(t, x2 + 0.5, alpha=0.6, label=u\"中值滤波之后的信号\")\n", "pl.legend(loc=\"best\");" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 滤波器设计" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "sampling_rate = 8000.0\n", "\n", "# 设计一个带通滤波器:\n", "# 通带为0.2*4000 - 0.5*4000\n", "# 阻带为<0.1*4000, >0.6*4000\n", "# 通带增益的最大衰减值为2dB\n", "# 阻带的最小衰减值为40dB\n", "b, a = signal.iirdesign([0.2, 0.5], [0.1, 0.6], 2, 40) #❶\n", "\n", "# 使用freq计算滤波器的频率响应\n", "w, h = signal.freqz(b, a) #❷\n", "\n", "# 计算增益\n", "power = 20*np.log10(np.clip(np.abs(h), 1e-8, 1e100)) #❸\n", "freq = w / np.pi * sampling_rate / 2" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAf0AAADCCAYAAABDlxtEAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzs3Xd4VFX6wPHvOy29B1IgQAhdOoiAgAERQWBdXQtYURFdXV0X/SnqYgN3dRUXUBFdUFRUFESwARIwFKVLFwgQQEoa6X0mM+f3x52EBAIkEJIA5/M882Tmzr1z33szyXvPuaeIUgpN0zRN0y59proOQNM0TdO02qGTvqZpmqZdJnTS1zRN07TLhE76mqZpmnaZ0Elf0zRN0y4TOulrmlYrREQqWWapi1g07XKlk76mnYWIHBIRmxhsJ71nFZFT/o5E5EURuessnzteRN6qRhzJIuJV7nWi++eDIvLvk9ZtJiLelXzGzyLSqpLlfauw/+fOM0n3FJGlJy1bISJdK9lXfxHxPWnZ6yLyNxFpLyIdRCSq3HvVOt5zVdXvgoh4nPTeUBFp437eRUQeramYNK069FW2pp2GiDwN/AgUAy6gCfCFiDiBzsBmwAw8ISIPAy3d6wFEAd4iMtr92gwcV0rdVG4XdsDh3tebwK1AYbn3A4BopVSR+3UR4BCRcMATUCLSzL2er/t5nlLqOPAwcJOIjFBKba5sn+WO0wo8LyIFwGJgNFAAeAOfANMABTwG/LvcdnGA30kxA3gB2UqpQSct7wD8Um77QCAU4zyeLBp4W0TuV0qtdy9zAD3d2wiwETjsfq/Kx+ve9x3AROAP975GAX8FmrmPvRXwF6XUGvf6Vf4uABuAb0TkM+BzwArkAJOAocDfgJ/cF1BKKeWs5Pg17YLQSV/TTq8DsBrjn3w88KtSqreIxABvKKVuLl1RRNKBAqVUsrtkOQO4DjAppQpF5ArA6V7X1/2ZCiNx+wLPK6WeKr9zEckCStzJofRiwoyRoAYC4e79RGAk6LbAXOB9pdQ4EUkA+orISGAEkAE0B35wf6ZNKdVMKeUQkRuA/u7PmAbMB2527+NT4D3AqSqO5lWMkfQrc/KFxXfAlUChiPwZI+H6A4HAXnfNf7hSyhdAKfWhiPxqbCqr3R/TBCN5NnO/7gF8516/ysd7mngrU/52RJW/C25/A74BVgFzgBKgu4jEu+OOca/zCnBy7YemXTA66Wva6bncD5RSfQBE5FmM0pqXiCzASIpXux9PisjNwGTgOWAM0EdE/gl8hZHodgN/Af6JUUI3A7dglPJPKfEqpUpE5BHgbve+VgF3KaVeE5FEpdRAERkFtFNKPe2O0QIMVkp96H79EvCCUmqWiCzGKBX3Aoa73w8HOiulFotIW/eudwJvup87MJLWyTa63ys6abknRum2vBigjVIqS0QmYlws3Av0U0rtccex3/3TC6O24V2MUn2yUuoWEfkbkIxRG9HZfQ6rfbzu8/o5Rikc9zazgSkYJf8nlFKxJ8Vf5e+CUsqplEoUkS5KKZeI/IBxoTBTKRUrIruB+4D/KqV0wtdqlU76mlYJERmEkSjaAWZ3qdMObMNI3quUUvkissddPftpaUkTiMSoyk0DbgfaAGOUUr8AKKU+Bj4WkacwktrLQJGIeAJ2pZSrfCxKqWnANBE5CPRWSpUm4KvcP7+k4t9yA+Bf7lsL91Z2fEqpL9yJCozq+P+4bw+UKsIoVXudtCnukvqTQDanJvxSVhFZhZFAN3GipqLUNUYYRsJ3K13HhFGNfwtwP+Dhro6/AaMq/lHgDYxzey7Hi4hswqjGd2KU6K8COgHpQKiI9AB8lFJdq/tdEJEnMGp5dovIMxi1L1dRUQfgfyJiVUqdcvtB0y4U3ZBP0yqhlPoJI8ncjlH6649RpV6amNaISAeMKnpExM+97h6Mkv4WjJL+zxgl39fc65cnwACMamM/YBOwUUQ2ishGwJdTPSMiA0QkG+O+cRKwHlguIuvcsScB3THuQedilLr/LSKZGKXRBSKSj1HNjFLqAHAtsLbcfpylx1bJuVmglOqLUerej1F7kel+7HYvS1VK9XUn/MqsB/4pIjPLLSstSecrpe4E/oNxC6EAaAEcBV5VSvV3rz/wXI7XvU03oB/wDyAPeAZYB+wFHgAGKKW6utet1ndBKTUZ48KkPUYNzXvAncBBd83DQeARjPv/ukGfVqt0SV/TTu+fwAKgMUZp/W3gN/d7CjgCICJmjGr3aRiN+Z7ESFSzgAPATcD/YVRZ/919z/8JjCSyDLhbKVUMXFF+5+57+ojIUIykFI6RLI8Am91VxdMx7hkfBGaXbquUsovIZqAPEIzRDuANoAvGffQN7phL108TkfswCgL55cI40/+IrhglfTvQyL3sKGBzP062yt3wLRwYp5RaLSJvisj1SqkllazfFKO2JEMp9YqIXAm86240aQUeOpfjFZF+wFsYF1UbgH+WNv5z3555Drja3cCxh7s2okrfhZMopdRHIvIVMLKS97cqpTZUslzTLhhd0te0SohIAEZ177cY/9SfA97hxL3qMCAL429IgP5KqQ+UUp8qpTpgNM76FrgLeEYptRZ4yn3/2RMjeb8OJLoT/pmsAq7HKFn/jFHC7OauDbgZeN+9r/LxWzDuiQdjNKDbjpGkbsQo3X5Z/jaCiPQC7gHWuI/pKEbNQzxGu4OT79GDcUGwAOOiY5P7Mce9rLL/LX2VUp0xGh+WmgTc4761kVcuHl+MpB4KJInRFS4RmAm8AAyi3C2Dah7vGvfnpHOil0A3EXkeGAuEYNRYDFZK7anmd6EyfsA4jAuz0kdb4E+nWV/TLhhd0te0SiilskWkm7shlgWj5fpXIlKI8U/8d4xkOAejMdc4ESmfvKMxSsC3ALhbp5uBd5VSc4Bt7nv6uN+v9H6+O5accp9RatOZSvoY7QR2AofcsR9zN6CLw0iWJ/eNfxKYoJRaISJ/AnZgJNeRGPf1E8uvLEYwTwKl/dEz3T9LS7zjTj6O0/gGI5kGYrQhKDXafTxXY1Spz8Yo+Y8E/odxgfKJiFyjlMquzvG6eyukA9+5G0ROxOj9EA2MVkrtdp/XEvf6Vf4uiIip3O9QROQNjFqBcOClcscXBnxWxXOkaTVGJ31NO70e7oSwDiMJAWzFSFSPun8uVkotBBaW39C9XbJS6p0zfH75LL4aCHBXf5fyExFzuX7clZW2T/1QkcEYDdo6A/MwqrnBuMdswrj10EtEfnI3PLsOoyR7m4i0Bm5zr/sO8IpS6jn355bff3OMRmylffRLq/dLW/9bRWSdOyGXxl6+en+8e7kL4//QYGCfez8NgccxGvP9jJG4F2L0o09yr/sARsn+SncirvLxut9TwBj3uYrG6BHgwriQKO2nX75GoqrfhdKEb8For7ED4+JvX2mrf/cxjsYYy0HTapVO+ppWCRFpj9GQ7B2l1FfuZXdhlNbGKKXWuluUfyki+UqpWSd9hJUzJGkR+S9G9e6TAEqp7pWsk4Vxb7xQRF4HfnZ34fMFusiJ/usTMUrcpQ3vlmO0I7BhVM+LiPyMkTB7YvTrnwDMFpFhQCrwrLskOw142l26fRx42V21vh2jRFualGcBx8vtM++knwJ8LyJ/UUqlYiTiT5VSxSLSiRMXC2EYyXtt6blwn7fnMVrMx7kfSzBa/O90b5uHcbvAJcbIeFU+XmUMuGMFPihX0re5z+E95Ur6Vvfxnst3IRh4TSk1XkQigUgx+uiXisAYC0HTapVUHGtD07TTcSc/39LqdvcyD4zq3sr6sZ/psxpgjFpnr+L6os7xj1VEemK0pj+5ir6ZUurgScsq7UImIt5KqYJz2f/5EBFPdWJEwqpuc9bjddcOyOm6y7l/r47Kbre436+x74Km1Sad9DVN0zTtMlHvWu+LSICILBKRn0TkGzEmt5gpImvEGNlM0zRN07RzUO+SPsYgFm8pY7KOZIwxtM1KqV5AcxFpWafRaZqmadpFql5X74vIPIxJOSYrpX4UkRGAl1Lqo0rWHYMxAho+Pj7d2rRpU7vBapqmaVod2bRp03GlVIOzrVdvW++7BwsJwuh/fNS9OINT+xcDoJT6APgAoHv37mrjxo21EKWmaZqm1T0ROVSV9epj9T4iEowxoMX9GF1zSif98KWexqxpmqZp9V29S6DuPrdzMfoNH8IY2rN0UItOGCV/TdM0TdOqqd4lfYyRtroCz7sHsxDgbhF5C2OksB/qMDZN0zRNu2jVu3v6Sqn3MKaiLCMi32LMT/2fcsN6apqm1VsOh4MjR45QVFStsYU07Yw8PT1p3LgxVmuVRuU+Rb1L+pVRSmUCX9V1HJqmaVV15MgR/Pz8aNas2cmTJWnaOVFKkZ6ezpEjR4iOjj6nz6iP1fuapmkXvaKiIkJCQnTC12qMiBASEnJetUc66Wuapl0gOuFrNe18v1M66WuapmmA0Q6hPg/YVluUUjidJ2a5drlc531eEhMTyc/PP+M6eXl5JCcnn9d+zkYnfU3TtEtUabJ64YUX+OWXX5gzZw5Tpkxh8+bNvPzyy2Xvjxw5ksLCQl577TUGDx7MoEGDGDx4MF5eXvzvf/877ziKi4tZsGBBhWWDBw8mLi6OuLg4tm3bVhbvlClTSE9PL1vP6XQyePDgUz5zyJAhxMbG0rZtW3788UeuuuoqYmNj6dy5M1OnTq2w7pgxY8jLM2Z9Pnz4MI8++ugp5+mXX35h4sSJxMXFsX37doYNG0abNm3o06cPQ4cOZfv27QCUlJyYRPHJJ5/k119/LXvtcBiTNhYWFnLkyBGOHDlStv4DDzxQ4bgq8/PPPzNu3LgzrnO+LoqGfJqmaVr1LV++nJdeeomjR4/y/fffU1xcjN1u55NPPiE9PZ0lS5bw2muvcdVVV/Hxxx8zfvx4cnJyGD58OG3atGHSpEk8+OCDFT6zRYsW7Nu377TLRo0axdatW8tamX/++eeYTCY2btzIqlWrmDRpEgAWi6WsVGuz2QAwmUxERERw2223MXbsWN544w0Atm/fTmxsLGazmcWLF2O1WvHw8GDChAksWrQIs9lMaGgoL7/8Mps2baqQmAEOHTqEr68vAN9++y1+fn7s3r0bgNatWwMwceJErr32Wp5//nluuOEGFi1axNixY/nHP/5BVFQUAElJSdx44414eXkhIvzxxx9s2rQJMC4cPDw8WLp0KUuWLGHatGnk5OQwZswYpk2bxvHjx7nnnnsAyMjI4JdffsHPz48nnniCbdu2YbPZcLlc5OTkMHjwYJxOJw6Hg/j4+PP8FlSkk76madolauDAgQwcOJCpU6dy9dVXk5mZSUZGBp06dSI+Pp6HHnoIgD59+iAijBs3jry8PKxWKytWrMBqtTJy5Ei++OKLau337bffpk+fPtx3333ExcUxZMgQJk6cSE5ODp07dyYwMJDdu3eXlb4PHTrEgQMHSElJ4brrruOWW27hiy++YNSoUYwaNYphw4bx9ddf07Nnz7Kuak8//TRHjhyhQ4cOrFu3jhEjRjBz5ky6dOlSVjOQmJhI7969adOmDW3atOHJJ5/ko48+on379rz22mssX76chIQEPDw8MJvNALz++uvExsbyz3/+ky1btjB58mRSUlL48MMPCQ8P58orr2TEiBH88ssv+Pr6UlhYyIABA4iLi8PPzw8ADw8P7rjjDg4ePIiIMGzYMF566aWy8xMbG4vFYqTfnJwcZs2aRZMmTcjKysLPzw+z2Yzdbi+7GKpJOulrmqZdYC9/t5Pfj+XU6Ge2i/TnxeFXnHGdlStX8vjjjxMYGMj8+fNPef+9997jpptuYvny5cyYMYM9e/bwwAMP0KhRI/bt28fgwYOZMmXKOcWnlCIvLw+bzcaKFSuYOXMmb775Jp06deKdd97hzjvv5NprrwUgKCgIgB07dvDII4/w4YcfnnIP3WazsWjRIoCy2xNeXsYI7cuWLaNbt244HA4SExP54osvWLBgAVarlcGDBzNr1ixmzZrFkiVLGDp0KE8//TQ+Pj4MHToUm83GpEmTSE9PZ+HChSxcuJDIyEjy8vJYsGABLpeLUaNGYTKZEBEmTJhAYmIi8+bNIyMjg8GDB9OxY0cOHDjALbfcAlRsbFd6kXLrrbeSkpLC0KFDK6yjlKK4uLgs+YeFhTFy5EjeeustfH19+dvf/nZO5/90dNLXNE27RBUVFXHXXXfx1FNPATBt2jRsNhujR48G4M0336R79+4opSgqKsJqtZKXl0dhYSHFxcVlJfHqeuyxx8jIyGD48OEMGDAAEcHb25sDBw5gt9t5+eWXSUpKYvDgwXh6erJu3ToArr32WubPn4+I8PvvvzNhwgRefvllmjZtSuvWrRkzZgxPPfUU0dHRTJkyhe3bt/PNN9/w2WefsXbtWnJycujbty8REREUFxcjIixevJjY2FiSk5MZN24czZo14+mnn+bdd9/FbDZjMpl46qmnsFqtFBQU0KNHD2w2G6+//jqrV69m7dq1FY7tt99+Y/Pmzfzf//0fq1evpk+fPrz88sskJCTg7e3NDTfcUOk5KSws5IMPPmD27NkVlufm5rJ27Vo2btzIq6++ytChQxkxYgQrVqxg+vTp53T+z0QnfU3TtAvsbCXyC2XQoEE0btyYqKgoYmJiOHbsGCaTidmzZ7Nv3z5WrFhBTEwM8fHxiAhKKWbMmEFmZia5ubkkJyeTlpZW7f2+/fbbrF69Gg8Pj7ISraenJ4cOHcJqtfLmm28yY8YM7r//fry9vXn++efLtm3VqhXjx4/Hz8+P6dOn88EHH7BgwQJuv/12brvtNgA2bNjAf/7zHyIjI+nXrx+dO3dGKcWePXv4+OOPadiwIW+++SZAhZI+GFXr48aNIy0tDZPJaMu+e/duNm/eTPv27Vm7di2pqallF0KRkZFlDQ0TExNZvHgxf//733n00UdJTk4mJyeH/Px8pk2bxkcffVSW9P/44w+Sk5OJiYk547lKSkpi5MiRfPrpp2RkZNC7d2/Wr1+PiNC0adNqn/uz0a33NU3TLmEmk4lrr72W+Ph4xo4dy7hx44iPj6dPnz5l97FLlZSUEBcXx6RJkxgzZgxz5swhLCzsnPb70EMPMXPmzLKub5MnT8bb2xsfHx/mzp1LdnY24eHhzJo1i8WLF5dt98orrxAVFUVcXBy9evWiQYMGvPXWW7hcLpo0aQLAddddh6+vL+PHjyc/P59du3bx2WefcfPNN3PnnXfSo0cPQkNDTxvb3LlzadCgQdkFiZeXFxMmTADg008/5bnnnqNdu3b89ttvtGvXjqZNm+J0OpkzZw47d+7ksccew2QykZ6ezsGDBykpKWHMmDGsWLGC77//npKSEn7//XcSExOx2+2A0djx4YcfPmUkPRHBYrEwduxYFi5cyL///W82btzIiBEjzum8n40u6Wuapl3CXC7XKcvWrFlDQkICvr6+OJ1ONm/ezKFDh+jatSsATZo0wWw2s2bNGu677z6Ki4vx8PCo1n6DgoIYMGAAX3/9NU2bNiUtLY1du3ZRUFBATk4OW7Zs4e233yYlJYWAgADWrVtHcnIya9eu5aWXXmLFihUEBQVxxx13MGDAAH788ccKn+90Ohk9ejQpKSm8/fbbZGVlMXr0aLKysnj44YcB4375ydX7AFFRUTidTrKzjalcwsPDmTdvHgsXLmTu3LmEhYVxyy238MILL9C2bVuaN2+Oh4cHzz33XIUYnnjiCUaMGEHPnj0rLN+2bRtjx46lY8eOrF27lsOHDzN58mQA7HY7H3zwASLC/v37CQ0NpaSkhOuvv76sAeK8efP44YcfcDqdp1yYnS+d9DVN0y5hTZs2LUt2DocDESE3N5fx48cTGhrK5MmT6dy5M3369GHOnDkMGjSI4uJiHA4HeXl5pKenk5SUxNixYwFO6a538rLSanSgrL/8ihUreOmll3j22WcZO3YsvXr1Yvr06dxzzz0kJSURFxdHREQE8fHxvP/++7z33nvcfffdjB07ltTUVNavX88bb7zBG2+8wYQJE7j66qsxmUzEx8cze/Zs7HY7QUFBfPnll8THx5f1qXc4HAwfPpz//e9/zJ07t6wr37///W/ef/997rrrLgAWLVrE77//zvfff09AQADz5s3j888/Z86cOQQGBjJ+/Hi+++47hg8fXuG4i4uLT+keCNCxY8ey5ye/P2bMGGJiYvDw8OCjjz7ixhtvZNiwYeTm5lZoAFj6e1i6dCmBgYFn+S1XnVyKoy91795dbdy4sa7D0DTtMrZr1y7atm1b12GcVUlJCSaTqez+9oXkcDiqPDvcpk2bsFqtFRJoYmIikZGReHp6UlRUhKen5ynbOZ1OXC7XGfeTkpKCh4dHjSbTc5Geno6vr2+1a1Eq+26JyCalVPezbXvRlPRFZCbQDvhBKTWxruPRNE27FJT2F68N1ZkOtlu3bqcsa968ednzyhI+gNlsPmuV+Lm2U6hpISEhtb7Pi6Ihn4jcDJiVUr2A5iLSsq5j0s6DowhSd4Pz1GoxTdM07cK5WEr6scBX7uc/AX2AvXUWjVZtSimW7Upl984t3JA7lyYh3lhMAt3ug8jO1f687AIHe1JyyTi2j+LkBPwzd+JZlIrZZcdsEiwmExaz4G0zY2/SF5/G7Qlt0hZPL+8LcHQ1x+V0cTwnl4zkw+SmHiI7v4iSohwylS+u4nyKS5z4lmQRXnwAH2cOVrMJl3couY364m914R/ZkogmrfC0WeECzfDmdCm2HM5i7f408o8fJtTbQmyX1jRvFH5B9qdpWs25WJK+D3DU/TwD6HryCiIyBhgDlHXr0OqPT9ce4vWFG3nMupBfVT6bD2fRsqEvLR0z8IodC8HNT7ttVn4xCYkHSNq3hfykPWRmZmAuTMefEzNWFZoEi0kwiVDiUpS4XFDaXGX/AsCY7MNh9cPkFYj4NsQjoAH+gcEEBTcgJKIZ4eGR+HjW/LCXpQqKHaRkZHE8PZ2sjFTyMtPIz8kkJ78Ac14SvoVHMdnzTjubl9UseJlMKCBVKRTgcLpAZcPe/RVXtnnj8A7H6tcAv8AQGvh7ERDVjoimrQj086127NmFDn75/RDbd2wj6eAuQuxHiZI0wiwu7E4Xq9ZZWdvrr4wcEqunk9W0euxiSfp5gJf7uS+V3JZQSn0AfABGQ77aC007m6TsQiZ+v4sXI39jZHQo2yIe5u0dNoL3fkW3Y/uJPDieEB8bnlYzAhSXuChyOMkudJBVYKfAfmKKSx8PC1E+NiyNmxHYsDENJQu/wIbYvHzBPwK8giAvBWXxpLiokIKDm8guMZNe4kVGkSIvN5vC/Bw8M3dhT95MustFOrAPKMGMsnhi8goAT3/MHr5YPHyweXnj4eGJyWxDrDZMFhtmiwdF3hHkmwOQoiw88g5jKs7GUVxEcVEBjuICHMWFlBQXouz5mIqzsJYUYMFZ4dx4mE1E2Swoz0BswcEEWIMIMeVi9gvDx9OGZ4OmeIQ0w8M7AFNwMyjOBqXAZAFHIc6sIxQU28n0aoLz4BoyC+yk5TvJzCvAkpOKOXUbuYcLyQXgazYDdosPJT5hePkGYvYNwcM7EG8vD8xWT1wmC+JyUWh3kJ+bQ35OOrnpxzDnpxBKNjEWE32CvAmJaE5UzDX4hLUgwy6s+X4Wab9O43Nc3HnDtbX11dLOQfluYKXd+WqjEd/5yM3NLRvX/mSJiYkEBQWVDeV7IVXl3KWnpxMQEIDFYmHPnj20aNGixrvdnY+LJelvwqjSXwt0AvbUbThadXywMpEY/uDGyGxM7W6hc8zVzOwOiWlt+WPec2SmJ3Eko6DCNiYR/LwsNPD3JMjbSpC3jaDAYDzbXQ++YRDSEsyn+/p2QABPwLPNdQQD0ZWs5bIXkXksgeScYjKPp5Cffoy8nAwK83Jw2fNw5qXichRS4iyi4DSlbwdmrDgpLr/QbEUsntisnnhaPTH7emMJa4SXXxC+foH4BwQSGNKQ0OBgvAMaGgn8tMdyEp+KDX/MDdvgB/gBtGh/6nEqRVHOcdISt5CSlU9mxnFys47jyEnBmbEfSd5KodNJYSW7MokQ4mEl3C8Un8ataRTdmpjWHTAHNQHLidbGwcCQB2NYPGM8aWums7lxKF06dqra8WgX3KpVqzh06BBFRUUMHz6ce++9l5SUFESE8PBwnnjiCfr371/WyG7KlCmEhYWVDQ5TUlJSobFfq1at2LNnDzt37mTLli0V3rv++usJCgpi2bJlLF++nFdffRUwpsFdtGgR/fr1Y+XKlWXrT58+naFDh5bNYgfGJEFxcXFlr/Py8hg4cCCvv/467777Lj4+PhQWFjJu3Di6dOnChx9+yIABAxgwYABHjhyhe/futGnTpsI52LNnDxs2bKBx48Zly55//nlGjx5NdHQ0drudkSNH8vXXX1f73MXGxvL3v/+dqVOnYrVaiYuLY/Pmzbzyyis88MADLFq06LQXLHXhYkn6C4BVIhIJDAF6nmV9rZ4oLnEyb9MRJkbuxzewITTrW/Ze8wa+NP/rVCjMpGjjbEpSdqMU2CwmbJ4+SPNrwL8RNGhdIcnUFJPNk5BmHTlb+1mX00V+UREOezEljmJKHHacxQWYco/iUZiKybcBpuBoTH6heHv51Gpr6LMSwTOgAVFdriOqsvedJRQXF5CTV4jDUQwuB4gJb5uVgIAAxOZbpbYBJq8AYke9xNdT/49d306iRdQb+AXVjxbSl7sJEyYwZswY3njjDTZt2sTixYuZOnUqXbp0oW9f4+/xyiuvxMvLC5PJxB9//EGTJk2YPn06SikKCgpYuXIlJpMJi8WCl5cXLpeLgoIC8vPzy0qxH330Ee3atSMoKAgPDw+sVivx8fG88sorbN++nYEDB7Jz504GDhzIjTfeyGOPPUarVq34y1/+wuTJk8sGvimdRhfg888/JzIykh9//JHMzEzMZjOvvvoqn332GcePH2fQoEH07t27rLR9pq5vJ5e2N23aVDYK39KlS/H29i6bbrd58+bYbLYqnTswxkL43//+x9atW/n99985ePAgcXFxpKamMmTIEMaMGVM2rW5dq0f/nU5PKZUjIrHAdcB/lFLZdRySVkX8KPaGAAAgAElEQVQ/704juPgIVwZkQ8zwyku0XkF49n2s9oOrIpPZhJ+PN/ic3AiwTaXrX1TMFjy8/Wng7X/eH+XtF0zHm5/mt89eYN2c1xg4+l9g9Tr7htoFVVqC/8c//sGoUaOYMmUKixYtYteuXcycOZOJEycyePBgevTowfHjx9m/fz/NmzcnKiqKo0ePsn//fry8vJg1axbvvfce+/fvp2/fvjz99NNlU/MCrF69GpvNxrRp0/j22285duwY7dq1Y/ny5QwaNIiffvqJa665hri4uLIZ+Fq1asXatWtZs2YNsbGxvPTSSwwbNozvv/+eK664gvDwcNauXUtmZiZDhgwB4OGHH6ZDhw5YrdZTpp41m83ccccdtGvXrsLyXbt2la3rdDoJDQ2lU6dOdO3aleHDh7N582b8/f157bXXWL9+PfPnz6dNmzZVOneNGzfmmWeeAWDx4sVcd911zJo1i5deeonvv/+evXv3XrAhdc/FRZH0AZRSmZxowa9dJBZuOcr1XrsJDw2BqKvqOhztAuvUtjVrOt9L8pYZHF76LlGDx0I9v19cK3bMh5yjZ1+vOvwbQfubz7jKZ599RkZGBlOnTkUpxUcffUSLFi2YPn063t7e/Otf/6KoqIjnnnuOgwcPMmHCBPLz82nRogVffvklP/74Y9k88KVz23fu3JnVq1fjcDgoLi7GZrNVaLz5yCOP0LFjR7766ivat29P//79SU5OJjY2lpSUFGJjY1m2bBkHDx7kpptu4s0336y0v3pcXBwmk4krrriCm2++mRYtWgBGYvf3P/Ui9eOPP+bzzz8nICCAY8eOnfL+XXfdxeOPP86QIUPo2rUry5YtIz4+nmnTphEREcGkSZPw9/fn0UcfxcPDo8rn7oUXXmDevHlMmjQJb29v9u7dS05ODgkJCRw4cICYmBgOHTpEy5b1o6f5RZP0tYtPTpGDVbuP8GFEOqZGN4DlwrWM1+qPu4cP4qk9+wnesoqIduuwNOtV1yFdtu68807y8vLKSqwtWrTgk08+ITExkVmzZhEcHAwYs8x9+eWXvP7668ycOZOHHnqIBx98kMDAQLKysrj//vsBo5RcXFzMTTfdxKRJk3jooYewWCyICNu3b2fcuHH88MMPTJ48mZKSkrJbBrt27WLYsGHs3r2b2NhYzGYz7du35+eff+bw4cPk5eXx4Ycf8v7779O6dWs6duxIv379eOedd/Dz8+Pbb7/FYrGglMLhcJQ9L+/ee++lR48ePPPMM/Tr14+9e/eilKJVq1asXLmSt956q2wUu61btxIbG0tWVhZ//vOfufvuu7nrrrv49ttvKS4uxsfHp8rn7pVXXsHf3x8R4dixY0RGRvL4448DMHz4cJRSpKam6qSvXfoW70ims2sXzYNt0OiUXpbaJcrHw8JNN97Cli+2E7n8Czrf001f8J2lRH6hZGRksHDhQu6///6yseWDgoLKpowtKioiPz+f999/n1dffZXRo0eTnZ3Nm2++idVqZeLEiXzxxRfY7Xbi4+OZOXMm2dnZfPXVV3h4eLBs2bKyfY0aNQqALl268Mwzz7B69Wqio6PL7uNv3bq17Gepxo0bM2XKFDp06MCECROYPXs2S5cu5emnn64wzv3ChQtJSEjAYrGUteQvvQAoz+VysWnTJnJycsqmx01ISGDv3r1ls/0BdO7cmbi4OOLj44mPjycmJgaz2cy2bdsoLCzEx8enSueuPE9PT0aOHElkZCStWrUqW24ymVi+fHmN/D5rgk762gXz3eYjDPfeSUh07zP2w9cuPYPaRxAffQN7Dn5C4+1LCO0y/OwbaTXO6XTy3//+l+3btzN9+nSWLVvGggUL2LFjB+3atSMpKYmNGzdy4MABHnjgAQDS0tLIzc2lUaNG/P3vf8fhcBAaGsp9993HoEGD6Ny58xkbzEVGRpKYmFj2un379sTFxZXdqy9tpAcwc+ZMAJYsWcKzzz7L4cOH+de//sW6det4/fXXASORT506lXnz5rFlyxbmz5/PgQMHePDBB3G5XKxevbrs8/z8/Lj//vsJCQlh8+bNuFwuunXrxvHjxyu9JVDeu+++S1hYGIWFhXh7e1NQUHDWc1e+cWBycjIpKSkEBwdXuIc/Z86cKvymao9O+toFkZpTRPKB7bSNMiNNe9d1OFodeOQvg/jwvysI+flrBraLBY/6023pchEcHMz69euZMmUKn3/+OW3btsVisTB69GieeeYZdu3axZNPPlmW8MGY9z48PPy0jc9KS8wPP/wwO3bsKOutsnv3bp5++mng1JnlKrNu3TqmTZvG7Nmzeeihh2jfvj1eXl60atWKd955p6ydwIwZM+jduzd+fn688MILLFiwgBkzZjB9+nSGDx/OjBkzuPZaY2yI5cuXEx8fj9lsLivpHz58GJfLRffu3csGbtu8eXOF6n0wLlbA6GcvIlU6d6VdDV0uF+PHj2f+/Pn4+vpWmGpXJ33tsvDdtiT6yjaiIiOgQf2faUyreY2DvInuO4LkFa+zbfmXdBwyuq5DuuysX7+eJUuW8NVXXxEREcGvv/7Kiy++yCeffELTpk05fPgw77//Po8++mjZNqebLhbguuuuK5voZvr06RXeGzVqFHa7nZKSEl599VVeeeUVnE4nGzduLCvdx8bGsmXLFkpKSvD19WXatGn88MMPPPzww7z44ots27aNX3/9lRkzZtCnTx+eeuopRo0aRUFBAampqbz44os0btyY5557jqSkJFJSUujatSs9evTgt99+49NPPyUgIACAgoIClFL4+hojUL799ts0atSIrl270q1bN3766SfWrFnDqlWrAKMh4MSJE8sSdnXOnc1m48svv6RDhw4cOnSIJ554ouy8VOUCqDbpqXW1C2Lk1CXcnf8RN9x4B7T7U12Ho9URh9PFW5Mm0rJoB9f/bTI+wZF1HVKtuVim1q2OjIyMsgZsZ6KUqtZwzAkJCaSlpXH11VeXLUtOTsZms1VpfzUhMzOTkpISGjRoUCv7Ox/nM7Wu7ktzNgd/gW1z6zqKi8qB4/l4J68jOsQbonrUdThaHbKaTQy66V6y7bBq4cy6Dkc7T1VNwNWdf6FVq1YVEj5AeHh4rSV8gKCgoIsi4Z8vnfTPJvswJG+r6yguKgs3H+FKUwKNm7cDPz3z2uWuS8um0PI6MhM3s3/HhroOp1ZdijWpWt063++UTvpnY7KAq37dk6nPlFJs+20dLfyd+LXqe/YNtMvCTX+5k3xLIBt/nImrxHH2DS4Bnp6epKen68Sv1RilFOnp6WXtKs6Fbsh3NjrpV8uOozk0zNlKkxb+ENmlrsPR6olAX2+aXXM3qXFTiV88lwHD7qjrkC64xo0bc+TIEdLS0uo6FO0S4unpWWHioOrSSf9sdNKvlh827aOD6Q8at79JD8iiVXDtNbF8tHkpyRsXcrxHf0IbRtR1SBeU1WolOrqy+R01re7o6v2zMVtBucA9d7J2ek6X4tC2lUQFWvFu1a+uw9HqGRGh/y1/pcQJK+ZNA13trWm1Tif9szG5R1xyXR73Ic/Huv3HaVO8lbCoFhBw7tVP2qUrOioKrw7DKD62g63rf67rcDTtsqOT/tmY3HdAdBX/Wa3asIkIcw7RnXQDPu30hv95BPleEeyK+5iigty6DkfTLiu1mvRFJE5E4k/zmF2bsVSZyZhhCacu6Z9JkcOJPWEpjYN9sEVfffYNtMuWp81KxxseoqQwl/gFuu++ptWm2m7I95pSKq6yN0TkzyISAMwBzEA+cLtSyi4iM4F2wA9KqYm1Fy7lSvrOM693mVv5+xEalxwmokkHsHnXdThaPXdVl05s39CPrF0rOZTQn6atOtV1SJp2Wahv1ft3Am8ppQYBycBgEbkZMCulegHNRaR2JyU26+r9qti6YQUBVhdRfS79rlhazbjx1vvJN/uzbsF7OB32ug5H0y4L9SrpK6WmKaWWul82AFKBWOAr97KfgD6VbSsiY0Rko4hsrNF+sWUlfV29fzq5RQ4ch9YTGhaJJVRPoatVTYMgf6L6309JTgorv/uorsPRtMtCvUr6pUSkFxCklFoL+ABH3W9lAGGVbaOU+kAp1V0p1b1Gx08uvaevS/qn9fPmBJqqY0S27wfVHHNbu7xd168v2WFXkbr1J5IO7anrcDTtklfvkr6IBANvA/e7F+UBXu7nvtR2zPqe/lkl/BaPr4eZmM7X1HUo2kVGRBg+Ygy5ePPr/HdQusGspl1Q9Srpi4gNmAs8q5Q65F68iRNV+p2Ag7UaVOk9ff3PqFLpuUV4J68nMDIG8b30Z6jSal7jBsE07H0XxelH+HWJntFS0y6kepX0gQeArsDz7m58twMLgLtF5C3gNuCHWo1I99M/o/iNWwlUOTTt1L+uQ9EuYsOuG0Ru0BUcXr+A48l/1HU4mnbJqu2k/9Dp+ukDsUqp95RSQUqpWPfjS6VUDkZjvrVAf6VUdq1GrJP+GR3cuhI/LxtN2/eq61C0i5jJJAy8/VEKnSZWzX1bD9GraRdIrfbTV0rdeo7bZXKiBX/tKm3Il5sEdK6TEOqrpKwCvI5vw691R8TTv67D0S5yMY0j2NztVgo3zmbdih+4KnZYXYekaZecs5b0RcRHRO4SkUki8q6IjBOR9rURXL1QOvZ+wuK6jaMeWr1+I4Hk0bKzHnZXqxk3Dvsz+b5N2b/yC7Kzs+o6HE275Jwx6YvISGA6kAZMAMZi3GO/WUSmi4jvhQ+xjpn07MOnk7TrV/y8PWjU5sq6DkW7RFgtZvrc9FeUo5Bl3+ghejWtpp026YtINNBAKXW3UmqJUipLKVWslNqtlHoFmARc+sOvma11HUG9lJVfjMfxHXg06ghWr7NvoGlV1LZ1a0zNr6Fo/y8k7v29rsPRtEvKaZO+UuqAUmqqGK4XkT4iYhaR50XkNaBIKfVBLcZaN6xeJ0r7jqK6jaUeWffbJvxUPtHte9Z1KNol6Pqb76PY7MOG795H6TEyNK3GVKX1/ufAn4G/AyswhsctdC+/PJS23D+2uW7jqEcSd27A02YlpoNuta/VvOAAfxr2vB1nxh+sXflTXYejaZeMqiT9MKXUX90t70OUUk8opV4GLr/xVh35dR1BveBwuig+9jueYTGYbLpqX7swrh84BIdPBAm/zMdRorvMalpNqErSDxSRXiLSGyh0P7+aE0PjXj5Kius6gnphx4GjNHCl0TC6Y12Hol3CLBYzba65FWvhceLiFtV1OJp2SahK0t8KPOh+bAXGAKOBbRcwrvopvwZn77uI7d25CUHR8orudR2Kdonr0fMaTAGRHF2/gMJiPRS2pp2vqvRHm+X+WTpElpR7fnmI6gmH10LW4bqOpF5IP7idcB8/AiJi6joU7RInJhPt+9/OtgX/JW7ZIobf8Ke6DknTLmpVSfqx7p/XAA6MCXA6A37A5TEqS6cRRmO+tN11HUmdK7KXYE5PwCO6DZjq29QN2qWofbe+/B7/JambvsMx6AasFj12hqadq7P+11ZKvexuuIdS6nql1HNKqRuAy6dljQh4+kOJ7rK3PWEvvq48wmI61XUo2uVChOa9b8ar+DgrVyyt62g07aJWnaKaU0QeF5FrROQRLrcqfouXUdp3Xj7XOpVJ3LMdBFpf0aWuQ9EuI9169sflE8ax9QtQLlddh6NpF63qJP1bAU9gBBDgfl0tIhJ3uln2RGR2dT+vVpVOKJOXUrdx1LGcY3vx9PbDNziyrkPRLiNiMhHWdSjm/FR2bt9U1+Fo2kXrTMPwNhWRP5e+dg/D+x93n/1/G6vIiGru77Vy0+ZWeADzyu07TEQ2l3s9U0TWiMg/q7m/mhPsbrSWfQQyD12WU38qpXBlHkSCmhm3PDStFvXuO5ASsye71i6p61A07aJ12hYxSqlDInK7iEwF3lVK7QEQEW/gFuAGjAl4LoQ3cY8DICI3A2alVC8R+VBEWiql9l6g/Z5izf50Ch0leLqKaJFbjNq0EC9HFqarHsQntAniHXzRJsDs3AKO/rGXLLsQ6OtD08aN8PHyPO36SelZ+NrT8Y/oU4tRaprBx9sLS9OrKDm4mpzsDPwDgs/7M/OKHKSlpZCfdghHfgbK6gsWD0wevgT4+REYFEqArw8ms260qoHL6aS4uJgiux273UFJiR1nSQlOZwkup/HT6XLicrrcr524XE6cLkWJ2Mj3aYLCKEBFh/rQMsyv1o/hjM1glVL/EZGmwN0iEoNxH78Q+FEpVd1SfpWIyAAgH0h2L4oFvnI//wnoA5yS9EVkDMYYAjRp0qTG4vnXj7vYfjQbM04mWFIAo3o/c9tbhJjyUVZvir0j8PQPxTckktCIZrRs2ZqQkAb18mIgt6CQ1ct/QHZ+TUZeUYWWGRtNNszNenPDTXcTFHTqP9T9+xMQFOFNWtVixJp2Qqerh7A1cQUbV//EgKHV/xeUmpHBlvUrSd2/Fa/MXRQXnX3ALRFBeQUifhF4BEXiHx5NdLMYmkW3wGw2n8thaLWkqKiIzKwscnNzKCzIp6gon6KCfOxFedgLC3DYi3AUF+IsLsBpL8TlKEY57SinA3HaEZfD/bBjcpag1Lm3JzmkwnjfObzs9V9jY3hmcJuaOMxqOWvfF6XUIWBiLcSCiNiA8cBNGFP4AvgAR93PM4CulW3rnvznA4Du3bvXWN375BGdyS0qwV7iovGan3CV2HE4XRQ5XOQ5Q9hnbo41JxX7sR3kHFpLDpAIOD0CkQYtiYjpSMfO3WnQILymQjonRXYHP/0wj7Qti/By5hLkY+OKRkGYmvbGGtyE7IIiju7fSdGBlfz0zgb63vMCkU0rJvf0pD8AaNKseV0cgqbRrlUr1nhHkrZnDVQj6e8/ksy672fiOroZk3Li52EhxNdGUINAbD4BSEAUJr+GOLxCKTF7YXdCbn4+xdnHceQkkZlbgD03DVdqAkW740gF1phtuAKa4hPRiuhWHWjXrgOeXt4X7uA1XC5Fek4+GcmHyM5MJSc7i7ycbAqLinAU5uAqykEV5aLs+VgduZhd9jN+nhJBmW0osyfK4gkWT0xmK9i8EIsNMdswW6yIxQOzxYbZasVicT+sVkxmCyazFTFbMJvNmEzuh9mM2WxBTCbM7tcdrR4M9QlDEESggZ9HLZ21iupbh9dxwDSlVJacKCXncWLIX1+q1/jwvMU08D3xIiEA7HknXjdow5U9/1r2Mic3m4MH9nH4wF5yju7GlbqTlCMbWLpiJg7/KBq07slVfQYREhJai0cAO3fv4df5b+NTcJSABjF07PcgrTr3ObUmov+f2LVzK5vmvsaqz/7Nn/8xFQ+vE9VPucePYLN54hfYsFbj17RSIkJg827Yd35HRvpxgs/yt+R0Kb6d/xnFW+djMYE1pg8drx5C88bhiEdAtceaKHE4OHz4AAcP7Of4H7uxp+2j+Pcf2b3zB3YttKCCYwiK7kLn7lfTqFHj8znUy1KRw8mR9BzS/thDVtoxCtKPYMlKRBVmk2d34bAX4aFOTeQWiwmx+KBsvoinH5aAIMQ7GJt3AF6+/nh6++Ll5Y2nly/ePj74+Pjh4+OLl6fXZXfr5qxJX0Q6KKW2u5/7KKXyy733L6XUczUYz0BggIg8CnQWkRnASowq/bVAJ2BPDe7v/ARWvI3g7xdAx47d6NixGwDK5WLP3gT27lhP1v71ZG2Yy6KNX0NkF67s/2dat2l/wUP8cdG3ZPz6CT42T9rc8Ahdew08422Htld0Iif/MfZ/+wY/L5jF4JGPlb1nzzqG1adhvbxtoV0+ruh8FZt3fMfWzevoP3DoadezO5wsnv5/FKYcoEmID+1vGENg637ntW+L1Up081ZEN28FDAEgLy+XHdu38EfCFoqPbiN7wxxWbJiDw78JQa1607VnfxqH6wvlUkopktKOk7ZrNdaEH8ktKCK52EpGkULZC7DhwOS+72g2CR4eFiwe3phDIjD5NcDbNxCvoHACAgIJCgomOCwKm4e3HiysiqpS0n8biBWRPwGPiMgEjJH5BLgeqLGkr5Qq+4sUkXil1GgR8QdWiUgkxl9Z3U3gfvKEO4FNz7i6mEy0ad2GNq3bAPeQeCCRLau+p2D/r2yavYm1DdvT70/3E90susZDdTldfPX5dFx7luIf0ojYu/+Jf2jVbjFc1aM3Ces6kJOwiqL8e/H08UcpheQlY4u6osZj1bTqaN2yLRutPqTs+w1Ok/RdThdzp7+EpBygS5Mg2t7/HlguTHWqr68fPXv1pWcvY4DSw4cPsm3DSrL2rSVv4xziN35JSXBrorv0o2eva/DwvHxuAdgdJSQeTOTI3q0cP3aQooyjeOf/QYnzxB1YT6sZPy8HtgZRmAMaERAYhH9YMxqEhRMS3gy5QL+3y9Vpk76INAKOYyR4gH9itNb/CGM8fgGq++196Azd7rZw4j4+7m58KKVyRCQWuA74j1Iqu5r7rDmukyb8CKxeg8Hm0c1pHv042bn3sWrJ12TvWMSvM59iS+v+DP7LA3h51czEhUopvvx0GmrfMnxjrmLonU9gtp2+VX5l2va7hYS5L7Jh9RL6Xn8rmfnFeJTk4xccViMxatq5MplNSHh7VPJWXE4npkoa033z3XwkZQfR7a6k7chna7V2KiqqGVFRzYB7OHZoH1vWLSMjYQ1Hl33A3BWf4hlzNb0G3kSjiEtvrIvjx4+zY/dOfDbPJD3fTlaBHZfLSPAuixee/g0Ji2hCqBcEBATh3+Ya/Jt0BO/z74mhVc2ZSvq9MErxgSIyGEhRSq0WkQJgB0bSL6zOzpRS1R7Qx71dJida8Ne9VkMg99iJAXuqKcDPj2G3jCK9/zCWzv+Qwt3L+HryNnrd/jQxzVucd3jzvvoEtW8Z3q2uYfhdjyPnUO3VrWMHfvu2Ael718P1t5Kaloag8KuBblKadr7CotuTdngdhw4lEt28ZYX3Dhw5Rs6meYQ2bErP2/+vTm9HRTZtQWTTFricD/Lblo3sWbcYe8Iy4hOWY27Uhe7X3UaLmIu3N0xeYRE71y7FtGMuKTlF5BQaBSOLWQj2sdE6zA9bRBtCWvchrG1vxKR7O9S1M/XTnyci3wLxwFKgdLAcM0aDOqGWG9XVG1E9auTKNCQklBEPPs2mjev4/Yd3+PXjf5I59DG697j6nD9zxS+/YN++EM8m3bjxHBM+GA2mzJGdKDnyMy57EZmZxwHwCwg559g0rabEtGhD2kpI3L/7lKS/6ofZeIiTnreNRczWOoqwIpPZRPduPejerQdJSUdZvfQbivavZt1Hv7Gm8ZXEDr+XqEYXR8k/JbuANZt+I3PHUrzStuNSCotZaODnSXSoDz5trqVx26uwhDSDenL+tRPOdk9fYbSeByPRp2Akek8u56RvrZlq+FLdul9FVFQTFn00kT3fvUVRUSF9+g2s9uccPpZE4k/T8PIPY9g9Y8854ZdqGtOW1ANx7N+/m5ysdAACg2q354GmVaZZ02jWWGykHN5fYfmRpBTkyHp8W/amQXjNjddRkyIiGnHrPX8jK+tOVv74Obm744mf/hu2lrFcf+OdBAYE1nWIp8grLGLD6p84vOMXJGM/ZuUkxNNCSKNImoQ3IKLjACzRlfQI0uqdM93THwr8B0gHhgMTRKQLUAQcxEj6Zx/Z4lIS3BwyEsFSvfvjVdEwLIKb/vY6C6eP54+l77HV14dOXXtVeXulFMu+egcPHMTe+UyNNBZqFtOW1DhIO7yX/AJjWUioTvpa3TOZzZgDGpOfdrDC8rW/LMesnPSIHV75hvVIYGAQf7rjUVJTbmLldx9j37uMbyevpdk1d9G333XnfdFeEw4l7iH1h1dJTMvD6VIEelqIaBJB2FW3ENU0BgnQ3RIvNmcq6f+G0VL+G6XUAnfCnwSEAsMwkn79uyS9kHo8BIUZF+xq1t/Xl+FjXuabd59h27dTCQ2LqnJf37if47Ad/52GV91KeKNmNRJP4/CGLMGXhqkHKHAF4mEx4elzef3KtfrLI6QJ9n2/4nQ6y0bGy05YhU9QU8KbtDzL1vVHw7BIbhn9LAl7drJ+4XsciZvOp9t/Zfjd/yAosG7+3vasW8SxVZ+SlFWISYSmod40bdKMiNjRSGBTXaK/iJ32UlIplaSUysWoykcp9SLQEXgNeNf9yKiNIOsNqyf4X9j7boH+/gy6+1lQsGLOm7iczrNuU2wvJumXz8E/kgFDbquxWDytZvI8I3BlHqY4Lwux+YC5vo3npF2u/MKjsbjsJB09DMCRpCS8CpIIbnFlHUd2blq1voKRT04lqPstWFJ3/H979x4eRX0ucPz7zt6ySUg2IeFi5A4qVMRLimDFRqutl1qtvVhv2NYq9nipx6c9Wo891ufRak9r+1iOtseKta1tbbU9bak3ihVRQFRABEEQFZBIgIQAQiC3fc8fM5EQNiGJ2d2Z7Pt5nn2yOzO78/tldubd+c383h9Pz7yW5cuXHfqNfejd5c8z78cXs2T2A2zf08TEw4v57KeqmPpvD3LY5++wwbb6ge60H90iIieJyEnAf6nqz1X1bVVdB/w9zeXLSRWHD2fIyZdB/QbmPHHoTgvz//U04cYdHFF1MU64b4NytKiclobttDbUQ6x3vRWMSYfyCnfky82b1gGwZsUrAIz5WDCDPkAo5HDW+ZdQedH3UCfCisfv4J9P/Tnt6929ZzdL/2c6Lz1+L7W7G5k0LMG5p57MxBm/orDqeveEx/QLXV3TLwIqgO8DbwINQERE/gMowW3eHwzcmf5i5p7TP3Umv131InVL/0r9tDMpKSlJuVxLSwvvvzobp6iCEyq7fw9AdxUmytlb30heaBtOqWUVM/4xYthw3gC2bXkfgOoN64hGYozug26v2XbEhGMZWnEPT/7qTrYteIS/7ajlcxdemZbr/Ktefpa1T/+chuZWxpYXMmlYgti590A42ufrMtnX1TeoAnfwm4nAX4AJuHgvJ/kAABPxSURBVP3z84C7cG/y25juAuYqcRxO+uzXkNZmnnuq87P9hYtfIrKvjrFTz0vLAaEoUUZjcyvxlnqS0cwPA2lMZxJFA0hGCthV5458ubduE+Hiob64Aa4vDCgu5YJr7sYZMYU9bzzNo7+5D032fpS3jpJJZfGvv8vy2ffhOMIZ4wcz+cqZxD4/0wJ+P9bVNf3VqnoxbqC/HmgBTsHtxtdno9iZzo0dM47kkEnsXfscDQ17Ui7z9rLncKJxJk/5ZHoKEXdbGJpbk7RELOgbf2mOlaB76kgmlUhDDZFERbaL1KcikQgXXvEdCo6sQtf9i8cffahPPrexqYmF917K22+9ybDSOGceP5byi38BcbtRt7/rNOiLyFAR+QNuqt3vAU3A87jN+nnew9IrpdmkaeciLY0semHuQfPqd36As2UFBSMrCUXS9Mu8LeugQqud6RufScZLcfbVU1NbS15yL4Xlw7JdpD4njsPnLrmOvFEn0rzqCeY8/dFupdrX1MyCey9nY10Dxw5P8IlLbiV69l19VFrjd121gzUCt+Fey7/FW3YKble+LwLnA1vTXcBcd/TRx9IUL2frG/MOmrd8yUIi2szY46vStn6nXarhZNRu5DP+4uQPJNK0g80b3wGgdGjXg2AFlTgO502/EcrGsX3Bw6xc+VqvPqelpZXFMy+nZtc+Thw9kAmX/wwZNL5vC2t8ravm/e2quhb4Am7z/krgJlW9Cdiqqhf1Npe+6T5xHBJjp5Cs30BtXd0B895buwyNxDly/KS0rT8a2X+vZ9Lu3jc+Ey4spam5mR3VbwJQcfjI7BYojUKRKOdM/w7NsQRL//ozGhp2H/pNHfz9N/dQXb+XyhEljLnkpxCz1rtc0+UdLyLyA+Ba4Grgy8A1InIb7lC7wcl+EXBHTJyMqLJq+eIPp6kqTVvWEB18RMpRxvpKLLz/s9WCvvGZ/AEJkkll97aNOCKUD+zfGSOLS8s55tzrCO+rZ/Ejt/fovfNffJ597yziqKFFHHHZvRbwc9ShOnU/i5t2F+AzwFzca/r1wIXAHT1ZmYjM7WKdm1T10p58Xq448sgJvBwuoGbdMjjtbADef7+aePMOEsPOTuu6Y2GH7QyglA+sn77xncIBCRqB5K7NNIfzkRxIHjVp0nFsWTSWze+tY/XadYw/4tBdFDfX7WDT3PspLYwx8bIfWcDPYV2e6avqs6q6AFgEPK6qC73XD9K7bHx3q2pVqgfweNtCInK/iJzb7vUsEVkkIrf2Yp2BFwo5hMvH0bh13YfT3lrnNmcOH5Pe63HRsMPDLWfy29YzCEctQYfxlyJvcBpnzzaawgVZLk3mTLnou0g4xoInf9Ot5R/7+2ycZDMTv3AzkSLLt5HLutWhVVWTqvqTdq8bVPX+dBRIRKYBQ1R1tvf6AiCkqlOB0bl6WaFo6FhC+3awc4f7W6tm49s4jpP2RCSxsEMtxazWEcTC/aP/s+k/EoliAPY0ttASzp2z16LiUsqO+Qz5tSt4beXKLpd94933ib79DBXDRlMxNn33/5hg8NVRXEQiwC+B9SJynje5CmjLTjMHOLmT914lIq+KyKvbtm1Le1kzrXz4EQBsXLcKgIa6TUhBGZE0n31H2wX6qAV94zMD2w1D2xIpzGJJMu/kT3+JZDjO6/Me73K5ebMfpjTSxLHnXWt5842/gj4wHViFm+1vsohcBxQA1d787bipfw+iqg+oaqWqVpaXl2eksJk0erTbwLG5egMAod2b0TQP/gMH3shnZ/rGb4oL47R6hzGJ5k7zPkC8oJCicSfhbFnBlq2pT3RWr69mwNallB11MgMGjcxsAY0v+e0ofhzwgKrWAI8ApwK7gbg3vxD/lTkjBpUU0xIpYMe2apqbm4g0bieagexjdqZv/CwWCdMaigEQisayXJrMO2HqaTiaZPlzf0w5/4X5c4k5SSqrzs9wyYxf+e0ovg4Y7T2vBDYAS9jfpD8JWJ/5YmWfiJDML6f1g61s2bIFVCkuTX+LxgFBP41dA43prZCXJz4cjR9iyf6nYtR4ygbEqH53zUHzGlta2fHOEkoGVVA0qP9lKjS947f+LbOAh0TkK0AEN/PfB8ALInIYcBZuVsCclMwvI7zzLWq2ugOMlJWnvNLRp9o36ccifvuNaAwQyYfGnURzMOgjQvO4c4gt/Quba2oYOmTIh7MWL3+Dw1veY8iEC+1avvlQpo/iM0RkXqoHUKWqH6jql1T1FFWdqqrVqroL92a+l4BTVXVnhsvsG5GCUqRpN3XbagAYPCj9Qf/AM30L+sZ/JJoPQDgvB4M+8LFJkwF4bdnLB0zf/PqzEIowfuo52SiW8amMnun3Nm2vqtaz/w7+nJVfmKCxpZV92zcBUFaW/v62Mbumb3yuORQnBsRjuTkc7IhR41gYLWD7hpXA5z6c3rB5DbGBY4nEc6crozk0O4oHSGGR2z2pqb6apBMmHMtP+zrbn91b0Dd+1Bpyz/ALQ81ZLkl2iOOQHDgOqV0D6o56/n5tPdGGrZQNOzLLpTN+Y0fxAGnLPtb6wRb3QJeB63Qi8mHgt+Z940cb4m5Wytbi/jnCXncUH34k7NtFXZ3bde/ttasQNO0ZO03w2FE8QBKJUgCchjo0lLmmzLYmfruRz/hRfXwEt7Rcwb74kEMv3E8NH+nm8Vj39loAajetBYERFvRNB3YUD5CBAwcC0NKaRMOZu2mprVk/Zl32jA9FQg4gNLdqtouSNcOHuz2d62o2ArBrWzUSTxAvsOv55kAW9AOkJJFAcZv0NZy5wW/azvTtmr7xowuOd5NUHT88cYgl+69EIkFrOI89293uvHt3bCFalP7ePSZ4/NZP33QhEg6joQjS2gSRzAX9qAV942PTxpWz/u7c7pYmImh8II27ttLUkiS0t5aCUWOyXSzjQ3YUDxgn7KYalUj679xvEw07hBwh5FiCD2P8KjygnOTuWmrr6ylgH3nFuXuPg+mcBf2AcSLuDXxOBrOPxcIhG2zHGJ+LJwbh7Kunbos7Pll+qTXvm4PZkTxgIuEIAKEMBv1o2LGmfWN8rrBkMI62suXdlQAMKE3/KJwmeOxIHjD5YbeJPRTNXPN+LOxYH31jfC5SUALA3m3rASjJQMZOEzx2JA+YcNtNdbHMDSNqZ/rG+F8svwiA5p01JBEGFhdluUTGj+xIHjCOtCXKiWRsnXl2Td8Y34vlu33ydU8tyUg+kbDl1TAHsy57AeN4sVeczO3QV54yirrdTRlbnzGm5/LzCwBo3LeXUEF5lktj/CqjQV9E5naxzk2qemkmyxNEjpdvv1kz133uhBGlGVuXMaZ32oI+QChWmMWSGD/L9Jn+3ao6N9UMETlfREqA3wGDgCWqOsObNwuYADyhqndkrLQ+FPJifXPS+swbY/YriOehCIISjhcc+g0mJ/ntQu1lwO9UtRIYICKVInIBEFLVqcBoERmX3SJm19CE21VvzGC7SccYs19BXoRGvHt94tY6Z1Lz2zX9OuBoEUkAw4D3gOnAn7z5c4CTgbc6vlFErgKuAhg+fHhGCpsNY8oKGHpcBfkjyrJdFGOMj8TCDlGaAXAGWDY+k5rfzvRfBEYA1wOrge1AAVDtzd8OpEwzpaoPqGqlqlaWl/fvm1jyoyHI4I18xhj/ExEc3JEGw8VDs1wa41d+O9O/DbhaVXeJyI3A14DdQFv6uUL890MlO8SCvjEmtbwSC/omNb8F0BJgooiEgBMBBZbgNukDTALWZ6dofuGNGe74bdMZY/xiQPHAbBfB+JTfzvTvAn6F28S/CPgD7g+TF0TkMOAsYEr2iucjYkHfGHOgl5NHcZjUcUJh5jJ2mmDJdNCfISK3djLvNVW9AfhYxxkiUgWcAfy3qu5MY/mCw5r3jTEd/DXpNop+tSBzGTtNsGQ06Kvql3r5vnr238Gf27Sted9vjTTGGL8oyY9muwjGp6yNOGhaGt2/kbzslsMY41sRGxXTdMJOF4OmZZ/7N2IZt4wxB3rs6qms3rwr28UwPmZBP2gmXwnrX4SQXbMzxhzo4yNL+fhIy8ZnOmdBP2gGjXcfxhhjTA/ZhR9jjDEmR1jQN8YYY3KEBX1jjDEmR1jQN8YYY3KEBX1jjDEmR1jQN8YYY3KEBX1jjDEmR1jQN8YYY3JE2pLziMjcLj5/k6pemq51G2OMMeZg6czId7eqzk01Q0TO9/4OBh5X1Wne6wjwF6AUmKWqD6WalsYyG2OMMf1W1pr3RaQE+DXQfuSY64AlqvoJ4IsiMqCTacYYY4zpoWzm3m8FLgT+1m5aFXCz93w+UNnJtOc6fpiIXAVc5b3cLSJr+rCsZUBtH35eNlld/Ke/1AOsLn5ldfGnvqzLiO4slLWgr6q7AESk/eQCoNp7vh0Y3Mm0VJ/3APBAOsoqIq+qamU6PjvTrC7+01/qAVYXv7K6+FM26uK3u/d3A3HveSFu+VJNM8YYY0wP+S2ALgFO9p5PAtZ3Ms0YY4wxPZTNa/qp/Bp4UkSmAROAxbhN+x2nZVpaLhtkidXFf/pLPcDq4ldWF3/KeF1EVdPzwSKPAeWdzH5NVW/o5H2H4Z7ZP6OqOzubZowxxpieSVvQN8YYY4y/+O2avjHGmB4QkVIROUNEyrJdlo+qP9XFryzoH4KIzBKRRSJya7bL0h0iEhaRjSIyz3tMFJHbReQVEbmv3XIHTfMbERksIi94zyMiMltEFojI13syLds61KNCRDa12z7l3vSDvmd+++6JSLGIPCUic0Tk/0Qk2t1y+6kundTjgH3GW873+42X5OwfwGTgOREpD+I2gU7rEsjt0sbb95d5z32xXSzod0FELgBCqjoVGC0i47Jdpm44BviDqlapahUQxb0fYjKwVUROF5ETOk7LWmk7IQdnbOxutkZfZXBMUY8TgTvbto+qbkv1PfPpd+8S4Ceq+mmgBvgK3Si3D+vSsR43026fUdUVqfYRn+43xwA3quqdwDPAaQRzm8DBdfk6wd0ubX4MxLu7DTKxXSzod60K+JP3fA77uw762RTgsyLysojMAj4F/FndmzeeAaYBn0wxzW/aMjbu8l5XsX9btM/W2J1p2dSxHlOAb4jIUhH5gTetioO/Z6mmZZWq3q+q//RelgOX0r1yp5qWNSnq0UK7fUZEwqTeR3y336jq86r6koicghv0PkMAtwmkrMteArpdAETkNGAP7g/LKnyyXSzod61b2QB95hXgdFWdDERwExv1KsthNqnqrg49NbqbrdFXdUtRj6dwd+yPA1NF5BgCUI/2RGQqUAK8RwC3SZt29fgnB+4zZxOsegjuD8t6QAn2Nmlfl2UEdLuISBT4HvtTyPvm+GVBv2tBzAb4uqpu9p6/Sv/Jctjdevi9bgtV9QNVbcU9qI0jQPUQkVJgJm7Ta2C3SYd6dNxnArVN1HUN8DpwEgHdJnBQXQ4L8Ha5GbhfVXd4r32zr/jhn+NnQcwG+FsRmSQiIeB83F+O/SHLYXezNfq9bs+IyFARyQc+DawkIPXwzl4eA76rqhsI6DZJUY+O+8xyAlAPABG5SUSmey8TwN0EcJtAyrr8IqjbBTgduEZE5gHHAufil+2iqvbo5AEU4X7RfgKsBoqzXaZulPlo3F/JK4A7cX/YLQDuBdYAo1JNy3a5u6jPPO/vCOANr8yvAKHuTst2HTrU41TgTW8bXdvZ98yP3z3gm7jNrvO8x+XdKbff6pKiHre132e8ZQKx37D/8sR84H7v/x24bdJJXSYGdbt0qNe87m6DTGwXS85zCN7d12cA81W1Jtvl6Q0RiQPnAEtV9Z3OpvmddDNbY6ppfpfqexaE7153yx2EunQU1P2mP28TsO3ykcthQd8YY4zJDXZN3xhjjMkRFvSNMcaYHGFB3xhzAO9u6bbnjoj06jghIiN7sOzo3qzDGNMzFvSNyXEiMk1ELhWRb4jIYOAJEVkmIktxc6GfLiKRdst/S0S+0u51OMVn3gQc34NifNPLxGaMSSO7kc+YHCcic4AHcDOILVTVb4rI9cAyVW0bKOgV3LSoSWA4sLHt7UA+cIqq7vWWHQl8W1WvFZGHgQdV9UVvAJFNqvpwijKEgUeBL6tqMl11NSbXHfQL3RiTc5q9vz9V1YdF5FvAWcB4EbkCuBV4GngZKAPGAO/gpuGtAMa0BXzPZUCPRjtT1RYReRb4BPDCR6mMMaZz1rxvTA4TkUuAUuB64AoReR53tLOrcZPW7ADygB8A63AT23weOA83OO8Cvt/hY8eo6uou1nmxuEOlzheRxnazXgKO64t6GWNSszN9Y3KYqv5ORArZf7a/DpgOjAa+ijvoB8BRuAOh3ARcAfwv8EvcHwUJ4KEuVjNTRHbiZku8XVV/D/xeRO7ATYfbZi/7844bY9LAzvSNyWHewDPn4Z6xHw7cgHudPg9431usAJgB/Ai3ReAw4Nu4AfrHwCAvn32bvd4PiTbXqWoVMKvdes/CbRGY2W65UbiXDIwxaWJB35jcFgL+3Xt+NfCfuGf7RwOrgM1AJW5AnoX7g6AcN/CHcfOdT8NtHWjzJPCFzlYoIiNwbxq8qsOs83HHEDfGpIk17xuT27YDk4FvARer6moRaQEeBH4IjAfuUdX2Z+k3ADWq+mgnn/kP4I8i8lQn82/B/eEw2x0+nRne622qWtsHdTLGdMK67BmTw0RkKnARcJeqbhaRk4DbgW+o6gYRmQGEVfW+du+5CahW1Ue6+NzDcbvx/b6b5bgRmKmqzYdc2BjTaxb0jTHGmBxh1/SNMcaYHGFB3xhjjMkRFvSNMcaYHGFB3xhjjMkRFvSNMcaYHGFB3xhjjMkR/w+ciEn5roiqtwAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#%fig=用频率扫描波测量的频率响应\n", "# 产生2秒钟的取样频率为sampling_rate Hz的频率扫描信号\n", "# 开始频率为0, 结束频率为sampling_rate/2\n", "t = np.arange(0, 2, 1/sampling_rate) #❶\n", "sweep = signal.chirp(t, f0=0, t1=2, f1=sampling_rate/2) #❷\n", "# 对频率扫描信号进行滤波\n", "out = signal.lfilter(b, a, sweep) #❸\n", "# 将波形转换为能量\n", "out = 20*np.log10(np.abs(out)) #❹\n", "# 找到所有局部最大值的下标\n", "index = signal.argrelmax(out, order=3) #❺\n", "# 绘制滤波之后的波形的增益\n", "pl.figure(figsize=(8, 2.5))\n", "pl.plot(freq, power, label=u\"带通IIR滤波器的频率响应\") \n", "pl.plot(t[index]/2.0*4000, out[index], label=u\"频率扫描波测量的频谱\", alpha=0.6) #❻\n", "pl.legend(loc=\"best\")\n", "#%hide\n", "pl.title(u\"频率扫描波测量的滤波器频谱\")\n", "pl.ylim(-100,20)\n", "pl.ylabel(u\"增益(dB)\")\n", "pl.xlabel(u\"频率(Hz)\");" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 连续时间线性系统" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0,0.5,'位移(米)')" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#%fig=系统的阶跃响应和正弦波响应\n", "m, b, k = 1.0, 10, 20\n", "\n", "numerator = [1]\n", "denominator = [m, b, k]\n", "\n", "plant = signal.lti(numerator, denominator) #❶\n", "\n", "t = np.arange(0, 2, 0.01)\n", "_, x_step = plant.step(T=t) #❷\n", "_, x_sin, _ = signal.lsim(plant, U=np.sin(np.pi * t), T=t) #❸\n", "#%hide\n", "pl.plot(t, x_step, label=u\"阶跃响应\")\n", "pl.plot(t, x_sin, label=u\"正弦波响应\")\n", "pl.legend(loc=\"best\")\n", "pl.xlabel(u\"时间(秒)\")\n", "pl.ylabel(u\"位移(米)\")" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.4" } }, "nbformat": 4, "nbformat_minor": 1 } ================================================ FILE: 4.scipy/7.scipy-interpolate.ipynb ================================================ { "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "group_control": { "group": 0 } }, "outputs": [], "source": [ "import numpy as np\n", "import pylab as pl\n", "from scipy import interpolate" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import matplotlib as mpl\n", "mpl.rcParams['font.sans-serif'] = ['SimHei']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 插值-interpolate" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 一维插值" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "> **WARNING**\n", "\n", "> 高次`interp1d()`插值的运算量很大,因此对于点数较多的数据,建议使用后面介绍的`UnivariateSpline()`。" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "group_control": { "group": 0 } }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#%fig=`interp1d`的各阶插值\n", "from scipy import interpolate\n", "\n", "x = np.linspace(0, 10, 11)\n", "y = np.sin(x)\n", "\n", "xnew = np.linspace(0, 10, 101)\n", "pl.plot(x, y, 'ro')\n", "for kind in ['nearest', 'zero', 'slinear', 'quadratic']:\n", " f = interpolate.interp1d(x, y, kind=kind) #❶\n", " ynew = f(xnew) #❷\n", " pl.plot(xnew, ynew, label=str(kind))\n", "\n", "pl.legend(loc='lower right')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 外推和Spline拟合" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "group_control": { "group": 0 } }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#%fig=使用UnivariateSpline进行插值:外推(上),数据拟合(下)\n", "x1 = np.linspace(0, 10, 20)\n", "y1 = np.sin(x1)\n", "sx1 = np.linspace(0, 12, 100)\n", "sy1 = interpolate.UnivariateSpline(x1, y1, s=0)(sx1) #❶\n", "\n", "x2 = np.linspace(0, 20, 200)\n", "y2 = np.sin(x2) + np.random.standard_normal(len(x2)) * 0.2\n", "sx2 = np.linspace(0, 20, 2000)\n", "spline2 = interpolate.UnivariateSpline(x2, y2, s=8) #❷\n", "sy2 = spline2(sx2)\n", "\n", "pl.figure(figsize=(8, 5))\n", "pl.subplot(211)\n", "pl.plot(x1, y1, \".\", label=u\"数据点\")\n", "pl.plot(sx1, sy1, label=u\"spline曲线\")\n", "pl.legend()\n", "\n", "pl.subplot(212)\n", "pl.plot(x2, y2, \".\", label=u\"数据点\")\n", "pl.plot(sx2, sy2, linewidth=2, label=u\"spline曲线\")\n", "pl.plot(x2, np.sin(x2), label=u\"无噪声曲线\")\n", "pl.legend()" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "group_control": { "group": 0 } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 0.053 3.151 6.36 9.386 12.603 15.619 18.929]\n" ] } ], "source": [ "print(np.array_str(spline2.roots(), precision=3))" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "group_control": { "group": 0 } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#%fig=计算Spline与水平线的交点\n", "def roots_at(self, v): #❶\n", " coeff = self.get_coeffs()\n", " coeff -= v\n", " try:\n", " root = self.roots()\n", " return root\n", " finally:\n", " coeff += v\n", "\n", "\n", "interpolate.UnivariateSpline.roots_at = roots_at #❷\n", "\n", "pl.plot(sx2, sy2, linewidth=2, label=u\"spline曲线\")\n", "\n", "ax = pl.gca()\n", "for level in [0.5, 0.75, -0.5, -0.75]:\n", " ax.axhline(level, ls=\":\", color=\"k\")\n", " xr = spline2.roots_at(level) #❸\n", " pl.plot(xr, spline2(xr), \"ro\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 参数插值" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "group_control": { "group": 0 } }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#%fig=使用参数插值连接二维平面上的点\n", "x = [\n", " 4.913, 4.913, 4.918, 4.938, 4.955, 4.949, 4.911, 4.848, 4.864, 4.893,\n", " 4.935, 4.981, 5.01, 5.021\n", "]\n", "\n", "y = [\n", " 5.2785, 5.2875, 5.291, 5.289, 5.28, 5.26, 5.245, 5.245, 5.2615, 5.278,\n", " 5.2775, 5.261, 5.245, 5.241\n", "]\n", "\n", "pl.plot(x, y, \"o\")\n", "\n", "for s in (0, 1e-4):\n", " tck, t = interpolate.splprep([x, y], s=s) #❶\n", " xi, yi = interpolate.splev(np.linspace(t[0], t[-1], 200), tck) #❷\n", " pl.plot(xi, yi, lw=2, label=u\"s=%g\" % s)\n", "\n", "pl.legend()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 单调插值" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from scipy import interpolate\n", "\n", "x = np.arange(0, 2 * np.pi + np.pi / 4, 2 * np.pi / 8)\n", "y = np.sin(x)\n", "tck = interpolate.splrep(x, y, s=0)\n", "xnew = np.arange(0, 2 * np.pi, np.pi / 50)\n", "ynew = interpolate.splev(xnew, tck, der=0)\n", "\n", "plt.figure()\n", "plt.plot(x, y, 'x', xnew, ynew, xnew, np.sin(xnew), x, y, 'b')\n", "plt.legend(['Linear', 'Cubic Spline', 'True'])\n", "plt.axis([-0.05, 6.33, -1.05, 1.05])\n", "plt.title('三次样条插值')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 多维插值" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "group_control": { "group": 0 } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#%fig=使用interp2d类进行二维插值\n", "def func(x, y): #❶\n", " return (x + y) * np.exp(-5.0 * (x**2 + y**2))\n", "\n", "\n", "# X-Y轴分为15*15的网格\n", "y, x = np.mgrid[-1:1:15j, -1:1:15j] #❷\n", "fvals = func(x, y) # 计算每个网格点上的函数值\n", "\n", "# 二维插值\n", "newfunc = interpolate.interp2d(x, y, fvals, kind='cubic') #❸\n", "\n", "# 计算100*100的网格上的插值\n", "xnew = np.linspace(-1, 1, 100)\n", "ynew = np.linspace(-1, 1, 100)\n", "fnew = newfunc(xnew, ynew) #❹\n", "#%hide\n", "pl.subplot(121)\n", "pl.imshow(\n", " fvals,\n", " extent=[-1, 1, -1, 1],\n", " cmap=pl.cm.jet,\n", " interpolation='nearest',\n", " origin=\"lower\")\n", "pl.title(\"fvals\")\n", "pl.subplot(122)\n", "pl.imshow(\n", " fnew,\n", " extent=[-1, 1, -1, 1],\n", " cmap=pl.cm.jet,\n", " interpolation='nearest',\n", " origin=\"lower\")\n", "pl.title(\"fnew\")\n", "pl.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### griddata" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "> **WARNING**\n", "\n", "> `griddata()`使用欧几里得距离计算插值。如果K维空间中每个维度的取值范围相差较大,则应先将数据正规化,然后使用`griddata()`进行插值运算。" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "group_control": { "group": 0 } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#%fig=使用gridata进行二维插值\n", "# 计算随机N个点的坐标,以及这些点对应的函数值\n", "N = 200\n", "np.random.seed(42)\n", "x = np.random.uniform(-1, 1, N)\n", "y = np.random.uniform(-1, 1, N)\n", "z = func(x, y)\n", "\n", "yg, xg = np.mgrid[-1:1:100j, -1:1:100j]\n", "xi = np.c_[xg.ravel(), yg.ravel()]\n", "\n", "methods = 'nearest', 'linear', 'cubic'\n", "\n", "zgs = [\n", " interpolate.griddata((x, y), z, xi, method=method).reshape(100, 100)\n", " for method in methods\n", "]\n", "#%hide\n", "fig, axes = pl.subplots(1, 3, figsize=(11.5, 3.5))\n", "\n", "for ax, method, zg in zip(axes, methods, zgs):\n", " ax.imshow(\n", " zg,\n", " extent=[-1, 1, -1, 1],\n", " cmap=pl.cm.jet,\n", " interpolation='nearest',\n", " origin=\"lower\")\n", " ax.set_xlabel(method)\n", " ax.scatter(x, y, c=z)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 径向基函数插值" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "group_control": { "group": 0 } }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYAAAAD7CAYAAABjVUMJAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzs3Xd4VMX6wPHvbHbTGwkQSmihVykB6YQgRUVEREERBEXEix1RuYhXBRUVvZZ7/XltKBZQOiq9hI5UAUOH0ELo6XWzO78/NkSQhASy2ZPyfp4nD4c9s2feg3HeM3PmzFFaa4QQQpQ/JqMDEEIIYQxJAEIIUU5JAhBCiHJKEoAQQpRTkgCEEKKckgQghBDllFMTgFIqRCm17jr7qyulTimlonJ+KjmzfiGEEIWnnPUcgFKqAjADqKy1bp1PmQFAiNb6/5xSqRBCiJvmzB6ADRgEJF2nTHtgpFJqh1LqLSfWLYQQ4gY5LQForZO01okFFFsMRABtgQ5KqRbOql8IIcSNMbu4vo1a60wApdROoD6w+8oCSqlRwCgAHx+fNo0aNXJxiDnsVshKB2vaXz8267XlzJ7g7gPuvuDhC27uro9VCCGusH379gta6wLvsTrtHkDuAZWK0lpH5LcPeABIBLYA92qtD+R3rPDwcL1t2zanxnfTtIak0xC7DU5tg1Nb4fROyM64upx/KNTuDGHdoE43CKhuTLxCiHJLKbVdax1eULli6wEopSKBJlrr/1zx8evAaiAL+Ox6jX+Jo5SjMQ+oDk3udnyWnQVxu+DkZji+CY5vgKRTsHum4wcguD7Uuw3q3wa1OoHFy7hzEEKIKzi9B+BMJaoHUBh2O5zbCzFrIWYNHNsAWcl/7Td7Qd3u0PB2aNAHfCsbF6sQoswqbA9AEkBxslkdw0WHl8PhFY7eQi4FtTpCk/7QpB/4VTEsTCFE2SIJoCRKioODi2H/IkcPwZaVs0NBna5wywPQ+C7HzWQhSgmr1cqpU6fIyMgouLBwKk9PT0JDQ7FYLFd9LgmgpMtIhANLYO98R+/gcjKweEPTe6DNCAgNd9x7EKIEi4mJwc/Pj+DgYJT8vrqM1pqLFy+SnJxMnTp1rtpn+E1gUQDPALhlkOMnPR6i58Pun+DEJvjjB8dPSDNo9xi0GCQ3j0WJlZGRQe3ataXxdzGlFMHBwZw/f/6mjyGLwZUEXhUgfAQ8sgSe2gGdngHvinD2T/jlGfh3U1g1GVLOGR2pEHmSxt8YRf13lwRQ0gTXhZ5vwPN7YcCXUK0VpF2Ete/Bh81hyXhIPmN0lEKUShEREVf9PSoqimPHjl312ZkzZ5gyZYrT6x4+fPg1dbmi3uuRBFBSmT2gxX3w2GoYsQQa3uF46Gzzp/BhC0ciSLtkdJRClGp5JYAqVarw8ssvuzwWI+qVewAlnVJQq4PjJ243rH0X9v3iSAQ7f4CuL0C7UWDxNDpSIeC1gGI6bv7LjLVp04bKlSvj7u7OmTNnOH78OJs3b6Z27dq89tprREREXHPlDzBixAhWr17N/Pnzadq0KT/88AMAx44d47XXXuObb74B4PDhwwwdOhQvLy8SExOZM2cOr732Gq+99tpVdTRo0ID7778fpRRdu3blzTffJCYmhiFDhuDt7U1SUlLu8SdMmIC7u2PZmGnTpuVZ74ULFxg+fDgXL16kQYMGTJs2DZPJudfsZbIHoK1W7FlZBRcsbaq2gEHfw+PrICwCMhNh+UT49FY4tMLo6IQwRFpaGrNmzWL37t38+OOPNG7cuFDfmzZtGsOHD+fDDz/Mbfzz8u677zJhwgSWL19OZmZmvuViY2OZMmUKixcv5pdffsn97osvvsiSJUtITv7rodBffvmFxx9/PLfxz8tbb73FkCFD2LRpE02bNuX48eOFOq8bUSZ7AClr1nD65fH49YjEr08ffDp1wuRehhZpq9oChs6Hwyth2Stwfh/8cK9j+mjvt8G/qtERivLqOlfqxSUkJARfX19q1aqFm5sbtWrVyt2Xnp5e5OOfOHGCpk2b4ubmRvPmza/Zf7kOs9nM66+/jq+vb25jHxMTwy233ILZbKZly5a53+nVqxft27e/br379+9nzJgxAIwbN67I55GXMtkDSN+1C3tKCokLFnLqiX9wqFNnTr/0EsmrV5ednoFSjvWFRq+DnpMczw9Ez4P/3gq7ZxkdnRCGOX36NOfPn8dms7F8+fLrlvXy8iItLQ1wzKvPS1hYGHv27MFms7Frl+Npfnd392vq+OCDDxg/fjxffvll7uycmjVrEh0djc1mY8+ePbnH9PUt+GHPRo0asXXrVgBGjRrFihXO7+WXyQRQeexYwhYvotKzz+LRqBH25OS/kkHHTo5ksKqMJAM3C3R6GsZsgfq9HcNCc0fC7EcczxcIUc7s37+fl156iSeeeIJ69epdt+y9997LlClTaN++PUeOHMmzzLhx45gyZQq9e/fObbgHDx58TR19+/Zl9OjR9OvXD29vb2JjY3nxxReZPHkyPXv2zB3zL6zx48czffp0unXrBsBtt912Q98vjHLxJHBmTAzJS5eStGQpmfv3535u8vV1DBP17oNP5zIwTKQ17JjumCFkTQX/6nD/dMcTxUIUk3379hV63L20Gz58eO7N35Iir39/WQoiH+UiGVw8AnNHOd5d4OYOt78LbYbLshKiWJSnBFASSQK4SQUmg9J8Azk7C5ZNgC2fO/7eaijc+QGYS+G5iBJNEoCxJAE4Qb7JwM8Pv8hI/Pr0Lp3JYNdPjuUkstMdbygb9D14+hsdlShDJAEYSxKAk5W5ZHB6J/xwP6Seg5DmMGSWTBUVTiMJwFiSAIpRmUkG8cfg+3vh4mEIqAEPL4SgMKOjEmWAJABjFSUBlMlpoM7kUacOFUePJmz+PMIWLaLSs89cMbV0wRXPGbxcsp8zqFAbHlkGoW0h8SR80xcuHTU6KiFKlWeffdboEJxKegA36fo9g+4l9wZyZjJ8P9DxInv/UBj+KwTVKfh7QuRDegDGkiEgg2XGxJC8ZIkjGRw4kPt5iR0m+nsSeGQxBNY0OipRSl3ZADX/9tqlEpxhz8N7rrs/PT2dAQMGcOnSJerWrUujRo3YuHEjqamp1KtXj2nTpl21MNzlBdcGDRrEfffdR1JSEsHBwcyaNQur1XrNZ2azY9WciIgIoqKiAEhJSWHgwIHX1GG1Wlm3bh1JSUksWbKEKlWK933fMgRkMI86daj4xBOELZhfOoaJPPzgodlQ41ZIOuVIBrK0tCjF9u/fT2hoKOvXr+fw4cM88MADPPXUU6xYsYJjx45x9uzZPL+3d+9eTCYTa9euZcSIEaSkpOT5WV7i4uLyrOPw4cOsXbuWAQMGsGrVqmI7Z2cok4vBGckjrA4eo0dTcfToa4aJEhcsIHHBgpLRM/Dwgwd/hmm3w7m9MHMIDJ0ny0qLIinoSr24VK9ene3bt9O1a1eeeeYZLBYLX375JdOmTePSpUvXLAqXnp6Ol5cXrVu3plmzZvTq1Yv69evTp0+fPD/LS351DBs2DHCsA5Rl9MVeAaQHUIyuuoG8uICeQVQU2tW/LF6BjimhftXgxEaYNwrsdtfGIIQTLFmyhIkTJ7Jp0yaGDBnCV199xcCBA5kxYwY+Pj7AXwu4XS4PsGvXLjp16sSyZcuIj49n3bp1eX6Wl7zqAK7aLukkAbhIgclg9BMcNGKYKCDUMRzk4Q97F8Dqya6pVwgnatWqFU899RSRkZEMHjyYnj178vbbbxMZGQk41urv168fn3zyCaNHjyY4OBiA2rVr8/HHH9OxY0fOnDlDeHh4np/lJa86Shu5CWywzKMxJC8tATeQj6yG7weAtsOgH6Bx3+KtT5QZJWEW0BdffMGMGTOwWCxYLBZeeOGFPN8CVhbJLKAywvDZRBs+guWvgrsfjFoNFesXTz2iTCkJCaA8kwRQBhnSM9AaZg2HvfOhYkN4bKXjZrEQ1yEJwFiSAMq4ApPB7X3w7dgR5YxkkJkCX/aA8/uhxSAY8HnRjynKNEkAxpIEUI64ZJjo/EH4X1fHCqIDvoQW9zkhclFWSQIwliSAcqrAZFCUnsG2afDrs47ZQaPXQ4VaBX9HlEuSAIwlTwKXU9c8gfzM03g0bJj31NIbfc6gzXBoeCdkJsG8x8FuK7bzEMIZ/j7rp6wt3FYcJAGUER5hVySDxQUkg8I8Z6AU9PsEfKvAiU2w4UPXnIgQTvLhh/I7WxBZCqIM8qhTB48nnqDiE09ccwP5muUorjdM5BMM/T91PB8Q9Q40ugsqNXD9CYlSY1+j4hkKarx/3w1/58qF2/JapM3f359hw4Zx7tw5mjdvzn//+988F3i7fKy2bduye/duli5d6sxTM5T0AMq4q3oG1xsmenl83sNE9XpAy4fAlgm/PC1LRYhS6++LtH3++ec0a9aMtWvXEhcXx+7du/Nd4G3z5s106NChTDX+ID2AcsUj7IqeweWF6hYvcfQM5s8ncf78vHsGvSfD4eWOoaBtX0G7x4w+FVFC3cyVuqv8fZG2AwcOsHHjRqKiokhISCA2NpbGjRvnucBbs2bNGDBggJHhFwunJgClVAgwW2vdJZ/9FmAuEAR8pbX+2pn1i8LzqHPFqqXXGybq0QO/Pr3x7TkFNW8E1qWvMmilPzsTfakW6MW43g3p36q60acjRIH+vkhbw4YNadeuHSNGjODXX3+lZs2auQu83X///XTr1i23rK+vr6vDdQmnDQEppSoA3wLXWwrvKWC71roTMFApJY+ZlgDXHSaaP98xTDRyCod3NSHjpI0nUj9DA7EJ6Yyfu4f5O0vfIlhCPPbYYyxevJiuXbvy2WefUaNGjTKxwNuNcNpzAEopf0ABC7TWEfmUWQi8rLXeq5R6Gfhda706v2PKcwDGyu0ZLF5C5sGDuZ8fqGvno571ic2uR3ZSC6p612bDy5EGRiqMJM8BGKsozwE4bQhIa52UU/H1ivkAl1PqJSDk7wWUUqOAUeAYqxPG8Qirw/HBPZgStpVT0W502K/pu8VOwyMm7vU9yv9uP4Z7xdVcuNiFNGt7vC3eRocshLgBrp4FlAJ45Wz75lW/1vpzrXW41jq8UqVKLg1OXG1D7AaGLR7G1jNbia/sxS+t2jGpa1/sbtBjl+aJZZ6Axr3iGu5ZcA9bz2w1OmQhxA1wdQLYDnTO2b4FOObi+kUh/XzgZ8asHEOqNZXetXuz6v5VvNp+MocCevBTu9tAabrvSGXAytZU8azL6dTTPLHiCbaf3W506MIAJXlJmbKsqP/uxZYAlFKRSqkn//bxt8DrSqmPgCbA78VVv7h53+39jkmbJ2HTNkY2H8m7Xd/Fz92P/q2q8/aA5qxseA9nwx1vVHpg+xbmNZ3EvfXvJdOWyZMrn2TfxZI7FVA4n6enJxcvXpQk4GJaay5evIin582/x9vli8Epparh6AUs1VonXq+s3AR2ve1nt/Po0kexaRv/6vAvBjYYmHfBxFPEDe1CwkFP3GtUpeb8hby09VWWH19OkGcQ02+fTi1/WUCuPLBarZw6dYqMjAyjQyl3PD09CQ0NxWKxXPW5y28CF5bW+jTws6vrFQW7kH6BF9a8gE3bGNF0RP6NP0BAKCH/eJi0V78n62QcF96dypRXp5CSlcKmuE08ufJJfr7rZ7zMXvkfQ5QJFouFOnXqGB2GuAmyFIQAINuezbg147iQfoE2IW14uvXTBX7H1H0s1SMVyqRJ+OknMqPW8WH3D6kXWI9jScf4eMfHLohcCHGzJAEIAL7Y/QXbzm6joldFpnabitlUiM6hhx+eA/9JpVuSAIib8AqWSylM7jwZN+XG9/u+l5lBQpRgkgAEJ5JO8OWeLwF4p8s7VPSqWPgvtxpKUKca+FTJwJaQQNz48TSp0JhRLUYBMHHDRFKtqcURthCiiCQBlHNaa97e8jZZ9iz61e1Hu6rtbuwAbmZU7zepemsCbh6a1I0bufTtdB5r8RiNgxoTmxLL+9veL57ghRBFIgmgnFt9cjXrY9fjZ/HjuTbP3dxB6vXA0rgTVdtdAuD8Bx9gO3CYyZ0nYzaZmX1wtkwNFaIEkgRQjqVnp/POlncAGNNqzI0N/VxJKejxL/yqZxLYIBNttRI79gXqedbgwUYPotFM3TZV5okLUcJIAijHpv05jdOpp2lYoSGDGg4q2sFqtIVGfQlpcQn3EF+yjh7l7LvvMqrFKPzd/dlyZgtrT611TuBCCKeQBFBOxWfE8230twCMv3V84Wb9FCTyFUwWRfXWJ1AWMwkzZmLasJ3Rt4wG4P3t75Ntzy56PUIIp5AEUE5Ni55GWnYanat3pk1IG+cctHJjaDEYz4AMKvUMBRxTQwcG9aCGXw1iEmOYc3COc+oqY+bvjKXTlFXUefk3Ok1ZJe9YEC4hCaAcupB+gZn7ZwLwZMu/L9dURN3Hg8lCkN8mfNregi0+nvP/nMhzrZ4B4NNdn5JmTXNunaVM9Onf+dcvD9Hp25b0nB7O4OkRfLnuMTIyt8qLdoRLSQIoh77a8xXp2elE1IigacWmzj14YE1oMxylNFW7adwqVCB140ZaR52mRcUWXMq4xM8HyudKIPuPLmfw9HYMXj6SuZd2kYSNMzqTaH2R4wEnya71HZ0q/Rd3Mkm32nhv6QGjQxZlnCSAcuZs6tncBtjpV/+XdRkLZk8sp5ZQdeyjAJz/4N+M8bkTcAw/pWenF0/dJdTGDe/w8JrniNbp+NtsDNO+zK/9AL/Ve5jbY+vSPcEDDeyueJLWtSfSyrKN0wnl699IuJ4kgHLmyz1fkmXPometnjQMalg8lfhXhXBHw++XtYzABwajrVZC3v2BW/wacynjErMOzCqeuksaawYLZg9izKHvSDMpbncLYmX/Xxk3fBN1u/2Tmp1eIDp9GI1+acCwZXWpnG4n2stEZs2Z9AyQHoAoXpIAypGL6ReZd3geAE/c8kTxVtb5ObB4w8ElhAy5Dfe6dck6epTnNlYAHL2AjOwyvnywzcqcmXfxSupespViRHAbpjy4Cs+gsNwi1rNneWvdp3Q/tZM7dxzkX//z5a4dJk6Z3fAP+Ax9+g8DT0CUdZIAypEf9/9Ipi2TiNAI6leoX7yV+VaCWx8HwLRpKtWnvoeyWPD+dS33xFXnQvoFZh+cXbwxGMluZ/fcYUy2xQHwUsOHeL7vN5hMbrlFrGfPcnzYMNzPxJJRqy4nKlSnUnoSQ5dmMWaRZqmPB7PmDIILh406C1HGSQIoJ9Ksabkzfx5p/ohrKu34NLj7wZFVeHonUOn55wEYNPcCFZI1X//5NZm2TNfE4kpac3HJOJ5P+oNspXgw9DYeav/SVUUuN/7W4yfwaNKYFj99T68Ny6j27jtgNtMlGgJSNO/4Wtj3031glfsBwvkkAZQTsw/OJikriVaVW9GqcivXVOodBB3+4diOeough4fh06kTpqRUxi315ELaORYeWeiaWFwoe9N/efHEQs6azbTyr8MLEe9etf/vjX+tr7/GLTAQZTIR0K8fvhHdUHY7T8U1IcukGO+ehi1qikFnI8oySQDlgNVuZfre6QA80sxFV/+Xtf8HeARAzFrU8Q1Uffst3CpUoN6hVO7Yqvnmz2+w2W2ujak4xW7nf1unssXLk2CzD1N7f4nF7a/X9eXX+F8pcMC9ALTZnkx1j2COuLvz666vQO4HCCeTBFAOLI5ZzNm0s9QNqEvX0K6urdwrEDqMcWxHvY2lUiWqvjkZgCFRdtTh46w4scK1MRWXjEQOzh3BlwG+ALzX4xMqe1fO3V2Yxh/At2sX3CpVxBpzjLE+jmTwaaAfWQvHgM3qmnMR5YIkgDJOa8030d8AMLzZcEzKgP/k7UeDZyAc3wAxa/CLjCTwgcGYbfDMAhvTt39R+lcK1Rrbwmd43T2DbKUYVH8gbau0zd1d2MYfQJnNBPbvD0CTTXHU9a/DaYuZ2anHYMNHrjgbUU5IAijjNsdt5lD8ISp5VeLOOncaE4RnAHR8yrG9+i3QmpAXX8QSVofQi9B29l42x202JjZn2fk9M08tZ7enB5U9g3km/PncXTfS+F8WMGAAAMlLlvJ0Y8diep8HBpC2biokny2+8xDliiSAMu67vd8BMLjR4KvGol3u1sfBKwhO/g6HV2Ly8iL0gw+wm93ovVMTNePdgo9RUiWdJm7FBD6q4GjUJ3R4FT93P+DmGn8Ajzp18GrTBp2WRqs/02gW3IyLZjd+9LZIL0A4jSSAMuxo4lHWxa7Dw82D+xrcZ2wwHn7QybEgHKsng9Z4NmpE4LOO5Sgiv99P9P71BgZ4k7SG38YyxddCuslEz1o9iawZCdx8439Z4L2O8f/EOXN5uvXTAHwT4EfG9q8g+Yzzz0WUO5IAyrAf9v4AwF1176KCZwWDowHaPQY+leD0TjiwGIBqj4zifPPq+KfD6fHj0Xa7wUHeoOh5bD6+klU+3nibvXi53ctA0Rt/AP8+vTF5e5O+cyet0ivTJLgJiW5uLPVwg/X/Lo6zEeWMJIAyKiEjIXeO/dDGQw2OJoe7D3TOGRtf/RbY7SiTifrvfUySN4Tuu8DR/5Wi4Y20S2QvfpF3gh3J9bEWo6jsXdkpjT+Aydsb/zvvACBp3rzct7b97OcL26ZB0mnnnYsolyQBlFGzD80mw5ZB5+qdCQsMK/gLrhL+CPhVhbN7YJ8jQVWt3YSdj3YEIP2/X5Kxr5S8QH7ZK8w1pXPY3Z3qPtUY2mSo0xr/yy7fDE6Yv4De1XvgZ/Fjt6cH+9zs0gsQRSYJoAyy2qzM2DcDgKFNSsjV/2UWT8dy0QBRb0POQ2C9hkxgaSuFW7adE88/hz29hC99cHwTSbt/5D85N36fDx+L6UKCUxt/AK+WLXGvWxfbhQvYN2+nX71+APzk5wfbv4GU80U9E1GOSQIog5YdX8a59HPUC6xHh6odjA7nWq2HQUBNOL8f9jiWhQ4LDOPEw905FQy2mOOcfbcEzwqyZcNvY/lfYADxbibahLQhwrOF0xt/AKUUgZd7AXPmcn+D+wFY5O9Hst0KO74tch2i/JIEUMZorXOnfg5pPASllMER5cHsARGOm6WsfhOyHQvCDWv9GB/d7YbVDRJmzCR51SoDg7yOLZ9z8tIBfvT3R6F4qfZITj483OmN/2UBd/cDs5mUqChqWv1oW6Ut6Wh+8fWBbV87EpIQN0ESQBmz6/wuoi9GE+gRSN+wvkaHk79bBkOlRpBwwjGUAbSs3JKKLcL5McLxaxk34RWs584ZGGQekuJg9Vt8VCGAbAX3B92G+zOTyTp+vFgafwBzxYr4RnQDm43EhQu5v6GjF/BzhWB0UiwcWOTU+kT5IQmgjLl89X9fg/vwNHsaHM11mNwgcqJje+17kJkCwKjmo1jUVhFd1x1bfDxxL5ewqaHLJ7JLZbLU14cqqRbu+2RPsTb+l11+JiBh9hwiQyMJ8gziiJtmn7sFtnxeLHWKsk8SQBlyOuU0K06swKzMuVMGS7RGd0L1cEg9D5v/D4AO1TrQpGIzPrrDhtXfm9SNG7n07XSDA80Rsw69ZxbvBwdRIVnz9s/u2E+cKvbGH8C3i2OBuKyYGLJ3R9OrVi8AlvgHwrF1cHZvsdUtyi5JAGXIzP0zsWs7vWr3IsQnxOhwCqYU3PYvx/bGjyH1IkopRrUYRYKv4uu+jh7M+Q8+MH5qqM0Ki8ax0tuLY1kW3pgBPmcSXdL4w9ULxCXMmc3tdW4HYHFABewAW78o1vpF2SQJoIxIs6Yx+5DjFYsPNX7I4GhuQJ2uULcHZCY5poUCETUcr6xcWSuJi33aoq1WYl8YZ+zU0N//h/X8Pr7yqMi/frARctHmssb/ssvPBCQtXkILn/pU8anCGXsGuzzcYddMyEhySRyi7JAEUEbMOzyP5KxkWlVuRfNKzY0O58b0mgzK5JjRcv4AJmViVPNRALxz6xksYWFkHTli3NTQ5DMQNYVZbv6MnGmjWjx4NG7k0sYfrl4gLmXpMm6v7egFLKpaD6xpsHeBy2IRZYNTE4BS6iul1Cal1Cv57DcrpU4opaJyfkpZS1Uy2ey23Ju/Dzd52OBobkJIE2j9MGgbLHP86vSs1ZPa/rU5lhXHgWduB4vFuKmhyyZyISmdqot8qRYP1no1qDVtmksb/8tybwbPmUufOn0c4VnsZAP88aPL4xGlm9MSgFJqAOCmte4AhCml6udRrAUwQ2sdkfOzx1n1l2crT6wkNiWWGn41iKgRYXQ4N6f7Px0vkD+0DA6vxM3kxhO3PAHAv5PmE/Ss430Ccf+c4NqpoUejsP4+m6OrK1ElHs6F+tLku58MafwB/Hv3ciwQt2MHYQke1PavzaXsNLb4+MOJjXApxpC4ROnkzB5ABPBzzvYyoHMeZdoDfZVSW3J6C2Yn1l9ufbvX8TTo0CZDcTO5GRzNTfKtDF1zlohY9grYsulTpw8NKzTkbNpZlrSz4NOxI7aEBNdNDbVmYJ35HIdXV8QvUREToqj65f8wVzBuZVWTj89VC8Rd7gUsrpZzvbVrplGhiVLImQnAB4jN2b4E5DUNZStwm9a6HWAB7vh7AaXUKKXUNqXUtvPnZZ2Tgvxx7g92n9+Nv7s/d9e92+hwiubWJyCwJpzbC1u/wKRMuevgfxn9Ff5vTMAtMNAxNXR68U8Ntf46mePzUiDZzNEQ2P3KABrUbl3s9RbkygXi+oT2BGClTiELYNcMKEnPTYgSzZkJIAXwytn2zefYu7XWcTnb24Brhom01p9rrcO11uGVKlVyYnhl0+X3/Q5qOAhvi7exwRSVxRP6vOPYXjUZEmPpUr0LrSu3JiEzge/PL6LqW28CcP794p0aat27iRNv/YQ1p/H/cFgAj3V+rtjquxFXLhBXefcp6leoT7ItnS1B1SHhOJzYZHSIopRwZgLYzl/DPrcAx/Io851S6hallBvQH9jlxPrLnWOJx1h1YhVmk5kHGj1gdDjO0egOaNQXslJg8YsopXi2zbMATN87ncwOLQgcPKhYp4Za4+I48ejjZCWbORmimPSAGyM7PUewV7DT67oZVy0QN3sOkTUcbyBbnTsMJDeDReE4MwHMB4YqpT4A7geilVKT/1bmDeA74A9gk9Z6hRPrL3c7Rgo+AAAgAElEQVSmRU9Do7m77t1U8i5DvaXb3wV3X9j/K+z/jVaVWxERGkF6djr/3v5vQl56Cfe6dYtlaqj17FlODB5AVryVxErw6gMmwmq0YGCDgU6tp6hyF4hbs4buPi0BiMpOcDwUFr0AstIMjU+UDk5LAFrrJBw3gjcD3bXWu7TWr/ytzJ9a6xZa6+Za6wnOqrs8OpN6hoVHFmJSJkY0G2F0OM4VUP2vdYIWjYPMZF5o+wLuJncWHlnI9sQ/qT71PZSTp4Zaz57lxJAHyTqbAEFWnh9iJt3bjYntJ5a4m+tXLhAXsmY/Id4hnMu8xN7QFpCVDAeXGB2iKAWc+hyA1jpea/2z1lreWF3Mvo3+lmx7Nr1q9aKWfy2jw3G+do9BtVaQFAuLX6KWfy1GthgJwOTNk3FrUI9KzzteL+mMVUOtZ89yYtjDZJ06jUeFLN4bHkyyFzzY6EEaBzcu8ukUh8ABOS+NnzuXiNBuAKyqXMexM3quUWGJUkSeBC6FLmVcYs6hOQCMbD7S4GiKickN+n8GZi/44wfYM5tHmz1Kbf/aHE08yrd7vyXo4WGOqaFFXDU0t/E/fhyPClksv9+TrR5phHiHMKblGCefmPP4dv1rgbieSTUBWG2Ld+w8tBwykw2MTpQGkgBKoR/2/UB6djpdQ7vSMKih0eEUn8qNoM9bju1fn8M96TQT2jtGDj/b9RmnUmOp+vbbRZoaenXjbyW+dwqfBrmhULzd5W183X2deUZOdeUCcdXXHMDX4svhpGOcrBEO2RlwQIaBxPVJAihlkrOSmbHf8b7fMnv1f6U2IxyzgjKTYM5I2lduw51hd5Jpy2TcmnHoioE3PTX0qsY/2E6FyIu8XK8WdjQjm4+kbZW2xXVWTnP5mYCUJUuJCG4PwOpqDRw7ZRhIFEASQCnz3d7vSM5KJjwknFaVWxkdTvFTCvp9An7V4NRWWPQC49u+THXf6kRfjOadLe/gFxl5w1NDrWfP/dX4V3KjZtezTGrQiDO2dJpXbM4TLZ9wwckV3ZULxN0e4w/AansSoODwCkhPMDZAUaJJAihFEjISmL7XMczxZKsnDY7GhbyD4P5vwewJ278hYPNnvB/xPu4md34++DMLjyx0TA0t5KqhjsZ/mKPxr+pDzc6n+Lh2TZaTgrfZm3e6vIPFZHHRyRXd5QXiqkftx6zM7Lj4Jwm1O4AtS14XKa5LEkAp8nX016RaU+lUrRNtQtoYHY5r1WgHA792LBsd9TZNY7bwz1v/CcCkTZPYl3aU6lPfu2LV0NV5Hubqxt+Xmu0P832VIKZ5aszKzNRuU6nhX8OVZ1ZklxeIy/pjNz1VY+zazobQZo6df8owkMifJIBS4nzaeWbsc4z9P9XqKYOjMUijO+HODxzbvz3PgKRk+tfrT4Ytg5FLR7InKJXKzzmWa4ibcO2qoddc+bc/xK+VAng/0AeASZ0n0SW0i0tPyRlMPj743eF4N0CfP90BWGfKdiTLo6sh7ZKR4YkSTBJAKfHlni/JsGUQWSOSphWbGh2OccJHQMQ/QdtRvz7DxPgUetW8jRRrCqOXj2ZXZA18OnZwTA0d/8/cqaFXNf5VvKjW/jD/qV6RV4MDAHi53cv0Detr5JkVyeVhoKrrDuBm02w8tx1b7S5gz4YDiw2OTpRUkgBKgdiUWGYdnIVCMaZVyZ2X7jIRL0G//4CbO+7bvubdmH3cX6sPWfYsnls7lsVD6mMKDCB1wwbW3tqN39pFsqN335zZPhpLl+M8GlaVr/y8UErxfJvnGdJ4iNFnVSReLVviHhYGlxLocTqI+Mx4omu3c+zc94uxwYkSSxJAKfD+tvex2q3cEXYHDSo0MDqckqH1UBixGPyq4nZiE69EfcFotxDs2s5/Tv3I1J5ZZLqZqJx8gbCkOPwzkskMzuaLAVbuqVuN3e5mqvhUYVrvaWViKQ2lVG4v4I5oDwDWeVoABUdWyUNhIk9Ka210DPkKDw/X27ZtMzoMQ209s5VHlj6Cl9mLhf0XUsWnitEhlSzJZ2HVG7D7Z7Bl8YeHO59WCGSTlyc+6ZrAVDDbwGSH4yFgNykAetXqxasdXiXAI8DgE3Ce7AsXOBTRHW23M2qMIrRWM2aevQQnf4f7voGm9xgdonARpdR2rXV4QeWkB1CC2ew2pmyZAsCjzR6Vxj8vfiFw93/h2T3Q+TlaWoL4/Mw5psWdpZMtjUBfK6lBJk5WNkNGKJln+rJ84HLej3i/TDX+8NcCccpuJzLaRPTFaC7U7+HYKcNAIg/ySsYSbM6hORyMP0g1n2o83LQUvuzdlfyqwG2vOX5sVia9O5+sU+c5pkNIxzO3WPVArzKdSAMH3EvKipX0jjYzr10WGwKCuRvg4FKwZjheuiNEDukBlFCJmYl8svMTAMaGj8XTLP/jFpqbhRF9OnLMHHZV4+9lcWNc7zK8dhJ/LRAXdDadhrGwLmE/hDR3vGAnZo3R4YkSRhJACfXu1ndJyEwgPCScnrV6Gh1OqdO/VXXeHtCc6oFeKBxX/m8PaE7/VtWNDq1YXblAXPdddjae3kh2ozsdO2UYSPyNDAGVQGtPrWXhkYV4uHnwrw7/QilldEilUv9W1ct8g5+XgHsGcPGLL+m0H75JTmJXywa0AceyELZscJP/7YWD9ABKmKSsJF7f9DrgeOK3dkBtYwMSpY5HmGOBOI8sTYf9mg3psRBUF9IuygvjxVUkAZQwU7dO5VzaOVpUasFDjR8yOhxRSl1+aXz3XXY2nN7gWEYDZHE4cRVJACXIqhOrmHd4Hu4mdyZ1mlTi3kMrSg//Pr1R3t40ioWEg9FcDMtZ42j/b1CCn/0RriUJoIQ4kXSCCesdb7t6uvXThAWEGRyRKM1MPj745ywQ1323nU1kgHdFSDgO5/YaHJ0oKSQBlADp2ek8F/UcKdYUetTswbAmw4wOSZQBl5eG6LZHs/HkBmjYx7FjvwwDCQdJAAbTWvPGpjc4GH+Q2v61mdRpksz6EU7h1bIlqlYogamQvHYN9gaOHgEHfjM2MFFiSAIw2LToafx69Fe8zF78O+Lf+Ln7GR2SKCOUUlS8fzAAbbclsa9CVTB7wemdkHTa4OhESSAJwECzDs7i39v/DcAbnd6gXoV6BkckyprAu+/GblK0PqzZcnAt1I107JDZQAJJAIZZErOESZsmATDh1gn0qd3H4IhEWWSuWJHMW5vhpiF94WJodIdjh9wHEEgCMMTy48sZv248Gs3TrZ5mcKPBRockyrDQB4YD0GDjKZJqd3K8KjJmLWQkGRuYMJwkABfSWjM9ejpjo8aSrbMZ0XQEI5uPNDosUcZViuxFip+F6pc0Ozctgxq3gt0Kh1cYHZowmCQAF7m8tv97295Do3mm9TM81+Y5mfEjip0ym4mPbAlAytwF0DBnGEjeFVzuSQJwgdiUWEYuG8mP+3/EYrLwTpd3GNl8pDT+wmVqDHI8W1J9yzFsoRGODw8tBZvVuKCE4SQBFCOtNfMPz+fehfey7ew2gj2D+bzn59wRdofRoYlypmGrSA7XtOCRpTm0Zj0E14eMRDix2ejQhIEkARST6IvRPLb8MSZumEiqNZUeNXsw9+65hFcp8DWdQjidSZk4F9kcgMS5c6Hh5YfCZBioPJOFwZ3saOJRPtv1GYtjHP9j+Vn8eKndS/Sr20+GfIShQvvdT/qPO/DfH0umdys8wPE8QO83QX43yyVJAE5gtVtZfWI1Px34iS1ntgDgbnLnwcYPMrL5yDL38nFROrWvG8H3jU1E7rJzfv1+Qr2CID4GLhyESmX7VZkib5IAblJiZiKbTm9i1clVrD+1nmRrMgBeZi/6hvXlseaPUdW3qsFRCvGXAI8ATnStD7sOkLBgPtXH9kL9OdPRC5AEUC45NQEopb4CmgC/aa0n32yZkuZSxiWOJhzlaOJRoi9G88e5PziaePSqMvUr1Gdg/YHcVfcuWc9HlFh1OvXm1I8HCL2YTEpKHfzAcR+g83NGhyYM4LQEoJQaALhprTsopb5WStXXWh+60TLOorXGru3YtI1sezZWuxWr3Uq2PZuM7AwybZlk2DJIs6aRak0lxZpCYmYiCZkJxGfEcy7tHGfSznAm9QzJWcnXHN/d5E6LSi2IqBFB9xrdqelfszhOQwin6hzahR9b/Iehq+0kbI7Br7o7nNwCKefBt5LR4QkXc2YPIAL4OWd7GdAZ+HvjXpgyRfb1n1/nLrLmDD4WH8ICwggLCKNBhQa0rNySxkGNsbhZnFaHEK7QJLgJu8ODsEVdIGXderKf6oj5TBQcXAKthxodXqmVnp3OubRznE87T0JmAgmZCSRmJuZeXKZZ08iwZZCZnUmmLZMse5bjotRmJVtnY7c7LlZt2oZd27FrO4Eegfx8188FV14EzkwAPkBszvYloPXNlFFKjQJGAdSseXNX1aac2a0mZcJNueGm3LCYLFjcLJiVGQ+zBx5uHni6eeJj8cn9CfAIoIJnBQI9AqnoVZGqPlWp4lOFQI9AmcEjygSTMtG8QWd21FtA20N2Es9UIRgcw0CSAK5La01cahx7L+7lYPxBjiUd43jScU4mn8xzlKCoMm2ZTj/m3zkzAaQAXjnbvuT9jEGBZbTWnwOfA4SHh9/Uy0uHNR3Gw00flkZbiDx0De3KT7cspO0hTcLmYwTdCurIKrCmg8Wr4AOUE1prTiSfYNPpTWw6vYmd53YSnxmfZ1mLyUJl78pU9q5MoEcggR6BBHgE4Gvxzb3A9DR75l54WtwsjotSkwWzyYybcsNkMmFWZpRSuReuxc2ZCWA7jiGdzcAtwIGbLFNkJiXPtwmRn47VOjKhnpl4nywqHDtB+q1N8c6OhqNRfz0gVo4dSzzG4pjFLIpZxLGkY1ftC/AIoGlwUxoFNaJOQB1q+9emhl8NgjyDSuUFpzMTwHxgnVKqGnA7MFgpNVlr/cp1yrR3Yv1CiEII8AigZdU2rG2+mbs3axJOVcS7Bo7poOU0AdjsNlaeWMn0vdPZdX5X7ueBHoG0r9qe9lXb065qO0J9Q0tlQ58fpyUArXWSUioC6Am8q7U+A+wqoEyis+oXQhRet9Bu/NBiC3dvtpG84yT2KgrTgSVgt4Op/PSgrXYr8w7NY9qf0ziVcgpwTPq4reZt3BF2B+2qtMNsKruPSzn1zLTW8fw1y+emywghilfX0K5MDZ7KoRpm6p/MIOlCdQItpyB2O9Roa3R4xU5rzbrYdUzdNpWYxBgAQn1DGdZ0GHfXvRtvi7fBEbpG2U1tQoh81favTU2/mixvcYz6JyHhRCCBVU/Bgd/KfAKIS4nj9U2vs+H0BgBq+tXk6dZPc1vN23AzFf+N15Kk/PT1hBC5lFJ0De3KpkaKbE8L6TGXyExyK9Org2qtWXhkIQMWDmDD6Q34u/vzYtsXmX/3fHrX7l3uGn+QBCBEudWtRjcy3RU7mzuGOxJPVIDz++HiEYMjc76UrBTGrhnLhPUTSLGm0L1Gdxb2X8jQJkPL9QOdkgCEKKfaVG6Dr8WXBY1SAEg45oO245gNVIacTD7JQ4seYvnx5fhYfJjUaRIfdf+IYK9go0MznCQAIcopi5uFjtU6crA6ZFQPxpZiJSXOA/b/ZnRoTrMlbgsP/PYARxKPEBYQxs99f6Z/vf5laipnUUgCEKIc616zOyjF5jY+ACTE+DpeE5lyzuDIim7psaU8vvxxEjMT6VK9Cz/c8YMs2vg3kgCEKMe6hXbDbDIzo3YcuLmREutBdroq9cNAvxz5hRfXvki2zuahxg/xSeQn+Lr7Gh1WiSMJQIhyzM/djw5VOxDvo0kKrw8aEo95wb5fjQ7tps0+OJsJ6ydg13b+ccs/eLHti6Vqho8tJZXEX34lfsaMYq9LngMQopzrWasn62LXsbqFibt/h4QYH4KOrkFlJIGnv9Hh3ZD5h+fz+qbXAXi29bM82vxRgyMqHFtKKimrV5O0ZAmp69ahs7JwCwwkcOBAlKX4ZilJAhCinOteoztuyo1ZwUe4p2IwWRcukn5O4314OTS71+jwCi3qZBSvbXwNgHHh4xjWdJixARUgt9FfuoTUtY5GHwCl8Apvg3/vPmibTRKAEKL4BHoG0rZKWzbHbeZ8t6YEz1lLwlFvvPf9WmoSwM5zO3lhzQvYtI3Hmj9WYhv/wjT6fr16YQmp7JJ4JAEIIehZqyeb4zazpEkWQ+ZA8gkv7HuXY8rOBLOH0eFd19GEo4xZOYZMWyb31r+Xp1o9ZXRIV7luo9+mDf69e+PXu7fLGv0rSQIQQhBZM5LJmyezyL6LEa1uIWvnLpKOZBN4dA006GV0ePlKzEzkyVVPkpyVTGSNSF5p/0qJmONfYKPfx7VX+vmRBCCEoKJXRVpVbsWOczuI7daQSjt3kXDUm8B9C0tsArDarYxdM5aTySdpHNSYKV2nGLp0c+Ea/Z5YQkIMi/HvJAEIIQDoVbsXO87tYG6NM4z28iT9AmT+vgiPvtngVvKaiqlbp/J73O8EewbzceTHeJld/zrL0tjoX6nk/VcVQhji9jq3M3XrVKIu/s4zvW4jY8FvJO7LovKxdVC3u9HhXWXeoXn8uP9HLCYLH3b/kCo+VVxWd2kZ3ikMSQBCCACCPIPoHNqZqJNR7GhXgSYLICHGm0p75qFKUALYf2k/b/7+JgAT20+kZeWWxV6nLSWVlKgokpYsLvWN/pUkAQghct1d926iTkbxo3k779aoRtbJ06SsWIRfv39DCXiaNjkrmeejns+d8XNP/XuKra4CG/3evfHr3avEDu8UhiQAIUSurqFdCfAI4GDCIbLuegA+/Y6Efdn4Hd8AdboaGpvWmokbJnIy+SSNghrxcruXnV5HWRreKQxJAEKIXO5u7txe+3ZmHpjJssZZ9DIpUk57kr35Z8wGJ4Dv933PyhMr8bP48UG3D/A0ezrluGV1eKcwJAEIIa5yd727mXlgJnMvreaeW1uRumkHiYuXEzzIZtgwUPSFaD7Y/gEAkzpPooZ/jSIdrzwM7xSGJAAhxFWaBjclLCCMo4lHie0zgMBNO0jYbyPo+CZUnc4ujyc5K5kX1rxAtj2bBxs9SI+aPW7qOJcb/eSlS0hZs7ZcXennRxKAEOIqSin61e3Hhzs+ZEaFAzzp50FWEqQv/gbvf7g2AWiteWPTG5xKOUXjoMaMDR97Q9+/qtFfuw6dmenYUY4b/StJAhBCXOOe+vfw6R+fsjpuHU/17Axzo0hYsg7vx137UNicQ3NYcmwJ3mZv3uv2Hu5u7gV+R4Z3Ck8SgBDiGkGeQdxV9y7mHJrDonAfes2F5KNg37cMU7M7XBLDwfiDTNkyBYCJHSZSy79WvmWl0b85kgCEEHka2mQocw7N4fu0NdwZVhHr0QskzfyCwMnFnwDSrGmMWzOOTFsm/ev1p29Y32vKXNXor1t/7fCONPoFkgQghMhT3cC6dK7emfWx69kb0YL6Ry+QsPZPAq3pYCnedXembJnC0cSjhAWEMb7d+NzPC2z0y/mY/o2SBCCEyNewJsNYH7ueT6se5kOLIv2cmcw1P+Bx28hiq/OXI78w7/A8PNw8mNptKh6ZmsSlv117Ixek0S8iSQBCiHy1r9qe+hXqcyj+EAmtqxLw+2kSZ35P5WJKAIfiDzFp8yQ8MzVvqtvxnPgRh2R4p9hIAhBC5EspxbAmw5i4YSLftsjm6d8hYVsclZIvoPwqOrWuxPgzfPvhSMbsTKF1jMJsnU2KIwhp9IuJJAAhxHX1DevLt9Hfsl4fYmSQG96XIOWnj/Eb+UaRj/3XmP4SEtasYojVnrNHS6PvApIAhBDXZTaZGdd2HI8vf5xfWsKgVRA/57ebTgD53cg1AQdrmGl2/2PU7DdIGn0XkAQghChQx2odiQiNYFnaagas06TGpJGydB6+vQu3HPP15ulnNK3DjKrH2dxI8Xq/j6lbs+S8e6CskwQghCiUF9q+QP/T65nVSfNglJ1z77yLT4+7UOa8m5F8l2GA3OGdY62rMHLnS1jtJsa2GUt3afxdqsAEoJRacZ1yp7TWDzk3JCFESVTLvxYPNX6IH7KmcfsOTYXTCSTMmk2FBwbnlilMo395TP9o4lGeWjQUq93K4IaDebjpw0acVrlWmB7AFK31irx2KKX65/z5FdAE+E1rPTmfsmbgaM4PwFNa6z03HrIQwiiPt3ic1SdWMS3yGM/Pt3Nkyjv8a687z4ek0vDAlmsb/datHfP0/3Yj93D8YR5f/jhJWUlE1Ijg5XYvo5Qy4pTKtSIPASmlBgBuWusOSqmvlVL1tdaH8ijaApihtX6pqHUKIYzh6+7L3VUn8ln9x9kXmkXjUxlMnTUBgOScMgXN3vnj3B+MWTmGpKwkwkPCeafLO7iVgNdNlkcmJxwjAvg5Z3sZkN96se2BvkqpLUqpr3J6BEKIUuabNWmY4/rzXQ8T2TktyJ/BdZjRbiD11kRR+4fvCRo2NM/Gf83JNYxaPoqkrCS61+jOZz0/w9vi7eIzEJc5oxH2AWJzti8BrfMptxW4TWsdp5SaDtwBLPx7IaXUKGAUQM2aNZ0QnhDCmU4npKNpx50Vf+W5UZlkmeFsdlWyzrbijXymbl5Iv8DUbVP57ehvgOPl8691fA2zSa4DjeSMf/0U4PLKUL7k36vYrbW+PDi4DaifVyGt9efA5wDh4eHaCfEJIZyoWqAXsQnpXLp0G0Mr/sCHvhVwV1vw8DvC4hgvWlRqQTWfamTrbPZd3MfmuM18E/0NyVnJeLh5MPqW0Tza7FEZ8y8BnJEAtuMY9tkM3AIcyKfcd0qpN4E/gf7AW06oWwjhYuN6N2T83D0ssd7Ka4nf0TE9jgcqNSPT4yIvrn0RgECPQDJtmaRnp+d+r1O1Tky4dUKR3+crnMcZCWA+sE4pVQ24HWivlGoCPKi1fuWKcm8APwIKWJjfzCIhRMnWv1V1AN5beoDZKd0YaV3ETLcarG8znM1xm9l7cS/xmfEA1PavTZuQNkTUiKBbaDe56i9hlNbXH2VRSs0CKuWz+w+t9bNKqQpAT2Ct1vqMs4ILDw/X27Ztc9bhhBDOdvEIfNIazJ7w/D7wDkJrzdm0s5hNZip6OXfBOFE4SqntWuvwgsoV2APQWt9XiDLx/DUTSAhRXgTXhXq3weEVsPM76PQMSimq+FQxOjJRCM6YBiqEKM/aPub4c+tXYLcZG4u4IZIAhBBFU78nBNaEhOOOnoAoNSQBCCGKxuQG4Y86trd8bmws4oZIAhBCFF3rYWD2cvQAzu41OhpRSJIAhBBF5x0ErYc6tjd8ZGwsotAkAQghnKPDk6Dc4M/ZkHDS6GhEIUgCEEI4R4Va0GwA2LNh03+NjkYUgiQAIYTzdHrW8eeObyHtkrGxiAJJAhBCOE+VZlCvJ1jTZEZQKSAJQAjhXJ2fc/z5+2eQkWRsLOK6JAEIIZyrVkeo2RHS4+VeQAknCUAI4VxKQY9XHdub/gOpF4yNR+RLEoAQwvlqdYD6vSArBdZ9YHQ0Ih+SAIQQxSNyouPPrV9C4iljYxF5kgQghCgeVVtA0wFgy4Q17xgdjciDJAAhRPGJfMXxdPDO7+HMn0ZHI/5GEoAQovgE14W2I0HbYdELUMAbCIVrSQIQQhSv7v8En0pwYhPs/snoaMQVJAEIIYqXVyD0fMOxvWwiZCQaG4/IJQlACFH8WgyGGu0h9RysftvoaEQOSQBCiOJnMsGdU0GZYMv/4NR2oyMSSAIQQrhKlebQ/h+OG8LzRkFWmtERlXuSAIQQrhM5ESo1gouHYcVrRkdT7kkCEEK4jsUT7vkfmMyOoaAjq42OqFyTBCCEcK1qLaHby47tBWPkxTEGkgQghHC9zs9BaFtIioXZj4At2+iIyiVJAEII13Mzw33fgHdFOLoaVr1hdETlkiQAIYQxAkIdSUC5wYaP4M+5RkdU7kgCEEIYp04X6P2WY3vBGIjdYWw85YwkACGEsW59HG55wPEi+R8GwvmDRkdUbkgCEEIYSym462OodxukXYTv+kPCSaOjKhckAQghjGd2h/u/c6wXlBTrSALJZ42OqsyTBCCEKBncveHBnyCkmeNJ4Wl9IP640VGVaZIAhBAlh1cgDJ0PVVrApaPwdW84t9/oqMosc2EKKaVWXKfsKa31Q84LSQhRrvlWguG/wowH4PgGR09g8I9Qq6PRkZU5he0BTNFaR+T1A8wGUEqFKKXWXe8gSimLUuoXpdQGpdQjRYxdCFFWeQbAQ3Ogwe2QHg/f3gWbP5NXSjqZU4aAlFIVgG8BnwKKPgVs11p3AgYqpfycUb8QogyyeMGg76HjU2DPhiUvwbzRsoy0ExVqCKgQbMAgYEEB5SKAnFWgWAuEA1ctB6iUGgWMyvlrilLqQBHiqghcKML3Xak0xQqlK16Jtfi4ON7Pc35uSnn6t61VmEJOSQBa6yQApVRBRX2A2JztS0BIHscq0n/hKymltmmtw51xrOJWmmKF0hWvxFp8SlO8pSlWcE28rp4FlAJ45Wz7GlC/EEKIHK5ugLcDnXO2bwGOubh+IYQQOZx1D+AaSqlIoInW+j9XfPwtsEgp1QVoAvxeXPXncMpQkouUplihdMUrsRaf0hRvaYoVXBCv0oWYVqWUmgVUymf3H1rrZwtdoVLVcPQClmqtEwv7PSGEEM5VqAQghBClmVIqCGgD7NRal6aZQMVKbsIKUYIU5oHKkkApFaCUWqyUWqaUmqeUcjc6pvzkPKf0K9AOWK2Uym80o0TJ+V3YWZx1FNs9AFcpzDIVJSn7l6ZlNUpTrPlRSn2F437Tb1rryUbHcz038EBlSTAE+EBrvVwp9X9AH2ChwTHlpwXwvNZ6c86/cWtgqcExFcZU/po1WSxKfQLAsUzFirx2KKX6X5H9fwM+UEpFaq3PuzTCqxUUbwAwE3ADUoFBWussVwZ4hevGmvNnCDBba93FpZEVglJqAOCmte6glPpaKVVfawoXJ6oAAAHpSURBVH3I6Liuo7APVBpOa/3pFX+tBJwzKpaCaK3XACiluuLoBZT4FxDnTKJJBc4UZz3lYQjocvZ/E0fWb/3/7d29LgRRGMbx/3sH3ImSRkgQGq2Khs4FIOIqJCSiUtKoaXwUlOImlESreBRzNqtglmWcOTvPr9qpzpPszr7vnJlzJnOeQXqd1QLVl7+YOc+XCuhYZ4DT9PmC/iPIrSTptbQHIyJiChiXdJ87S52oVqmuAM/AW+Y4tdJ02h79XRMaM/IFQNJ1uvTrVf+73JnqSDqQdJkOW91Z0e9YX3MH+cLAlec2vDS1ug+0fmNHVTaBR2A5d54BtoEDSS9NDzTyBQDKqv49JXRWBXSsXnnekNSlngE7klr91paI2IqItXQ4BjT+x/pLc8BmRFwBExFx3NRAnTghCqv+RXVWLeeV581Zp5pO3Y2Iq4hYyR2oxhGwGhE3VPfWLjLnqSVp+sN2+w+SNpoaaxRuAteKiC3gSdIJBVT/kjqrApwDt2nx4RIwmTnPt6QTv9UkHQKHuXN8h6RnYD53jmE0/VvowhVAUdWfsjqrVku71M4A98Bsy6erzP5d8SuB/3Kbiv9QUt6SsprZzxVfAMzMbDhdmAIyM7NPuACYmXWUC4CZWUe5AJiZdZQLgJlZR70D6KJIbLEtEGQAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#%fig=一维RBF插值\n", "from scipy.interpolate import Rbf\n", "\n", "x1 = np.array([-1, 0, 2.0, 1.0])\n", "y1 = np.array([1.0, 0.3, -0.5, 0.8])\n", "\n", "funcs = ['multiquadric', 'gaussian', 'linear']\n", "nx = np.linspace(-3, 4, 100)\n", "rbfs = [Rbf(x1, y1, function=fname) for fname in funcs] #❶\n", "rbf_ys = [rbf(nx) for rbf in rbfs] #❷\n", "#%hide\n", "pl.plot(x1, y1, \"o\")\n", "for fname, ny in zip(funcs, rbf_ys):\n", " pl.plot(nx, ny, label=fname, lw=2)\n", "\n", "pl.ylim(-1.0, 1.5)\n", "pl.legend()" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "group_control": { "group": 0 } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "multiquadric [-0.88822885 2.17654513 1.42877511 -2.67919021]\n", "gaussian [ 1.00321945 -0.02345964 -0.65441716 0.91375159]\n", "linear [-0.26666667 0.6 0.73333333 -0.9 ]\n" ] } ], "source": [ "for fname, rbf in zip(funcs, rbfs):\n", " print (fname, rbf.nodes)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "group_control": { "group": 0 } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#%fig=二维径向基函数插值\n", "rbfs = [Rbf(x, y, z, function=fname) for fname in funcs]\n", "rbf_zg = [rbf(xg, yg).reshape(xg.shape) for rbf in rbfs]\n", "#%hide\n", "fig, axes = pl.subplots(1, 3, figsize=(11.5, 3.5))\n", "for ax, fname, zg in zip(axes, funcs, rbf_zg):\n", " ax.imshow(\n", " zg,\n", " extent=[-1, 1, -1, 1],\n", " cmap=pl.cm.jet,\n", " interpolation='nearest',\n", " origin=\"lower\")\n", " ax.set_xlabel(fname)\n", " ax.scatter(x, y, c=z)" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "group_control": { "group": 0 } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#%fig=`epsilon`参数指定径向基函数中数据点的作用范围\n", "epsilons = 0.1, 0.15, 0.3\n", "rbfs = [Rbf(x, y, z, function=\"gaussian\", epsilon=eps) for eps in epsilons]\n", "zgs = [rbf(xg, yg).reshape(xg.shape) for rbf in rbfs]\n", "#%hide\n", "fig, axes = pl.subplots(1, 3, figsize=(11.5, 3.5))\n", "for ax, eps, zg in zip(axes, epsilons, zgs):\n", " ax.imshow(\n", " zg,\n", " extent=[-1, 1, -1, 1],\n", " cmap=pl.cm.jet,\n", " interpolation='nearest',\n", " origin=\"lower\")\n", " ax.set_xlabel(\"eps=%g\" % eps)\n", " ax.scatter(x, y, c=z)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.4" } }, "nbformat": 4, "nbformat_minor": 1 } ================================================ FILE: 4.scipy/8.scipy-sparse.ipynb ================================================ { "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "%matplotlib inline\n", "import numpy as np\n", "import pylab as pl\n", "from scipy import sparse\n", "from scipy.sparse import csgraph" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 稀疏矩阵-sparse" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 稀疏矩阵的储存形式" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "dict_keys([(2, 3), (3, 3), (4, 3)])\n", "dict_values([1.0, 2.0, 3.0])\n" ] } ], "source": [ "from scipy import sparse\n", "a = sparse.dok_matrix((10, 5))\n", "\n", "a[2, 3] = 1.0\n", "a[3, 3] = 2.0\n", "a[4, 3] = 3.0\n", "print(a.keys())\n", "print(a.values())" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[list([]) list([]) list([1.0]) list([3.0, 2.0]) list([]) list([]) list([])\n", " list([]) list([]) list([])]\n", "[list([]) list([]) list([3]) list([2, 4]) list([]) list([]) list([])\n", " list([]) list([]) list([])]\n" ] } ], "source": [ "b = sparse.lil_matrix((10, 5))\n", "b[2, 3] = 1.0\n", "b[3, 4] = 2.0\n", "b[3, 2] = 3.0\n", "print(b.data)\n", "print(b.rows)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[3 4 2 3] [2 3 3 2] [ 1 2 3 10]\n", "[[ 0 0 0 0 0 0]\n", " [ 0 0 0 0 0 0]\n", " [ 0 0 0 11 0 0]\n", " [ 0 0 3 0 2 0]\n", " [ 0 0 0 0 0 0]]\n" ] } ], "source": [ "row = [2, 3, 3, 2]\n", "col = [3, 4, 2, 3]\n", "data = [1, 2, 3, 10]\n", "c = sparse.coo_matrix((data, (row, col)), shape=(5, 6))\n", "print (c.col, c.row, c.data)\n", "print (c.toarray())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 矩阵向量相乘" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 1, -3, -1], dtype=int32)" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ " import numpy as np\n", "from scipy.sparse import csr_matrix\n", "A = csr_matrix([[1, 2, 0], [0, 0, 3], [4, 0, 5]])\n", "v = np.array([1, 0, -1])\n", "A.dot(v)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 示例1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "构造一个1000x1000 lil_matrix并添加值:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "from scipy.sparse import lil_matrix\n", "from scipy.sparse.linalg import spsolve\n", "from numpy.linalg import solve, norm\n", "from numpy.random import rand" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "A = lil_matrix((1000, 1000))\n", "A[0, :100] = rand(100)\n", "A[1, 100:200] = A[0, :100]\n", "A.setdiag(rand(1000))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "现在将其转换为CSR格式,并求解$A x = b$的$x$:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "A = A.tocsr()\n", "b = rand(1000)\n", "x = spsolve(A, b)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "将其转换为密集矩阵并求解,并检查结果是否相同:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "x_ = solve(A.toarray(), b)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "现在我们可以使用以下公式计算错误的范数:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "err = norm(x-x_)\n", "err < 1e-10" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 示例2\n", "构造COO格式的矩阵:" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "from scipy import sparse\n", "from numpy import array\n", "I = array([0,3,1,0])\n", "J = array([0,3,1,2])\n", "V = array([4,5,7,9])\n", "A = sparse.coo_matrix((V,(I,J)),shape=(4,4))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "注意,索引不需要排序。\n", "\n", "转换为CSR或CSC时,将对重复的(i,j)条目进行求和。" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "I = array([0,0,1,3,1,0,0])\n", "J = array([0,2,1,3,1,0,0])\n", "V = array([1,1,1,1,1,1,1])\n", "B = sparse.coo_matrix((V,(I,J)),shape=(4,4)).tocsr()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "这对于构造有限元刚度矩阵和质量矩阵是有用的。" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.3" } }, "nbformat": 4, "nbformat_minor": 1 } ================================================ FILE: 4.scipy/9.scipy-ndimage.ipynb ================================================ { "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import pylab as pl" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 图像处理-ndimage" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 形态学图像处理" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "\n", "def expand_image(img, value, out=None, size = 10):\n", " if out is None:\n", " w, h = img.shape\n", " out = np.zeros((w*size, h*size),dtype=np.uint8)\n", " \n", " tmp = np.repeat(np.repeat(img,size,0),size,1)\n", " out[:,:] = np.where(tmp, value, out)\n", " out[::size,:] = 0\n", " out[:,::size] = 0\n", " return out\n", " \n", "def show_image(*imgs): \n", " for idx, img in enumerate(imgs, 1):\n", " ax = pl.subplot(1, len(imgs), idx)\n", " pl.imshow(img, cmap=\"gray\") \n", " ax.set_axis_off() \n", " pl.subplots_adjust(0.02, 0, 0.98, 1, 0.02, 0) " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### 膨胀和腐蚀" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAdEAAACrCAYAAAA5DaaIAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAABJ5JREFUeJzt3cGO1EYARVE74mfhg/hds4haYRFw+eJxVzHnbLGEmZR0p1uql/04jg0AuO6fd78AAKxKRAEgElEAiEQUACIRBYBIRAEgElEAiEQUACIRBYDoy7tfYNu2bd93s0n81nEc+7Y5K5x7nZVtc1449/N5KXwSBYBIRAEgElEAiEQUACIRBYBIRAEgElEAiEQUACIRBYBIRAEgElEAiEQUACIRBYBIRAEgElEAiEQUACIRBYBIRAEg+vLuFwD+8/3799/++bdv3257hrk9eRacqc4nUQCIRBQAIhEFgEhEASASUQCIRBQAIhEFgGg/juPd77Dt+/7+l2Bqx3Hs2+ascO51VrbNeeHcz+elMLbwgLNfVPZ9v+0Z5jVyWf3Js+Ly/NyclzX4OhcAIhEFgEhEASASUQCIRBQAIhEFgEhEASASUQCIjC0APOhstGDbPu9wwYp8EgWASEQBIBJRAIhEFAAiEQWASEQBIBJRAIhEFACi/ez/aP7IS+z7+1+CqR3HsW+bs8K511nZNueFcz+fl8Ji0R86+yVk3/dHn+F5ows0s52Vs/e2mvMx/ubz8hnPlK9zASASUQCIRBQAIhEFgEhEASASUQCIRBQAImMLLMHYAqOMLXCFsYU3e3IkwSDDnJ6+PD9yod0gw7ycl7+Lr3MBIBJRAIhEFAAiEQWASEQBIBJRAIhEFAAiYwsswdgCo4wtcIWxhTd7ctzA2MKc7rw8P3JZ3eX5eY2chRHOyzp8nQsAkYgCQCSiABCJKABEIgoAkYgCQCSiABAZW2AJxhYYZWyBK4wtfJCRXy6eHjcwtvC8kcvzX79+PX3mzsvqLs/Py3n58/d5PbcKX+cCQCSiABCJKABEIgoAkYgCQCSiABCJKABExhZYgrEFRhlb4ApjCx9kxrGFEQYZ7rXq5fmZLti//r7V3TUk4Lz8XefF17kAEIkoAEQiCgCRiAJAJKIAEIkoAEQiCgCRsQWWYGyBUcYWuMLYQnDXLw6jl4tXfOYzuOOC+agZ/xu7PH+N8/LseRn5ec/A17kAEIkoAEQiCgCRiAJAJKIAEIkoAEQiCgCRsQWWYGyBUcYWuMLYQvD0hegnPXVp+vXcyma8PD/yTnc98/RZWeXy/K84L87L//F1LgBEIgoAkYgCQCSiABCJKABEIgoAkYgCQCSiABBZLGIJFosYZbGIKywWBXeuiqzIYtG/nl6gmW2B5amVmtdzs/37r5rxvNz1M51p1ej13Crnxde5ABCJKABEIgoAkYgCQCSiABCJKABEIgoAkbEFlmBsgVHGFrjC2AJ8oLML36NmuRh+1R2X8F/Pre6un8WIO4cU7nLXIMPoeZnt3/8rvs4FgEhEASASUQCIRBQAIhEFgEhEASASUQCIjC2wBGMLjDK2wBV/OrbgkygARCIKAJGIAkAkogAQiSgARCIKAJGIAkAkogAQTTG2AAAr8kkUACIRBYBIRAEgElEAiEQUACIRBYBIRAEgElEAiEQUACIRBYBIRAEgElEAiEQUACIRBYBIRAEgElEAiEQUACIRBYBIRAEgElEAiEQUACIRBYBIRAEg+gFgXP5bp9QgQAAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#%fig=四连通和八连通的膨胀运算\n", "from scipy.ndimage import morphology\n", "\n", "def dilation_demo(a, structure=None):\n", " b = morphology.binary_dilation(a, structure)\n", " img = expand_image(a, 255)\n", " return expand_image(np.logical_xor(a,b), 150, out=img)\n", "\n", "a = pl.imread(\"scipy_morphology_demo.png\")[:,:,0].astype(np.uint8)\n", "img1 = expand_image(a, 255)\n", "\n", "img2 = dilation_demo(a)\n", "img3 = dilation_demo(a, [[1,1,1],[1,1,1],[1,1,1]])\n", "show_image(img1, img2, img3)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAdEAAACrCAYAAAA5DaaIAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAABHBJREFUeJzt3dFq21gYRlGp9GWTB8rrai6KaQid6mhHkXWatW7HME77w44F/rpu27YAAMf9ePYbAIBZiSgARCIKAJGIAkAkogAQiSgARCIKAJGIAkAkogAQ/Xz2G1iWZVnX1WwSf7Vt27osboV9j1tZFvfCvvf3UvgkCgCRiAJAJKIAEIkoAEQiCgCRiAJAJKIAEIkoAEQiCgCRiAJAJKIAEIkoAEQiCgCRiAJAJKIAEIkoAEQiCgCRiAJA9PPZbwD47e3t7a///fX19bTXMD/38nw+iQJAJKIAEIkoAEQiCgCRiAJAJKIAEIkoAETrtm3Pfg/Luq7PfxPc2rZt67K4FfY9bmVZ3Av73t9LYWzhk0a+pLz3i8q6rqe9xpem53blrTA/9/J8HucCQCSiABCJKABEIgoAkYgCQCSiABCJKABEIgoAkbEFuIghDI5wL3PwSRQAIhEFgEhEASASUQCIRBQAIhEFgEhEASASUQCI1r1/0fySN7Guz38T3Nq2beuyuBX2PW5lWdwL+97fS2Gx6H/srYUsy6/FkL1fQtZ1vfQ1Vk7uy61whHuZg8e5ABCJKABEIgoAkYgCQCSiABCJKABEIgoAkbEFpmBsgVHGFjjC2MIXuXpsYeSLzL40PbcZb4XnufLv0L10HucCQCSiABCJKABEIgoAkYgCQCSiABCJKABExhaYgrEFRhlb4AhjC1/kzLGFkS/HG1uY19W3MsKX5+/rzHs5i3vpPM4FgEhEASASUQCIRBQAIhEFgEhEASASUQCIjC0wBWMLjDK2wBHGFoKRLzu/vLzsvubMcQNjC/Ma+UX06i+ru5X7ci//Fo9zASASUQCIRBQAIhEFgEhEASASUQCIRBQAImMLTMHYAqOMLXCEsYXgjmMLI+40yPD4//3r7ngrdxvv4Df38v3uxeNcAIhEFAAiEQWASEQBIBJRAIhEFAAiEQWAyNgCUzC2wChjCxxhbOGDM740PGr0y8UzvsbYwi9uxa0c4V6+3714nAsAkYgCQCSiABCJKABEIgoAkYgCQCSiABAZW2AKxhYYZWyBI4wtfHDHsYWR9zTiyn99fuTP6Myf7a7ueCtnvebqW/kOrr6XK7mXP/M4FwAiEQWASEQBIBJRAIhEFAAiEQWASEQBIBJRAIgsFjEFi0WMsljEERaLPrh6sehuiz1XLdU8Xne3n/9sbuX7LdB8xpn3MqPveC8e5wJAJKIAEIkoAEQiCgCRiAJAJKIAEIkoAETGFpiCsQVGGVvgCGML8IX2BglGzTo6MTLIMPJnNOvPD3s8zgWASEQBIBJRAIhEFAAiEQWASEQBIBJRAIiMLTAFYwuMMrbAEZ8dW/BJFAAiEQWASEQBIBJRAIhEFAAiEQWASEQBIBJRAIhuMbYAADPySRQAIhEFgEhEASASUQCIRBQAIhEFgEhEASASUQCIRBQAIhEFgEhEASASUQCIRBQAIhEFgEhEASASUQCIRBQAIhEFgEhEASASUQCIRBQAIhEFgEhEASD6D6CytlvaYSyFAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#%fig=不同结构元素的膨胀效果\n", "img4 = dilation_demo(a, [[0,0,0],[1,1,1],[0,0,0]])\n", "img5 = dilation_demo(a, [[0,1,0],[0,1,0],[0,1,0]])\n", "img6 = dilation_demo(a, [[0,1,0],[0,1,0],[0,0,0]])\n", "show_image(img4, img5, img6)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAdEAAACrCAYAAAA5DaaIAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAABDRJREFUeJzt3cFu2kAARVG7yqfyV/Cv7qJCzQrGN45hknO2WBEqI12w5Nd127YFANjvz6vfAADMSkQBIBJRAIhEFAAiEQWASEQBIBJRAIhEFAAiEQWA6OPVb2BZlmVdV7NJPLRt27oszgrP3c/KsjgvPPf5vBR+iQJAJKIAEIkoAEQiCgCRiAJAJKIAEIkoAEQiCgCRiAJAJKIAEIkoAEQiCgCRiAJAJKIAEIkoAEQiCgCRiAJAJKIAEIkoAEQiCgCRiAJAJKIAEIkoAEQiCgCRiAJAJKIAEIkoAEQfr34Dv8G2bQ9fX9f1sGuY2+Vyefj67XY77Brm57y8nl+iABCJKABEIgoAkYgCQCSiABCJKABEIgoAkYgCQGRsASZzvV4fvu7BeD5zXr6XX6IAEIkoAEQiCgCRiAJAJKIAEIkoAEQiCgCRiAJAtG7b9ur3sKzr+vo3wVvbtm1dFmeF5+5nZVmcF577fF4Ki0Vf9OxLyLqup17D+7pcLg9fv91uQ5/xyN8ZuYb3dtTn7Lx8L7dzASASUQCIRBQAIhEFgEhEASASUQCIRBQAImMLTMHYAqOMLbCHsYUXO3MkwSDD3M586N0D9vNzXubgdi4ARCIKAJGIAkAkogAQiSgARCIKAJGIAkBkbIEpGFtglLEF9jC28GJnjhsYW5jbmQ+re3h+fs7LHNzOBYBIRAEgElEAiEQUACIRBYBIRAEgElEAiIwtMAVjC4wytsAexha+yciXi7PHDYwtvKdnD6Evy/kPq3t4/n05Lz+L27kAEIkoAEQiCgCRiAJAJKIAEIkoAEQiCgCRsQWmYGyBUcYW2MPYwjd5x7GFEQYZzveOD8+P8ID9azgvP4vbuQAQiSgARCIKAJGIAkAkogAQiSgARCIKAJGxBaZgbIFRxhbYw9hCcNQXh9Hhghmv4Z+RB+Ov1+vTa0b/3Y96oH3kmqPeD/+NnJcRR37O73bNT+N2LgBEIgoAkYgCQCSiABCJKABEIgoAkYgCQGRsgSkYW2CUsQX2MLYQnD22cKazBhnu1/10R44tvNuD6GcNMtz/1m9w9tjCmc4aZLhfNwu3cwEgElEAiEQUACIRBYBIRAEgElEAiEQUACIRBYDIYhFTsFjEKItF7GGxKDhysWhGFovGHblAM6PfuEDzFc7L7zsvbucCQCSiABCJKABEIgoAkYgCQCSiABCJKABExhaYgrEFRhlbYI+vji34JQoAkYgCQCSiABCJKABEIgoAkYgCQCSiABCJKABEIgoAkYgCQCSiABCJKABEIgoAkYgCQCSiABCJKABEIgoA0bpt/uN3ACj8EgWASEQBIBJRAIhEFAAiEQWASEQBIBJRAIhEFAAiEQWASEQBIBJRAIhEFAAiEQWASEQBIBJRAIhEFAAiEQWASEQBIBJRAIhEFAAiEQWASEQBIBJRAIj+AiYQ7pr0+nUhAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#%fig=四连通和八连通的腐蚀运算\n", "def erosion_demo(a, structure=None):\n", " b = morphology.binary_erosion(a, structure)\n", " img = expand_image(a, 255)\n", " return expand_image(np.logical_xor(a,b), 100, out=img)\n", "\n", "img1 = expand_image(a, 255)\n", "img2 = erosion_demo(a)\n", "img3 = erosion_demo(a, [[1,1,1],[1,1,1],[1,1,1]])\n", "show_image(img1, img2, img3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Hit和Miss" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAdEAAACrCAYAAAA5DaaIAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAABEBJREFUeJzt3UFu20gARUFykKPKp5LuylkMjMnCsFrPcottV21NBALSyLMI9M9+HMcGADzun1d/AABYlYgCQCSiABCJKABEIgoAkYgCQCSiABCJKABEIgoA0Z9Xf4Bt27Z9380m8anjOPZtc1a47/2sbJvzwn1/n5fCN1EAiEQUACIRBYBIRAEgElEAiEQUACIRBYBIRAEgElEAiEQUACIRBYBIRAEgElEAiEQUACIRBYBIRAEgElEAiEQUAKI/r/4AAHyf4zg+/fm+75M+yc/kmygARCIKAJGIAkAkogAQiSgARCIKAJGIAkDknijAD+Ye6PcS0QlGLjs/6xnWdrlcPv357XYbOgcjfw7rG/l7ftYzfMzrXACIRBQAIhEFgEhEASASUQCIRBQAIhEFgEhEASAytgAncr1eP/357Xbb3t7eJn0a4B7fRAEgElEAiEQUACIRBYBIRAEgElEAiEQUACIRBYBoP47j1Z9h2/f99R+CUzuOY982Z4X73s/Ktjkv3Pf3eSksFn3RvV9C9n2f+gzndblcPv357Xab+gzn5ryswetcAIhEFAAiEQWASEQBIBJRAIhEFAAiEQWAyNgCSzC2wChjCzzC2MKLzRxJMMiwtpmX3l2wX5/zsgavcwEgElEAiEQUACIRBYBIRAEgElEAiEQUACJjCyzB2AKjjC3wCGMLLzZz3MDYwtpmXlZ3eX59zssavM4FgEhEASASUQCIRBQAIhEFgEhEASASUQCIjC2wBGMLjDK2wCOMLXyTkV8uZo8bGFs4p3uX0Ldt/mV1l+fPy3n5WbzOBYBIRAEgElEAiEQUACIRBYBIRAEgElEAiIwtsARjC4wytsAjjC18kzOOLYwwyDDf6Fk522V1F+xfY/bYwrP+TXBePuZ1LgBEIgoAkYgCQCSiABCJKABEIgoAkYgCQGRsgSUYW2CUsQUeYWwheNYvDqOXlFd8hv+MXIy/Xq93n3nmZfWzPcP/Rs7LiDP+PTsvH/M6FwAiEQWASEQBIBJRAIhEFAAiEQWASEQBIDK2wBKMLTDK2AKPMLYQzB5bmGnWIMP7cz/d7MvzM826YP/+3G/gvPy+8+J1LgBEIgoAkYgCQCSiABCJKABEIgoAkYgCQCSiABBZLGIJFosYZbGIR1gsCp65WLQii0XjnrlAs6LfuEDzFc7L7zsvXucCQCSiABCJKABEIgoAkYgCQCSiABCJKABExhZYgrEFRhlb4BFfHVvwTRQAIhEFgEhEASASUQCIRBQAIhEFgEhEASASUQCIRBQAIhEFgEhEASASUQCIRBQAIhEFgEhEASASUQCIRBQAov04/MfvAFD4JgoAkYgCQCSiABCJKABEIgoAkYgCQCSiABCJKABEIgoAkYgCQCSiABCJKABEIgoAkYgCQCSiABCJKABEIgoAkYgCQCSiABCJKABEIgoAkYgCQCSiABD9C2sQ9SsGW5YQAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#%fig=Hit和Miss运算\n", "def hitmiss_demo(a, structure1, structure2):\n", " b = morphology.binary_hit_or_miss(a, structure1, structure2)\n", " img = expand_image(a, 100)\n", " return expand_image(b, 255, out=img)\n", "\n", "img1 = expand_image(a, 255)\n", "\n", "img2 = hitmiss_demo(a, [[0,0,0],[0,1,0],[1,1,1]], [[1,0,0],[0,0,0],[0,0,0]])\n", "img3 = hitmiss_demo(a, [[0,0,0],[0,0,0],[1,1,1]], [[1,0,0],[0,1,0],[0,0,0]])\n", "\n", "show_image(img1, img2, img3)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#%fig=使用Hit和Miss进行细线化运算\n", "def skeletonize(img):\n", " h1 = np.array([[0, 0, 0],[0, 1, 0],[1, 1, 1]]) #❶\n", " m1 = np.array([[1, 1, 1],[0, 0, 0],[0, 0, 0]]) \n", " h2 = np.array([[0, 0, 0],[1, 1, 0],[0, 1, 0]]) \n", " m2 = np.array([[0, 1, 1],[0, 0, 1],[0, 0, 0]]) \n", " hit_list = [] \n", " miss_list = []\n", " for k in range(4): #❷\n", " hit_list.append(np.rot90(h1, k))\n", " hit_list.append(np.rot90(h2, k))\n", " miss_list.append(np.rot90(m1, k))\n", " miss_list.append(np.rot90(m2, k)) \n", " img = img.copy()\n", " while True:\n", " last = img\n", " for hit, miss in zip(hit_list, miss_list): \n", " hm = morphology.binary_hit_or_miss(img, hit, miss) #❸\n", " # 从图像中删除hit_or_miss所得到的白色点\n", " img = np.logical_and(img, np.logical_not(hm)) #❹\n", " # 如果处理之后的图像和处理前的图像相同,则结束处理\n", " if np.all(img == last): #❺\n", " break\n", " return img\n", "\n", "a = pl.imread(\"scipy_morphology_demo2.png\")[:,:,0].astype(np.uint8)\n", "b = skeletonize(a)\n", "#%hide\n", "_, (ax1, ax2) = pl.subplots(1, 2, figsize=(9, 3))\n", "ax1.imshow(a, cmap=\"gray\", interpolation=\"nearest\")\n", "ax2.imshow(b, cmap=\"gray\", interpolation=\"nearest\")\n", "ax1.set_axis_off()\n", "ax2.set_axis_off()\n", "pl.subplots_adjust(0.02, 0, 0.98, 1, 0.02, 0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 图像分割" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "squares = pl.imread(\"suqares.jpg\")\n", "squares = (squares[:,:,0] < 200).astype(np.uint8) " ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "各种距离值 [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23\n", " 24 25 26 27]\n" ] } ], "source": [ "from scipy.ndimage import morphology\n", "squares_dt = morphology.distance_transform_cdt(squares)\n", "print (\"各种距离值\", np.unique(squares_dt))" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "squares_core = (squares_dt > 8).astype(np.uint8)" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "from scipy.ndimage.measurements import label, center_of_mass\n", "\n", "def random_palette(labels, count, seed=1):\n", " np.random.seed(seed)\n", " palette = np.random.rand(count+1, 3)\n", " palette[0,:] = 0\n", " return palette[labels]\n", "\n", "labels, count = label(squares_core)\n", "h, w = labels.shape\n", "centers = np.array(center_of_mass(labels, labels, index=range(1, count+1)), np.int)\n", "cores = random_palette(labels, count)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "index = morphology.distance_transform_cdt(1-squares_core, \n", " return_distances=False, \n", " return_indices=True) #❶\n", "near_labels = labels[index[0], index[1]] #❷\n", "\n", "mask = (squares - squares_core).astype(bool)\n", "labels2 = labels.copy()\n", "labels2[mask] = near_labels[mask] #❸\n", "separated = random_palette(labels2, count)" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#%figonly=矩形区域分割算法各个步骤的输出图像\n", "fig, axes = pl.subplots(2, 3, figsize=(7.5, 5.0), )\n", "fig.delaxes(axes[1, 2])\n", "axes[0, 0].imshow(squares, cmap=\"gray\");\n", "axes[0, 1].imshow(squares_dt)\n", "axes[0, 2].imshow(squares_core, cmap=\"gray\")\n", "ax = axes[1, 0]\n", "ax.imshow(cores)\n", "center_y, center_x = centers.T\n", "ax.plot(center_x, center_y, \"o\", color=\"white\")\n", "ax.set_xlim(0, w)\n", "ax.set_ylim(h, 0)\n", "\n", "axes[1, 1].imshow(separated)\n", "\n", "for ax in axes.ravel():\n", " ax.axis(\"off\")\n", " \n", "fig.subplots_adjust(wspace=0.01, hspace=0.01)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.4" } }, "nbformat": 4, "nbformat_minor": 1 } ================================================ FILE: 4.scipy/README.md ================================================ ## Scipy简介 Scipy是一个用于数学、科学、工程领域的常用软件包,可以处理插值、积分、优化、图像处理、常微分方程数值解的求解、信号处理等问题。它用于有效计算Numpy矩阵,使Numpy和Scipy协同工作,高效解决问题。 Scipy是由针对特定任务的子模块组成: | 模块名 | 应用领域 | | :---------------- | :----------------- | | scipy.cluster | 向量计算/Kmeans | | scipy.constants | 物理和数学常量 | | scipy.fftpack | 傅立叶变换 | | scipy.integrate | 积分程序 | | scipy.interpolate | 插值 | | scipy.io | 数据输入输出 | | scipy.linalg | 线性代数程序 | | scipy.ndimage | n维图像包 | | scipy.odr | 正交距离回归 | | scipy.optimize | 优化 | | scipy.signal | 信号处理 | | scipy.sparse | 稀疏矩阵 | | scipy.spatial | 空间数据结构和算法 | | scipy.special | 一些特殊的数学函数 | | scipy.stats | 统计 | ================================================ FILE: 5.data-visualization/1.matplotlib/examples/spx.csv ================================================ ,SPX 1990-02-01 00:00:00,328.79 1990-02-02 00:00:00,330.92 1990-02-05 00:00:00,331.85 1990-02-06 00:00:00,329.66 1990-02-07 00:00:00,333.75 1990-02-08 00:00:00,332.96 1990-02-09 00:00:00,333.62 1990-02-12 00:00:00,330.08 1990-02-13 00:00:00,331.02 1990-02-14 00:00:00,332.01 1990-02-15 00:00:00,334.89 1990-02-16 00:00:00,332.72 1990-02-20 00:00:00,327.99 1990-02-21 00:00:00,327.67 1990-02-22 00:00:00,325.7 1990-02-23 00:00:00,324.15 1990-02-26 00:00:00,328.67 1990-02-27 00:00:00,330.26 1990-02-28 00:00:00,331.89 1990-03-01 00:00:00,332.74 1990-03-02 00:00:00,335.54 1990-03-05 00:00:00,333.74 1990-03-06 00:00:00,337.93 1990-03-07 00:00:00,336.95 1990-03-08 00:00:00,340.27 1990-03-09 00:00:00,337.93 1990-03-12 00:00:00,338.67 1990-03-13 00:00:00,336.0 1990-03-14 00:00:00,336.87 1990-03-15 00:00:00,338.07 1990-03-16 00:00:00,341.91 1990-03-19 00:00:00,343.53 1990-03-20 00:00:00,341.57 1990-03-21 00:00:00,339.74 1990-03-22 00:00:00,335.69 1990-03-23 00:00:00,337.22 1990-03-26 00:00:00,337.63 1990-03-27 00:00:00,341.5 1990-03-28 00:00:00,342.0 1990-03-29 00:00:00,340.79 1990-03-30 00:00:00,339.94 1990-04-02 00:00:00,338.7 1990-04-03 00:00:00,343.64 1990-04-04 00:00:00,341.09 1990-04-05 00:00:00,340.73 1990-04-06 00:00:00,340.08 1990-04-09 00:00:00,341.37 1990-04-10 00:00:00,342.07 1990-04-11 00:00:00,341.92 1990-04-12 00:00:00,344.34 1990-04-16 00:00:00,344.74 1990-04-17 00:00:00,344.68 1990-04-18 00:00:00,340.72 1990-04-19 00:00:00,338.09 1990-04-20 00:00:00,335.12 1990-04-23 00:00:00,331.05 1990-04-24 00:00:00,330.36 1990-04-25 00:00:00,332.03 1990-04-26 00:00:00,332.92 1990-04-27 00:00:00,329.11 1990-04-30 00:00:00,330.8 1990-05-01 00:00:00,332.25 1990-05-02 00:00:00,334.48 1990-05-03 00:00:00,335.57 1990-05-04 00:00:00,338.39 1990-05-07 00:00:00,340.53 1990-05-08 00:00:00,342.01 1990-05-09 00:00:00,342.86 1990-05-10 00:00:00,343.82 1990-05-11 00:00:00,352.0 1990-05-14 00:00:00,354.75 1990-05-15 00:00:00,354.28 1990-05-16 00:00:00,354.0 1990-05-17 00:00:00,354.47 1990-05-18 00:00:00,354.64 1990-05-21 00:00:00,358.0 1990-05-22 00:00:00,358.43 1990-05-23 00:00:00,359.29 1990-05-24 00:00:00,358.41 1990-05-25 00:00:00,354.58 1990-05-29 00:00:00,360.65 1990-05-30 00:00:00,360.86 1990-05-31 00:00:00,361.23 1990-06-01 00:00:00,363.16 1990-06-04 00:00:00,367.4 1990-06-05 00:00:00,366.64 1990-06-06 00:00:00,364.96 1990-06-07 00:00:00,363.15 1990-06-08 00:00:00,358.71 1990-06-11 00:00:00,361.63 1990-06-12 00:00:00,366.25 1990-06-13 00:00:00,364.9 1990-06-14 00:00:00,362.9 1990-06-15 00:00:00,362.91 1990-06-18 00:00:00,356.88 1990-06-19 00:00:00,358.47 1990-06-20 00:00:00,359.1 1990-06-21 00:00:00,360.47 1990-06-22 00:00:00,355.43 1990-06-25 00:00:00,352.31 1990-06-26 00:00:00,352.06 1990-06-27 00:00:00,355.14 1990-06-28 00:00:00,357.63 1990-06-29 00:00:00,358.02 1990-07-02 00:00:00,359.54 1990-07-03 00:00:00,360.16 1990-07-05 00:00:00,355.68 1990-07-06 00:00:00,358.42 1990-07-09 00:00:00,359.52 1990-07-10 00:00:00,356.49 1990-07-11 00:00:00,361.23 1990-07-12 00:00:00,365.44 1990-07-13 00:00:00,367.31 1990-07-16 00:00:00,368.95 1990-07-17 00:00:00,367.52 1990-07-18 00:00:00,364.22 1990-07-19 00:00:00,365.32 1990-07-20 00:00:00,361.61 1990-07-23 00:00:00,355.31 1990-07-24 00:00:00,355.79 1990-07-25 00:00:00,357.09 1990-07-26 00:00:00,355.91 1990-07-27 00:00:00,353.44 1990-07-30 00:00:00,355.55 1990-07-31 00:00:00,356.15 1990-08-01 00:00:00,355.52 1990-08-02 00:00:00,351.48 1990-08-03 00:00:00,344.86 1990-08-06 00:00:00,334.43 1990-08-07 00:00:00,334.83 1990-08-08 00:00:00,338.35 1990-08-09 00:00:00,339.94 1990-08-10 00:00:00,335.52 1990-08-13 00:00:00,338.84 1990-08-14 00:00:00,339.39 1990-08-15 00:00:00,340.06 1990-08-16 00:00:00,332.39 1990-08-17 00:00:00,327.83 1990-08-20 00:00:00,328.51 1990-08-21 00:00:00,321.86 1990-08-22 00:00:00,316.55 1990-08-23 00:00:00,307.06 1990-08-24 00:00:00,311.51 1990-08-27 00:00:00,321.44 1990-08-28 00:00:00,321.34 1990-08-29 00:00:00,324.19 1990-08-30 00:00:00,318.71 1990-08-31 00:00:00,322.56 1990-09-04 00:00:00,323.09 1990-09-05 00:00:00,324.39 1990-09-06 00:00:00,320.46 1990-09-07 00:00:00,323.4 1990-09-10 00:00:00,321.63 1990-09-11 00:00:00,321.04 1990-09-12 00:00:00,322.54 1990-09-13 00:00:00,318.65 1990-09-14 00:00:00,316.83 1990-09-17 00:00:00,317.77 1990-09-18 00:00:00,318.6 1990-09-19 00:00:00,316.6 1990-09-20 00:00:00,311.48 1990-09-21 00:00:00,311.32 1990-09-24 00:00:00,304.59 1990-09-25 00:00:00,308.26 1990-09-26 00:00:00,305.06 1990-09-27 00:00:00,300.97 1990-09-28 00:00:00,306.05 1990-10-01 00:00:00,314.94 1990-10-02 00:00:00,315.21 1990-10-03 00:00:00,311.4 1990-10-04 00:00:00,312.69 1990-10-05 00:00:00,311.5 1990-10-08 00:00:00,313.48 1990-10-09 00:00:00,305.1 1990-10-10 00:00:00,300.39 1990-10-11 00:00:00,295.46 1990-10-12 00:00:00,300.03 1990-10-15 00:00:00,303.23 1990-10-16 00:00:00,298.92 1990-10-17 00:00:00,298.76 1990-10-18 00:00:00,305.74 1990-10-19 00:00:00,312.48 1990-10-22 00:00:00,314.76 1990-10-23 00:00:00,312.36 1990-10-24 00:00:00,312.6 1990-10-25 00:00:00,310.17 1990-10-26 00:00:00,304.71 1990-10-29 00:00:00,301.88 1990-10-30 00:00:00,304.06 1990-10-31 00:00:00,304.0 1990-11-01 00:00:00,307.02 1990-11-02 00:00:00,311.85 1990-11-05 00:00:00,314.59 1990-11-06 00:00:00,311.62 1990-11-07 00:00:00,306.01 1990-11-08 00:00:00,307.61 1990-11-09 00:00:00,313.74 1990-11-12 00:00:00,319.48 1990-11-13 00:00:00,317.67 1990-11-14 00:00:00,320.4 1990-11-15 00:00:00,317.02 1990-11-16 00:00:00,317.12 1990-11-19 00:00:00,319.34 1990-11-20 00:00:00,315.31 1990-11-21 00:00:00,316.03 1990-11-23 00:00:00,315.1 1990-11-26 00:00:00,316.51 1990-11-27 00:00:00,318.1 1990-11-28 00:00:00,317.95 1990-11-29 00:00:00,316.42 1990-11-30 00:00:00,322.22 1990-12-03 00:00:00,324.1 1990-12-04 00:00:00,326.35 1990-12-05 00:00:00,329.92 1990-12-06 00:00:00,329.07 1990-12-07 00:00:00,327.75 1990-12-10 00:00:00,328.89 1990-12-11 00:00:00,326.44 1990-12-12 00:00:00,330.19 1990-12-13 00:00:00,329.34 1990-12-14 00:00:00,326.82 1990-12-17 00:00:00,326.02 1990-12-18 00:00:00,330.05 1990-12-19 00:00:00,330.2 1990-12-20 00:00:00,330.12 1990-12-21 00:00:00,331.75 1990-12-24 00:00:00,329.9 1990-12-26 00:00:00,330.85 1990-12-27 00:00:00,328.29 1990-12-28 00:00:00,328.72 1990-12-31 00:00:00,330.22 1991-01-02 00:00:00,326.45 1991-01-03 00:00:00,321.91 1991-01-04 00:00:00,321.0 1991-01-07 00:00:00,315.44 1991-01-08 00:00:00,314.9 1991-01-09 00:00:00,311.49 1991-01-10 00:00:00,314.53 1991-01-11 00:00:00,315.23 1991-01-14 00:00:00,312.49 1991-01-15 00:00:00,313.73 1991-01-16 00:00:00,316.17 1991-01-17 00:00:00,327.97 1991-01-18 00:00:00,332.23 1991-01-21 00:00:00,331.06 1991-01-22 00:00:00,328.31 1991-01-23 00:00:00,330.21 1991-01-24 00:00:00,334.78 1991-01-25 00:00:00,336.07 1991-01-28 00:00:00,336.03 1991-01-29 00:00:00,335.84 1991-01-30 00:00:00,340.91 1991-01-31 00:00:00,343.93 1991-02-01 00:00:00,343.05 1991-02-04 00:00:00,348.34 1991-02-05 00:00:00,351.26 1991-02-06 00:00:00,358.07 1991-02-07 00:00:00,356.52 1991-02-08 00:00:00,359.35 1991-02-11 00:00:00,368.58 1991-02-12 00:00:00,365.5 1991-02-13 00:00:00,369.02 1991-02-14 00:00:00,364.22 1991-02-15 00:00:00,369.06 1991-02-19 00:00:00,369.39 1991-02-20 00:00:00,365.14 1991-02-21 00:00:00,364.97 1991-02-22 00:00:00,365.65 1991-02-25 00:00:00,367.26 1991-02-26 00:00:00,362.81 1991-02-27 00:00:00,367.74 1991-02-28 00:00:00,367.07 1991-03-01 00:00:00,370.47 1991-03-04 00:00:00,369.33 1991-03-05 00:00:00,376.72 1991-03-06 00:00:00,376.17 1991-03-07 00:00:00,375.91 1991-03-08 00:00:00,374.95 1991-03-11 00:00:00,372.96 1991-03-12 00:00:00,370.03 1991-03-13 00:00:00,374.57 1991-03-14 00:00:00,373.5 1991-03-15 00:00:00,373.59 1991-03-18 00:00:00,372.11 1991-03-19 00:00:00,366.59 1991-03-20 00:00:00,367.92 1991-03-21 00:00:00,366.58 1991-03-22 00:00:00,367.48 1991-03-25 00:00:00,369.83 1991-03-26 00:00:00,376.3 1991-03-27 00:00:00,375.35 1991-03-28 00:00:00,375.22 1991-04-01 00:00:00,371.3 1991-04-02 00:00:00,379.5 1991-04-03 00:00:00,378.94 1991-04-04 00:00:00,379.77 1991-04-05 00:00:00,375.36 1991-04-08 00:00:00,378.66 1991-04-09 00:00:00,373.56 1991-04-10 00:00:00,373.15 1991-04-11 00:00:00,377.63 1991-04-12 00:00:00,380.4 1991-04-15 00:00:00,381.19 1991-04-16 00:00:00,387.62 1991-04-17 00:00:00,390.45 1991-04-18 00:00:00,388.46 1991-04-19 00:00:00,384.2 1991-04-22 00:00:00,380.95 1991-04-23 00:00:00,381.76 1991-04-24 00:00:00,382.76 1991-04-25 00:00:00,379.25 1991-04-26 00:00:00,379.02 1991-04-29 00:00:00,373.66 1991-04-30 00:00:00,375.34 1991-05-01 00:00:00,380.29 1991-05-02 00:00:00,380.52 1991-05-03 00:00:00,380.8 1991-05-06 00:00:00,380.08 1991-05-07 00:00:00,377.32 1991-05-08 00:00:00,378.51 1991-05-09 00:00:00,383.25 1991-05-10 00:00:00,375.74 1991-05-13 00:00:00,376.76 1991-05-14 00:00:00,371.62 1991-05-15 00:00:00,368.57 1991-05-16 00:00:00,372.19 1991-05-17 00:00:00,372.39 1991-05-20 00:00:00,372.28 1991-05-21 00:00:00,375.35 1991-05-22 00:00:00,376.19 1991-05-23 00:00:00,374.96 1991-05-24 00:00:00,377.49 1991-05-28 00:00:00,381.94 1991-05-29 00:00:00,382.79 1991-05-30 00:00:00,386.96 1991-05-31 00:00:00,389.83 1991-06-03 00:00:00,388.06 1991-06-04 00:00:00,387.74 1991-06-05 00:00:00,385.09 1991-06-06 00:00:00,383.63 1991-06-07 00:00:00,379.43 1991-06-10 00:00:00,378.57 1991-06-11 00:00:00,381.05 1991-06-12 00:00:00,376.65 1991-06-13 00:00:00,377.63 1991-06-14 00:00:00,382.29 1991-06-17 00:00:00,380.13 1991-06-18 00:00:00,378.59 1991-06-19 00:00:00,375.09 1991-06-20 00:00:00,375.42 1991-06-21 00:00:00,377.75 1991-06-24 00:00:00,370.94 1991-06-25 00:00:00,370.65 1991-06-26 00:00:00,371.59 1991-06-27 00:00:00,374.4 1991-06-28 00:00:00,371.16 1991-07-01 00:00:00,377.92 1991-07-02 00:00:00,377.47 1991-07-03 00:00:00,373.33 1991-07-05 00:00:00,374.08 1991-07-08 00:00:00,377.94 1991-07-09 00:00:00,376.11 1991-07-10 00:00:00,375.74 1991-07-11 00:00:00,376.97 1991-07-12 00:00:00,380.25 1991-07-15 00:00:00,382.39 1991-07-16 00:00:00,381.54 1991-07-17 00:00:00,381.18 1991-07-18 00:00:00,385.37 1991-07-19 00:00:00,384.22 1991-07-22 00:00:00,382.88 1991-07-23 00:00:00,379.42 1991-07-24 00:00:00,378.64 1991-07-25 00:00:00,380.96 1991-07-26 00:00:00,380.93 1991-07-29 00:00:00,383.15 1991-07-30 00:00:00,386.69 1991-07-31 00:00:00,387.81 1991-08-01 00:00:00,387.12 1991-08-02 00:00:00,387.18 1991-08-05 00:00:00,385.06 1991-08-06 00:00:00,390.62 1991-08-07 00:00:00,390.56 1991-08-08 00:00:00,389.32 1991-08-09 00:00:00,387.12 1991-08-12 00:00:00,388.02 1991-08-13 00:00:00,389.62 1991-08-14 00:00:00,389.9 1991-08-15 00:00:00,389.33 1991-08-16 00:00:00,385.58 1991-08-19 00:00:00,376.47 1991-08-20 00:00:00,379.43 1991-08-21 00:00:00,390.59 1991-08-22 00:00:00,391.33 1991-08-23 00:00:00,394.17 1991-08-26 00:00:00,393.85 1991-08-27 00:00:00,393.06 1991-08-28 00:00:00,396.64 1991-08-29 00:00:00,396.47 1991-08-30 00:00:00,395.43 1991-09-03 00:00:00,392.15 1991-09-04 00:00:00,389.97 1991-09-05 00:00:00,389.14 1991-09-06 00:00:00,389.1 1991-09-09 00:00:00,388.57 1991-09-10 00:00:00,384.56 1991-09-11 00:00:00,385.09 1991-09-12 00:00:00,387.34 1991-09-13 00:00:00,383.59 1991-09-16 00:00:00,385.78 1991-09-17 00:00:00,385.5 1991-09-18 00:00:00,386.94 1991-09-19 00:00:00,387.56 1991-09-20 00:00:00,387.92 1991-09-23 00:00:00,385.92 1991-09-24 00:00:00,387.71 1991-09-25 00:00:00,386.88 1991-09-26 00:00:00,386.49 1991-09-27 00:00:00,385.9 1991-09-30 00:00:00,387.86 1991-10-01 00:00:00,389.2 1991-10-02 00:00:00,388.26 1991-10-03 00:00:00,384.47 1991-10-04 00:00:00,381.25 1991-10-07 00:00:00,379.5 1991-10-08 00:00:00,380.67 1991-10-09 00:00:00,376.8 1991-10-10 00:00:00,380.55 1991-10-11 00:00:00,381.45 1991-10-14 00:00:00,386.47 1991-10-15 00:00:00,391.01 1991-10-16 00:00:00,392.8 1991-10-17 00:00:00,391.92 1991-10-18 00:00:00,392.5 1991-10-21 00:00:00,390.02 1991-10-22 00:00:00,387.83 1991-10-23 00:00:00,387.94 1991-10-24 00:00:00,385.07 1991-10-25 00:00:00,384.2 1991-10-28 00:00:00,389.52 1991-10-29 00:00:00,391.48 1991-10-30 00:00:00,392.96 1991-10-31 00:00:00,392.45 1991-11-01 00:00:00,391.32 1991-11-04 00:00:00,390.28 1991-11-05 00:00:00,388.71 1991-11-06 00:00:00,389.97 1991-11-07 00:00:00,393.72 1991-11-08 00:00:00,392.89 1991-11-11 00:00:00,393.12 1991-11-12 00:00:00,396.74 1991-11-13 00:00:00,397.41 1991-11-14 00:00:00,397.15 1991-11-15 00:00:00,382.62 1991-11-18 00:00:00,385.24 1991-11-19 00:00:00,379.42 1991-11-20 00:00:00,378.53 1991-11-21 00:00:00,380.06 1991-11-22 00:00:00,376.14 1991-11-25 00:00:00,375.34 1991-11-26 00:00:00,377.96 1991-11-27 00:00:00,376.55 1991-11-29 00:00:00,375.22 1991-12-02 00:00:00,381.4 1991-12-03 00:00:00,380.96 1991-12-04 00:00:00,380.07 1991-12-05 00:00:00,377.39 1991-12-06 00:00:00,379.1 1991-12-09 00:00:00,378.26 1991-12-10 00:00:00,377.9 1991-12-11 00:00:00,377.7 1991-12-12 00:00:00,381.55 1991-12-13 00:00:00,384.47 1991-12-16 00:00:00,384.46 1991-12-17 00:00:00,382.74 1991-12-18 00:00:00,383.48 1991-12-19 00:00:00,382.52 1991-12-20 00:00:00,387.04 1991-12-23 00:00:00,396.82 1991-12-24 00:00:00,399.33 1991-12-26 00:00:00,404.84 1991-12-27 00:00:00,406.46 1991-12-30 00:00:00,415.14 1991-12-31 00:00:00,417.09 1992-01-02 00:00:00,417.26 1992-01-03 00:00:00,419.34 1992-01-06 00:00:00,417.96 1992-01-07 00:00:00,417.4 1992-01-08 00:00:00,418.1 1992-01-09 00:00:00,417.61 1992-01-10 00:00:00,415.1 1992-01-13 00:00:00,414.34 1992-01-14 00:00:00,420.44 1992-01-15 00:00:00,420.77 1992-01-16 00:00:00,418.21 1992-01-17 00:00:00,418.86 1992-01-20 00:00:00,416.36 1992-01-21 00:00:00,412.64 1992-01-22 00:00:00,418.13 1992-01-23 00:00:00,414.96 1992-01-24 00:00:00,415.48 1992-01-27 00:00:00,414.99 1992-01-28 00:00:00,414.96 1992-01-29 00:00:00,410.34 1992-01-30 00:00:00,411.62 1992-01-31 00:00:00,408.78 1992-02-03 00:00:00,409.53 1992-02-04 00:00:00,413.85 1992-02-05 00:00:00,413.84 1992-02-06 00:00:00,413.82 1992-02-07 00:00:00,411.09 1992-02-10 00:00:00,413.77 1992-02-11 00:00:00,413.76 1992-02-12 00:00:00,417.13 1992-02-13 00:00:00,413.69 1992-02-14 00:00:00,412.48 1992-02-18 00:00:00,407.38 1992-02-19 00:00:00,408.26 1992-02-20 00:00:00,413.9 1992-02-21 00:00:00,411.43 1992-02-24 00:00:00,412.27 1992-02-25 00:00:00,410.45 1992-02-26 00:00:00,415.35 1992-02-27 00:00:00,413.86 1992-02-28 00:00:00,412.7 1992-03-02 00:00:00,412.45 1992-03-03 00:00:00,412.85 1992-03-04 00:00:00,409.33 1992-03-05 00:00:00,406.51 1992-03-06 00:00:00,404.44 1992-03-09 00:00:00,405.21 1992-03-10 00:00:00,406.89 1992-03-11 00:00:00,404.03 1992-03-12 00:00:00,403.89 1992-03-13 00:00:00,405.84 1992-03-16 00:00:00,406.39 1992-03-17 00:00:00,409.58 1992-03-18 00:00:00,409.15 1992-03-19 00:00:00,409.8 1992-03-20 00:00:00,411.3 1992-03-23 00:00:00,409.91 1992-03-24 00:00:00,408.88 1992-03-25 00:00:00,407.52 1992-03-26 00:00:00,407.86 1992-03-27 00:00:00,403.5 1992-03-30 00:00:00,403.0 1992-03-31 00:00:00,403.69 1992-04-01 00:00:00,404.23 1992-04-02 00:00:00,400.5 1992-04-03 00:00:00,401.55 1992-04-06 00:00:00,405.59 1992-04-07 00:00:00,398.06 1992-04-08 00:00:00,394.5 1992-04-09 00:00:00,400.64 1992-04-10 00:00:00,404.29 1992-04-13 00:00:00,406.08 1992-04-14 00:00:00,412.39 1992-04-15 00:00:00,416.28 1992-04-16 00:00:00,416.04 1992-04-20 00:00:00,410.18 1992-04-21 00:00:00,410.26 1992-04-22 00:00:00,409.81 1992-04-23 00:00:00,411.6 1992-04-24 00:00:00,409.02 1992-04-27 00:00:00,408.45 1992-04-28 00:00:00,409.11 1992-04-29 00:00:00,412.02 1992-04-30 00:00:00,414.95 1992-05-01 00:00:00,412.53 1992-05-04 00:00:00,416.91 1992-05-05 00:00:00,416.84 1992-05-06 00:00:00,416.79 1992-05-07 00:00:00,415.85 1992-05-08 00:00:00,416.05 1992-05-11 00:00:00,418.49 1992-05-12 00:00:00,416.29 1992-05-13 00:00:00,416.45 1992-05-14 00:00:00,413.14 1992-05-15 00:00:00,410.09 1992-05-18 00:00:00,412.81 1992-05-19 00:00:00,416.37 1992-05-20 00:00:00,415.39 1992-05-21 00:00:00,412.6 1992-05-22 00:00:00,414.02 1992-05-26 00:00:00,411.41 1992-05-27 00:00:00,412.17 1992-05-28 00:00:00,416.74 1992-05-29 00:00:00,415.35 1992-06-01 00:00:00,417.3 1992-06-02 00:00:00,413.5 1992-06-03 00:00:00,414.59 1992-06-04 00:00:00,413.26 1992-06-05 00:00:00,413.48 1992-06-08 00:00:00,413.36 1992-06-09 00:00:00,410.06 1992-06-10 00:00:00,407.25 1992-06-11 00:00:00,409.05 1992-06-12 00:00:00,409.76 1992-06-15 00:00:00,410.29 1992-06-16 00:00:00,408.32 1992-06-17 00:00:00,402.26 1992-06-18 00:00:00,400.96 1992-06-19 00:00:00,403.67 1992-06-22 00:00:00,403.4 1992-06-23 00:00:00,404.04 1992-06-24 00:00:00,403.84 1992-06-25 00:00:00,403.12 1992-06-26 00:00:00,403.45 1992-06-29 00:00:00,408.94 1992-06-30 00:00:00,408.14 1992-07-01 00:00:00,412.88 1992-07-02 00:00:00,411.77 1992-07-06 00:00:00,413.84 1992-07-07 00:00:00,409.16 1992-07-08 00:00:00,410.28 1992-07-09 00:00:00,414.23 1992-07-10 00:00:00,414.62 1992-07-13 00:00:00,414.87 1992-07-14 00:00:00,417.68 1992-07-15 00:00:00,417.1 1992-07-16 00:00:00,417.54 1992-07-17 00:00:00,415.62 1992-07-20 00:00:00,413.75 1992-07-21 00:00:00,413.76 1992-07-22 00:00:00,410.93 1992-07-23 00:00:00,412.08 1992-07-24 00:00:00,411.6 1992-07-27 00:00:00,411.54 1992-07-28 00:00:00,417.52 1992-07-29 00:00:00,422.23 1992-07-30 00:00:00,423.92 1992-07-31 00:00:00,424.21 1992-08-03 00:00:00,425.09 1992-08-04 00:00:00,424.36 1992-08-05 00:00:00,422.19 1992-08-06 00:00:00,420.59 1992-08-07 00:00:00,418.88 1992-08-10 00:00:00,419.42 1992-08-11 00:00:00,418.9 1992-08-12 00:00:00,417.78 1992-08-13 00:00:00,417.73 1992-08-14 00:00:00,419.91 1992-08-17 00:00:00,420.74 1992-08-18 00:00:00,421.34 1992-08-19 00:00:00,418.19 1992-08-20 00:00:00,418.26 1992-08-21 00:00:00,414.85 1992-08-24 00:00:00,410.72 1992-08-25 00:00:00,411.61 1992-08-26 00:00:00,413.51 1992-08-27 00:00:00,413.53 1992-08-28 00:00:00,414.84 1992-08-31 00:00:00,414.03 1992-09-01 00:00:00,416.07 1992-09-02 00:00:00,417.98 1992-09-03 00:00:00,417.98 1992-09-04 00:00:00,417.08 1992-09-08 00:00:00,414.44 1992-09-09 00:00:00,416.36 1992-09-10 00:00:00,419.95 1992-09-11 00:00:00,419.58 1992-09-14 00:00:00,425.27 1992-09-15 00:00:00,419.77 1992-09-16 00:00:00,419.92 1992-09-17 00:00:00,419.93 1992-09-18 00:00:00,422.93 1992-09-21 00:00:00,422.14 1992-09-22 00:00:00,417.14 1992-09-23 00:00:00,417.44 1992-09-24 00:00:00,418.47 1992-09-25 00:00:00,414.35 1992-09-28 00:00:00,416.62 1992-09-29 00:00:00,416.8 1992-09-30 00:00:00,417.8 1992-10-01 00:00:00,416.29 1992-10-02 00:00:00,410.47 1992-10-05 00:00:00,407.57 1992-10-06 00:00:00,407.18 1992-10-07 00:00:00,404.25 1992-10-08 00:00:00,407.75 1992-10-09 00:00:00,402.66 1992-10-12 00:00:00,407.44 1992-10-13 00:00:00,409.3 1992-10-14 00:00:00,409.37 1992-10-15 00:00:00,409.6 1992-10-16 00:00:00,411.73 1992-10-19 00:00:00,414.98 1992-10-20 00:00:00,415.48 1992-10-21 00:00:00,415.67 1992-10-22 00:00:00,414.9 1992-10-23 00:00:00,414.1 1992-10-26 00:00:00,418.16 1992-10-27 00:00:00,418.49 1992-10-28 00:00:00,420.13 1992-10-29 00:00:00,420.86 1992-10-30 00:00:00,418.68 1992-11-02 00:00:00,422.75 1992-11-03 00:00:00,419.92 1992-11-04 00:00:00,417.11 1992-11-05 00:00:00,418.34 1992-11-06 00:00:00,417.58 1992-11-09 00:00:00,418.59 1992-11-10 00:00:00,418.62 1992-11-11 00:00:00,422.2 1992-11-12 00:00:00,422.87 1992-11-13 00:00:00,422.43 1992-11-16 00:00:00,420.68 1992-11-17 00:00:00,419.27 1992-11-18 00:00:00,422.85 1992-11-19 00:00:00,423.61 1992-11-20 00:00:00,426.65 1992-11-23 00:00:00,425.12 1992-11-24 00:00:00,427.59 1992-11-25 00:00:00,429.19 1992-11-27 00:00:00,430.16 1992-11-30 00:00:00,431.35 1992-12-01 00:00:00,430.78 1992-12-02 00:00:00,429.89 1992-12-03 00:00:00,429.91 1992-12-04 00:00:00,432.06 1992-12-07 00:00:00,435.31 1992-12-08 00:00:00,436.99 1992-12-09 00:00:00,435.65 1992-12-10 00:00:00,434.64 1992-12-11 00:00:00,433.73 1992-12-14 00:00:00,432.84 1992-12-15 00:00:00,432.57 1992-12-16 00:00:00,431.52 1992-12-17 00:00:00,435.43 1992-12-18 00:00:00,441.28 1992-12-21 00:00:00,440.7 1992-12-22 00:00:00,440.31 1992-12-23 00:00:00,439.03 1992-12-24 00:00:00,439.77 1992-12-28 00:00:00,439.15 1992-12-29 00:00:00,437.98 1992-12-30 00:00:00,438.82 1992-12-31 00:00:00,435.71 1993-01-04 00:00:00,435.38 1993-01-05 00:00:00,434.34 1993-01-06 00:00:00,434.52 1993-01-07 00:00:00,430.73 1993-01-08 00:00:00,429.05 1993-01-11 00:00:00,430.95 1993-01-12 00:00:00,431.04 1993-01-13 00:00:00,433.03 1993-01-14 00:00:00,435.94 1993-01-15 00:00:00,437.15 1993-01-18 00:00:00,436.84 1993-01-19 00:00:00,435.13 1993-01-20 00:00:00,433.37 1993-01-21 00:00:00,435.49 1993-01-22 00:00:00,436.11 1993-01-25 00:00:00,440.01 1993-01-26 00:00:00,439.95 1993-01-27 00:00:00,438.11 1993-01-28 00:00:00,438.66 1993-01-29 00:00:00,438.78 1993-02-01 00:00:00,442.52 1993-02-02 00:00:00,442.55 1993-02-03 00:00:00,447.2 1993-02-04 00:00:00,449.56 1993-02-05 00:00:00,448.93 1993-02-08 00:00:00,447.85 1993-02-09 00:00:00,445.33 1993-02-10 00:00:00,446.23 1993-02-11 00:00:00,447.66 1993-02-12 00:00:00,444.58 1993-02-16 00:00:00,433.91 1993-02-17 00:00:00,433.3 1993-02-18 00:00:00,431.9 1993-02-19 00:00:00,434.22 1993-02-22 00:00:00,435.24 1993-02-23 00:00:00,434.8 1993-02-24 00:00:00,440.87 1993-02-25 00:00:00,442.34 1993-02-26 00:00:00,443.38 1993-03-01 00:00:00,442.01 1993-03-02 00:00:00,447.9 1993-03-03 00:00:00,449.26 1993-03-04 00:00:00,447.34 1993-03-05 00:00:00,446.11 1993-03-08 00:00:00,454.71 1993-03-09 00:00:00,454.4 1993-03-10 00:00:00,456.33 1993-03-11 00:00:00,453.72 1993-03-12 00:00:00,449.83 1993-03-15 00:00:00,451.43 1993-03-16 00:00:00,451.37 1993-03-17 00:00:00,448.31 1993-03-18 00:00:00,451.89 1993-03-19 00:00:00,450.18 1993-03-22 00:00:00,448.88 1993-03-23 00:00:00,448.76 1993-03-24 00:00:00,448.07 1993-03-25 00:00:00,450.88 1993-03-26 00:00:00,447.78 1993-03-29 00:00:00,450.77 1993-03-30 00:00:00,451.97 1993-03-31 00:00:00,451.67 1993-04-01 00:00:00,450.3 1993-04-02 00:00:00,441.39 1993-04-05 00:00:00,442.29 1993-04-06 00:00:00,441.16 1993-04-07 00:00:00,442.73 1993-04-08 00:00:00,441.84 1993-04-12 00:00:00,448.37 1993-04-13 00:00:00,449.22 1993-04-14 00:00:00,448.66 1993-04-15 00:00:00,448.4 1993-04-16 00:00:00,448.94 1993-04-19 00:00:00,447.46 1993-04-20 00:00:00,445.1 1993-04-21 00:00:00,443.63 1993-04-22 00:00:00,439.46 1993-04-23 00:00:00,437.03 1993-04-26 00:00:00,433.54 1993-04-27 00:00:00,438.01 1993-04-28 00:00:00,438.02 1993-04-29 00:00:00,438.89 1993-04-30 00:00:00,440.19 1993-05-03 00:00:00,442.46 1993-05-04 00:00:00,444.05 1993-05-05 00:00:00,444.52 1993-05-06 00:00:00,443.26 1993-05-07 00:00:00,442.31 1993-05-10 00:00:00,442.8 1993-05-11 00:00:00,444.36 1993-05-12 00:00:00,444.8 1993-05-13 00:00:00,439.23 1993-05-14 00:00:00,439.56 1993-05-17 00:00:00,440.37 1993-05-18 00:00:00,440.32 1993-05-19 00:00:00,447.57 1993-05-20 00:00:00,450.59 1993-05-21 00:00:00,445.84 1993-05-24 00:00:00,448.0 1993-05-25 00:00:00,448.85 1993-05-26 00:00:00,453.44 1993-05-27 00:00:00,452.41 1993-05-28 00:00:00,450.19 1993-06-01 00:00:00,453.83 1993-06-02 00:00:00,453.85 1993-06-03 00:00:00,452.49 1993-06-04 00:00:00,450.06 1993-06-07 00:00:00,447.69 1993-06-08 00:00:00,444.71 1993-06-09 00:00:00,445.78 1993-06-10 00:00:00,445.38 1993-06-11 00:00:00,447.26 1993-06-14 00:00:00,447.71 1993-06-15 00:00:00,446.27 1993-06-16 00:00:00,447.43 1993-06-17 00:00:00,448.54 1993-06-18 00:00:00,443.68 1993-06-21 00:00:00,446.22 1993-06-22 00:00:00,445.93 1993-06-23 00:00:00,443.19 1993-06-24 00:00:00,446.62 1993-06-25 00:00:00,447.6 1993-06-28 00:00:00,451.85 1993-06-29 00:00:00,450.69 1993-06-30 00:00:00,450.53 1993-07-01 00:00:00,449.02 1993-07-02 00:00:00,445.84 1993-07-06 00:00:00,441.43 1993-07-07 00:00:00,442.83 1993-07-08 00:00:00,448.64 1993-07-09 00:00:00,448.11 1993-07-12 00:00:00,448.98 1993-07-13 00:00:00,448.09 1993-07-14 00:00:00,450.08 1993-07-15 00:00:00,449.22 1993-07-16 00:00:00,445.75 1993-07-19 00:00:00,446.03 1993-07-20 00:00:00,447.31 1993-07-21 00:00:00,447.18 1993-07-22 00:00:00,444.51 1993-07-23 00:00:00,447.1 1993-07-26 00:00:00,449.09 1993-07-27 00:00:00,448.24 1993-07-28 00:00:00,447.19 1993-07-29 00:00:00,450.24 1993-07-30 00:00:00,448.13 1993-08-02 00:00:00,450.15 1993-08-03 00:00:00,449.27 1993-08-04 00:00:00,448.54 1993-08-05 00:00:00,448.13 1993-08-06 00:00:00,448.68 1993-08-09 00:00:00,450.72 1993-08-10 00:00:00,449.45 1993-08-11 00:00:00,450.46 1993-08-12 00:00:00,448.96 1993-08-13 00:00:00,450.14 1993-08-16 00:00:00,452.38 1993-08-17 00:00:00,453.13 1993-08-18 00:00:00,456.04 1993-08-19 00:00:00,456.43 1993-08-20 00:00:00,456.16 1993-08-23 00:00:00,455.23 1993-08-24 00:00:00,459.77 1993-08-25 00:00:00,460.13 1993-08-26 00:00:00,461.04 1993-08-27 00:00:00,460.54 1993-08-30 00:00:00,461.9 1993-08-31 00:00:00,463.56 1993-09-01 00:00:00,463.15 1993-09-02 00:00:00,461.3 1993-09-03 00:00:00,461.34 1993-09-07 00:00:00,458.52 1993-09-08 00:00:00,456.65 1993-09-09 00:00:00,457.5 1993-09-10 00:00:00,461.72 1993-09-13 00:00:00,462.06 1993-09-14 00:00:00,459.9 1993-09-15 00:00:00,461.6 1993-09-16 00:00:00,459.43 1993-09-17 00:00:00,458.83 1993-09-20 00:00:00,455.05 1993-09-21 00:00:00,452.95 1993-09-22 00:00:00,456.2 1993-09-23 00:00:00,457.74 1993-09-24 00:00:00,457.63 1993-09-27 00:00:00,461.8 1993-09-28 00:00:00,461.53 1993-09-29 00:00:00,460.11 1993-09-30 00:00:00,458.93 1993-10-01 00:00:00,461.28 1993-10-04 00:00:00,461.34 1993-10-05 00:00:00,461.2 1993-10-06 00:00:00,460.74 1993-10-07 00:00:00,459.18 1993-10-08 00:00:00,460.31 1993-10-11 00:00:00,460.88 1993-10-12 00:00:00,461.12 1993-10-13 00:00:00,461.49 1993-10-14 00:00:00,466.83 1993-10-15 00:00:00,469.5 1993-10-18 00:00:00,468.45 1993-10-19 00:00:00,466.21 1993-10-20 00:00:00,466.07 1993-10-21 00:00:00,465.36 1993-10-22 00:00:00,463.27 1993-10-25 00:00:00,464.2 1993-10-26 00:00:00,464.3 1993-10-27 00:00:00,464.61 1993-10-28 00:00:00,467.73 1993-10-29 00:00:00,467.83 1993-11-01 00:00:00,469.1 1993-11-02 00:00:00,468.44 1993-11-03 00:00:00,463.02 1993-11-04 00:00:00,457.49 1993-11-05 00:00:00,459.57 1993-11-08 00:00:00,460.21 1993-11-09 00:00:00,460.33 1993-11-10 00:00:00,463.72 1993-11-11 00:00:00,462.64 1993-11-12 00:00:00,465.39 1993-11-15 00:00:00,463.75 1993-11-16 00:00:00,466.74 1993-11-17 00:00:00,464.81 1993-11-18 00:00:00,463.62 1993-11-19 00:00:00,462.6 1993-11-22 00:00:00,459.13 1993-11-23 00:00:00,461.03 1993-11-24 00:00:00,462.36 1993-11-26 00:00:00,463.06 1993-11-29 00:00:00,461.9 1993-11-30 00:00:00,461.79 1993-12-01 00:00:00,461.89 1993-12-02 00:00:00,463.11 1993-12-03 00:00:00,464.89 1993-12-06 00:00:00,466.43 1993-12-07 00:00:00,466.76 1993-12-08 00:00:00,466.29 1993-12-09 00:00:00,464.18 1993-12-10 00:00:00,463.93 1993-12-13 00:00:00,465.7 1993-12-14 00:00:00,463.06 1993-12-15 00:00:00,461.84 1993-12-16 00:00:00,463.34 1993-12-17 00:00:00,466.38 1993-12-20 00:00:00,465.85 1993-12-21 00:00:00,465.3 1993-12-22 00:00:00,467.32 1993-12-23 00:00:00,467.38 1993-12-27 00:00:00,470.54 1993-12-28 00:00:00,470.94 1993-12-29 00:00:00,470.58 1993-12-30 00:00:00,468.64 1993-12-31 00:00:00,466.45 1994-01-03 00:00:00,465.44 1994-01-04 00:00:00,466.89 1994-01-05 00:00:00,467.55 1994-01-06 00:00:00,467.12 1994-01-07 00:00:00,469.9 1994-01-10 00:00:00,475.27 1994-01-11 00:00:00,474.13 1994-01-12 00:00:00,474.17 1994-01-13 00:00:00,472.47 1994-01-14 00:00:00,474.91 1994-01-17 00:00:00,473.3 1994-01-18 00:00:00,474.25 1994-01-19 00:00:00,474.3 1994-01-20 00:00:00,474.98 1994-01-21 00:00:00,474.72 1994-01-24 00:00:00,471.97 1994-01-25 00:00:00,470.92 1994-01-26 00:00:00,473.2 1994-01-27 00:00:00,477.05 1994-01-28 00:00:00,478.7 1994-01-31 00:00:00,481.61 1994-02-01 00:00:00,479.62 1994-02-02 00:00:00,482.0 1994-02-03 00:00:00,480.71 1994-02-04 00:00:00,469.81 1994-02-07 00:00:00,471.76 1994-02-08 00:00:00,471.05 1994-02-09 00:00:00,472.77 1994-02-10 00:00:00,468.93 1994-02-11 00:00:00,470.18 1994-02-14 00:00:00,470.23 1994-02-15 00:00:00,472.52 1994-02-16 00:00:00,472.79 1994-02-17 00:00:00,470.34 1994-02-18 00:00:00,467.69 1994-02-22 00:00:00,471.46 1994-02-23 00:00:00,470.69 1994-02-24 00:00:00,464.26 1994-02-25 00:00:00,466.07 1994-02-28 00:00:00,467.14 1994-03-01 00:00:00,464.44 1994-03-02 00:00:00,464.81 1994-03-03 00:00:00,463.01 1994-03-04 00:00:00,464.74 1994-03-07 00:00:00,466.91 1994-03-08 00:00:00,465.88 1994-03-09 00:00:00,467.06 1994-03-10 00:00:00,463.9 1994-03-11 00:00:00,466.44 1994-03-14 00:00:00,467.39 1994-03-15 00:00:00,467.01 1994-03-16 00:00:00,469.42 1994-03-17 00:00:00,470.9 1994-03-18 00:00:00,471.06 1994-03-21 00:00:00,468.54 1994-03-22 00:00:00,468.8 1994-03-23 00:00:00,468.54 1994-03-24 00:00:00,464.35 1994-03-25 00:00:00,460.58 1994-03-28 00:00:00,460.0 1994-03-29 00:00:00,452.48 1994-03-30 00:00:00,445.55 1994-03-31 00:00:00,445.77 1994-04-04 00:00:00,438.92 1994-04-05 00:00:00,448.29 1994-04-06 00:00:00,448.05 1994-04-07 00:00:00,450.88 1994-04-08 00:00:00,447.1 1994-04-11 00:00:00,449.87 1994-04-12 00:00:00,447.57 1994-04-13 00:00:00,446.26 1994-04-14 00:00:00,446.38 1994-04-15 00:00:00,446.18 1994-04-18 00:00:00,442.46 1994-04-19 00:00:00,442.54 1994-04-20 00:00:00,441.96 1994-04-21 00:00:00,448.73 1994-04-22 00:00:00,447.63 1994-04-25 00:00:00,452.71 1994-04-26 00:00:00,451.87 1994-04-28 00:00:00,449.1 1994-04-29 00:00:00,450.91 1994-05-02 00:00:00,453.02 1994-05-03 00:00:00,453.03 1994-05-04 00:00:00,451.72 1994-05-05 00:00:00,451.38 1994-05-06 00:00:00,447.82 1994-05-09 00:00:00,442.32 1994-05-10 00:00:00,446.01 1994-05-11 00:00:00,441.49 1994-05-12 00:00:00,443.75 1994-05-13 00:00:00,444.14 1994-05-16 00:00:00,444.49 1994-05-17 00:00:00,449.37 1994-05-18 00:00:00,453.69 1994-05-19 00:00:00,456.48 1994-05-20 00:00:00,454.92 1994-05-23 00:00:00,453.2 1994-05-24 00:00:00,454.81 1994-05-25 00:00:00,456.34 1994-05-26 00:00:00,457.06 1994-05-27 00:00:00,457.33 1994-05-31 00:00:00,456.5 1994-06-01 00:00:00,457.63 1994-06-02 00:00:00,457.65 1994-06-03 00:00:00,460.13 1994-06-06 00:00:00,458.88 1994-06-07 00:00:00,458.21 1994-06-08 00:00:00,457.06 1994-06-09 00:00:00,457.86 1994-06-10 00:00:00,458.67 1994-06-13 00:00:00,459.1 1994-06-14 00:00:00,462.37 1994-06-15 00:00:00,460.61 1994-06-16 00:00:00,461.93 1994-06-17 00:00:00,458.45 1994-06-20 00:00:00,455.48 1994-06-21 00:00:00,451.34 1994-06-22 00:00:00,453.09 1994-06-23 00:00:00,449.63 1994-06-24 00:00:00,442.8 1994-06-27 00:00:00,447.31 1994-06-28 00:00:00,446.07 1994-06-29 00:00:00,447.63 1994-06-30 00:00:00,444.27 1994-07-01 00:00:00,446.2 1994-07-05 00:00:00,446.37 1994-07-06 00:00:00,446.13 1994-07-07 00:00:00,448.38 1994-07-08 00:00:00,449.55 1994-07-11 00:00:00,448.06 1994-07-12 00:00:00,447.95 1994-07-13 00:00:00,448.73 1994-07-14 00:00:00,453.41 1994-07-15 00:00:00,454.16 1994-07-18 00:00:00,455.22 1994-07-19 00:00:00,453.86 1994-07-20 00:00:00,451.6 1994-07-21 00:00:00,452.61 1994-07-22 00:00:00,453.11 1994-07-25 00:00:00,454.25 1994-07-26 00:00:00,453.36 1994-07-27 00:00:00,452.57 1994-07-28 00:00:00,454.24 1994-07-29 00:00:00,458.26 1994-08-01 00:00:00,461.01 1994-08-02 00:00:00,460.56 1994-08-03 00:00:00,461.45 1994-08-04 00:00:00,458.4 1994-08-05 00:00:00,457.09 1994-08-08 00:00:00,457.89 1994-08-09 00:00:00,457.92 1994-08-10 00:00:00,460.3 1994-08-11 00:00:00,458.88 1994-08-12 00:00:00,461.94 1994-08-15 00:00:00,461.23 1994-08-16 00:00:00,465.01 1994-08-17 00:00:00,465.17 1994-08-18 00:00:00,463.17 1994-08-19 00:00:00,463.68 1994-08-22 00:00:00,462.32 1994-08-23 00:00:00,464.51 1994-08-24 00:00:00,469.03 1994-08-25 00:00:00,468.08 1994-08-26 00:00:00,473.8 1994-08-29 00:00:00,474.59 1994-08-30 00:00:00,476.07 1994-08-31 00:00:00,475.49 1994-09-01 00:00:00,473.17 1994-09-02 00:00:00,470.99 1994-09-06 00:00:00,471.86 1994-09-07 00:00:00,470.99 1994-09-08 00:00:00,473.14 1994-09-09 00:00:00,468.18 1994-09-12 00:00:00,466.21 1994-09-13 00:00:00,467.51 1994-09-14 00:00:00,468.8 1994-09-15 00:00:00,474.81 1994-09-16 00:00:00,471.19 1994-09-19 00:00:00,470.85 1994-09-20 00:00:00,463.36 1994-09-21 00:00:00,461.46 1994-09-22 00:00:00,461.27 1994-09-23 00:00:00,459.67 1994-09-26 00:00:00,460.82 1994-09-27 00:00:00,462.05 1994-09-28 00:00:00,464.84 1994-09-29 00:00:00,462.24 1994-09-30 00:00:00,462.71 1994-10-03 00:00:00,461.74 1994-10-04 00:00:00,454.59 1994-10-05 00:00:00,453.52 1994-10-06 00:00:00,452.36 1994-10-07 00:00:00,455.1 1994-10-10 00:00:00,459.04 1994-10-11 00:00:00,465.79 1994-10-12 00:00:00,465.47 1994-10-13 00:00:00,467.79 1994-10-14 00:00:00,469.1 1994-10-17 00:00:00,468.96 1994-10-18 00:00:00,467.66 1994-10-19 00:00:00,470.28 1994-10-20 00:00:00,466.85 1994-10-21 00:00:00,464.89 1994-10-24 00:00:00,460.83 1994-10-25 00:00:00,461.53 1994-10-26 00:00:00,462.62 1994-10-27 00:00:00,465.85 1994-10-28 00:00:00,473.77 1994-10-31 00:00:00,472.35 1994-11-01 00:00:00,468.42 1994-11-02 00:00:00,466.51 1994-11-03 00:00:00,467.91 1994-11-04 00:00:00,462.28 1994-11-07 00:00:00,463.07 1994-11-08 00:00:00,465.65 1994-11-09 00:00:00,465.4 1994-11-10 00:00:00,464.37 1994-11-11 00:00:00,462.35 1994-11-14 00:00:00,466.04 1994-11-15 00:00:00,465.03 1994-11-16 00:00:00,465.62 1994-11-17 00:00:00,463.57 1994-11-18 00:00:00,461.47 1994-11-21 00:00:00,458.3 1994-11-22 00:00:00,450.09 1994-11-23 00:00:00,449.93 1994-11-25 00:00:00,452.29 1994-11-28 00:00:00,454.16 1994-11-29 00:00:00,455.17 1994-11-30 00:00:00,453.69 1994-12-01 00:00:00,448.92 1994-12-02 00:00:00,453.3 1994-12-05 00:00:00,453.32 1994-12-06 00:00:00,453.11 1994-12-07 00:00:00,451.23 1994-12-08 00:00:00,445.45 1994-12-09 00:00:00,446.96 1994-12-12 00:00:00,449.47 1994-12-13 00:00:00,450.15 1994-12-14 00:00:00,454.97 1994-12-15 00:00:00,455.34 1994-12-16 00:00:00,458.8 1994-12-19 00:00:00,457.91 1994-12-20 00:00:00,457.1 1994-12-21 00:00:00,459.61 1994-12-22 00:00:00,459.68 1994-12-23 00:00:00,459.83 1994-12-27 00:00:00,462.47 1994-12-28 00:00:00,460.86 1994-12-29 00:00:00,461.17 1994-12-30 00:00:00,459.27 1995-01-03 00:00:00,459.11 1995-01-04 00:00:00,460.71 1995-01-05 00:00:00,460.34 1995-01-06 00:00:00,460.68 1995-01-09 00:00:00,460.83 1995-01-10 00:00:00,461.68 1995-01-11 00:00:00,461.66 1995-01-12 00:00:00,461.64 1995-01-13 00:00:00,465.97 1995-01-16 00:00:00,469.38 1995-01-17 00:00:00,470.05 1995-01-18 00:00:00,469.71 1995-01-19 00:00:00,466.95 1995-01-20 00:00:00,464.78 1995-01-23 00:00:00,465.82 1995-01-24 00:00:00,465.86 1995-01-25 00:00:00,467.44 1995-01-26 00:00:00,468.32 1995-01-27 00:00:00,470.39 1995-01-30 00:00:00,468.51 1995-01-31 00:00:00,470.42 1995-02-01 00:00:00,470.4 1995-02-02 00:00:00,472.79 1995-02-03 00:00:00,478.65 1995-02-06 00:00:00,481.14 1995-02-07 00:00:00,480.81 1995-02-08 00:00:00,481.19 1995-02-09 00:00:00,480.19 1995-02-10 00:00:00,481.46 1995-02-13 00:00:00,481.65 1995-02-14 00:00:00,482.55 1995-02-15 00:00:00,484.54 1995-02-16 00:00:00,485.22 1995-02-17 00:00:00,481.97 1995-02-21 00:00:00,482.72 1995-02-22 00:00:00,485.07 1995-02-23 00:00:00,486.91 1995-02-24 00:00:00,488.11 1995-02-27 00:00:00,483.81 1995-02-28 00:00:00,487.39 1995-03-01 00:00:00,485.65 1995-03-02 00:00:00,485.13 1995-03-03 00:00:00,485.42 1995-03-06 00:00:00,485.63 1995-03-07 00:00:00,482.12 1995-03-08 00:00:00,483.14 1995-03-09 00:00:00,483.16 1995-03-10 00:00:00,489.57 1995-03-13 00:00:00,490.05 1995-03-14 00:00:00,492.89 1995-03-15 00:00:00,491.88 1995-03-16 00:00:00,495.41 1995-03-17 00:00:00,495.52 1995-03-20 00:00:00,496.14 1995-03-21 00:00:00,495.07 1995-03-22 00:00:00,495.67 1995-03-23 00:00:00,495.95 1995-03-24 00:00:00,500.97 1995-03-27 00:00:00,503.2 1995-03-28 00:00:00,503.9 1995-03-29 00:00:00,503.12 1995-03-30 00:00:00,502.22 1995-03-31 00:00:00,500.71 1995-04-03 00:00:00,501.85 1995-04-04 00:00:00,505.24 1995-04-05 00:00:00,505.57 1995-04-06 00:00:00,506.08 1995-04-07 00:00:00,506.42 1995-04-10 00:00:00,507.01 1995-04-11 00:00:00,505.53 1995-04-12 00:00:00,507.17 1995-04-13 00:00:00,509.23 1995-04-17 00:00:00,506.13 1995-04-18 00:00:00,505.37 1995-04-19 00:00:00,504.92 1995-04-20 00:00:00,505.29 1995-04-21 00:00:00,508.49 1995-04-24 00:00:00,512.89 1995-04-25 00:00:00,512.1 1995-04-26 00:00:00,512.66 1995-04-27 00:00:00,513.55 1995-04-28 00:00:00,514.71 1995-05-01 00:00:00,514.26 1995-05-02 00:00:00,514.86 1995-05-03 00:00:00,520.48 1995-05-04 00:00:00,520.54 1995-05-05 00:00:00,520.12 1995-05-08 00:00:00,523.96 1995-05-09 00:00:00,523.56 1995-05-10 00:00:00,524.36 1995-05-11 00:00:00,524.37 1995-05-12 00:00:00,525.55 1995-05-15 00:00:00,527.74 1995-05-16 00:00:00,528.19 1995-05-17 00:00:00,527.07 1995-05-18 00:00:00,519.58 1995-05-19 00:00:00,519.19 1995-05-22 00:00:00,523.65 1995-05-23 00:00:00,528.59 1995-05-24 00:00:00,528.61 1995-05-25 00:00:00,528.59 1995-05-26 00:00:00,523.65 1995-05-30 00:00:00,523.58 1995-05-31 00:00:00,533.4 1995-06-01 00:00:00,533.49 1995-06-02 00:00:00,532.51 1995-06-05 00:00:00,535.6 1995-06-06 00:00:00,535.55 1995-06-07 00:00:00,533.13 1995-06-08 00:00:00,532.35 1995-06-09 00:00:00,527.94 1995-06-12 00:00:00,530.88 1995-06-13 00:00:00,536.05 1995-06-14 00:00:00,536.47 1995-06-15 00:00:00,537.12 1995-06-16 00:00:00,539.83 1995-06-19 00:00:00,545.22 1995-06-20 00:00:00,544.98 1995-06-21 00:00:00,543.98 1995-06-22 00:00:00,551.07 1995-06-23 00:00:00,549.71 1995-06-26 00:00:00,544.13 1995-06-27 00:00:00,542.43 1995-06-28 00:00:00,544.73 1995-06-29 00:00:00,543.87 1995-06-30 00:00:00,544.75 1995-07-03 00:00:00,547.09 1995-07-05 00:00:00,547.26 1995-07-06 00:00:00,553.99 1995-07-07 00:00:00,556.37 1995-07-10 00:00:00,557.19 1995-07-11 00:00:00,554.78 1995-07-12 00:00:00,560.89 1995-07-13 00:00:00,561.0 1995-07-14 00:00:00,559.89 1995-07-17 00:00:00,562.72 1995-07-18 00:00:00,558.46 1995-07-19 00:00:00,550.98 1995-07-20 00:00:00,553.54 1995-07-21 00:00:00,553.62 1995-07-24 00:00:00,556.63 1995-07-25 00:00:00,561.1 1995-07-26 00:00:00,561.61 1995-07-27 00:00:00,565.22 1995-07-28 00:00:00,562.93 1995-07-31 00:00:00,562.06 1995-08-01 00:00:00,559.64 1995-08-02 00:00:00,558.8 1995-08-03 00:00:00,558.75 1995-08-04 00:00:00,558.94 1995-08-07 00:00:00,560.03 1995-08-08 00:00:00,560.39 1995-08-09 00:00:00,559.71 1995-08-10 00:00:00,557.45 1995-08-11 00:00:00,555.11 1995-08-14 00:00:00,559.74 1995-08-15 00:00:00,558.57 1995-08-16 00:00:00,559.97 1995-08-17 00:00:00,559.04 1995-08-18 00:00:00,559.21 1995-08-21 00:00:00,558.11 1995-08-22 00:00:00,559.52 1995-08-23 00:00:00,557.14 1995-08-24 00:00:00,557.46 1995-08-25 00:00:00,560.1 1995-08-28 00:00:00,559.05 1995-08-29 00:00:00,560.0 1995-08-30 00:00:00,560.92 1995-08-31 00:00:00,561.88 1995-09-01 00:00:00,563.84 1995-09-05 00:00:00,569.17 1995-09-06 00:00:00,570.17 1995-09-07 00:00:00,570.29 1995-09-08 00:00:00,572.68 1995-09-11 00:00:00,573.91 1995-09-12 00:00:00,576.51 1995-09-13 00:00:00,578.77 1995-09-14 00:00:00,583.61 1995-09-15 00:00:00,583.35 1995-09-18 00:00:00,582.77 1995-09-19 00:00:00,584.2 1995-09-20 00:00:00,586.77 1995-09-21 00:00:00,583.0 1995-09-22 00:00:00,581.73 1995-09-25 00:00:00,581.81 1995-09-26 00:00:00,581.41 1995-09-27 00:00:00,581.04 1995-09-28 00:00:00,585.87 1995-09-29 00:00:00,584.41 1995-10-02 00:00:00,581.72 1995-10-03 00:00:00,582.34 1995-10-04 00:00:00,581.47 1995-10-05 00:00:00,582.63 1995-10-06 00:00:00,582.49 1995-10-09 00:00:00,578.37 1995-10-10 00:00:00,577.52 1995-10-11 00:00:00,579.46 1995-10-12 00:00:00,583.1 1995-10-13 00:00:00,584.5 1995-10-16 00:00:00,583.03 1995-10-17 00:00:00,586.78 1995-10-18 00:00:00,587.44 1995-10-19 00:00:00,590.65 1995-10-20 00:00:00,587.46 1995-10-23 00:00:00,585.06 1995-10-24 00:00:00,586.54 1995-10-25 00:00:00,582.47 1995-10-26 00:00:00,576.72 1995-10-27 00:00:00,579.7 1995-10-30 00:00:00,583.25 1995-10-31 00:00:00,581.5 1995-11-01 00:00:00,584.22 1995-11-02 00:00:00,589.72 1995-11-03 00:00:00,590.57 1995-11-06 00:00:00,588.46 1995-11-07 00:00:00,586.32 1995-11-08 00:00:00,591.71 1995-11-09 00:00:00,593.26 1995-11-10 00:00:00,592.72 1995-11-13 00:00:00,592.3 1995-11-14 00:00:00,589.29 1995-11-15 00:00:00,593.96 1995-11-16 00:00:00,597.34 1995-11-17 00:00:00,600.07 1995-11-20 00:00:00,596.85 1995-11-21 00:00:00,600.24 1995-11-22 00:00:00,598.4 1995-11-24 00:00:00,599.97 1995-11-27 00:00:00,601.32 1995-11-28 00:00:00,606.45 1995-11-29 00:00:00,607.64 1995-11-30 00:00:00,605.37 1995-12-01 00:00:00,606.98 1995-12-04 00:00:00,613.68 1995-12-05 00:00:00,617.68 1995-12-06 00:00:00,620.18 1995-12-07 00:00:00,616.17 1995-12-08 00:00:00,617.48 1995-12-11 00:00:00,619.52 1995-12-12 00:00:00,618.78 1995-12-13 00:00:00,621.69 1995-12-14 00:00:00,616.92 1995-12-15 00:00:00,616.34 1995-12-18 00:00:00,606.81 1995-12-19 00:00:00,611.93 1995-12-20 00:00:00,605.94 1995-12-21 00:00:00,610.49 1995-12-22 00:00:00,611.95 1995-12-26 00:00:00,614.3 1995-12-27 00:00:00,614.53 1995-12-28 00:00:00,614.12 1995-12-29 00:00:00,615.93 1996-01-02 00:00:00,620.73 1996-01-03 00:00:00,621.32 1996-01-04 00:00:00,617.7 1996-01-05 00:00:00,616.71 1996-01-08 00:00:00,618.46 1996-01-09 00:00:00,609.45 1996-01-10 00:00:00,598.48 1996-01-11 00:00:00,602.69 1996-01-12 00:00:00,601.81 1996-01-15 00:00:00,599.82 1996-01-16 00:00:00,608.44 1996-01-17 00:00:00,606.37 1996-01-18 00:00:00,608.24 1996-01-19 00:00:00,611.83 1996-01-22 00:00:00,613.4 1996-01-23 00:00:00,612.79 1996-01-24 00:00:00,619.96 1996-01-25 00:00:00,617.03 1996-01-26 00:00:00,621.62 1996-01-29 00:00:00,624.22 1996-01-30 00:00:00,630.15 1996-01-31 00:00:00,636.02 1996-02-01 00:00:00,638.46 1996-02-02 00:00:00,635.84 1996-02-05 00:00:00,641.43 1996-02-06 00:00:00,646.33 1996-02-07 00:00:00,649.93 1996-02-08 00:00:00,656.07 1996-02-09 00:00:00,656.37 1996-02-12 00:00:00,661.45 1996-02-13 00:00:00,660.51 1996-02-14 00:00:00,655.58 1996-02-15 00:00:00,651.32 1996-02-16 00:00:00,647.98 1996-02-20 00:00:00,640.65 1996-02-21 00:00:00,648.1 1996-02-22 00:00:00,658.86 1996-02-23 00:00:00,659.08 1996-02-26 00:00:00,650.46 1996-02-27 00:00:00,647.24 1996-02-28 00:00:00,644.75 1996-02-29 00:00:00,640.43 1996-03-01 00:00:00,644.37 1996-03-04 00:00:00,650.81 1996-03-05 00:00:00,655.79 1996-03-06 00:00:00,652.0 1996-03-07 00:00:00,653.65 1996-03-08 00:00:00,633.5 1996-03-11 00:00:00,640.02 1996-03-12 00:00:00,637.09 1996-03-13 00:00:00,638.55 1996-03-14 00:00:00,640.87 1996-03-15 00:00:00,641.43 1996-03-18 00:00:00,652.65 1996-03-19 00:00:00,651.69 1996-03-20 00:00:00,649.98 1996-03-21 00:00:00,649.19 1996-03-22 00:00:00,650.62 1996-03-25 00:00:00,650.04 1996-03-26 00:00:00,652.97 1996-03-27 00:00:00,648.91 1996-03-28 00:00:00,648.94 1996-03-29 00:00:00,645.5 1996-04-01 00:00:00,653.73 1996-04-02 00:00:00,655.26 1996-04-03 00:00:00,655.88 1996-04-04 00:00:00,655.86 1996-04-08 00:00:00,644.24 1996-04-09 00:00:00,642.19 1996-04-10 00:00:00,633.5 1996-04-11 00:00:00,631.18 1996-04-12 00:00:00,636.71 1996-04-15 00:00:00,642.49 1996-04-16 00:00:00,645.0 1996-04-17 00:00:00,641.61 1996-04-18 00:00:00,643.61 1996-04-19 00:00:00,645.07 1996-04-22 00:00:00,647.89 1996-04-23 00:00:00,651.58 1996-04-24 00:00:00,650.17 1996-04-25 00:00:00,652.87 1996-04-26 00:00:00,653.46 1996-04-29 00:00:00,654.16 1996-04-30 00:00:00,654.17 1996-05-01 00:00:00,654.58 1996-05-02 00:00:00,643.38 1996-05-03 00:00:00,641.63 1996-05-06 00:00:00,640.81 1996-05-07 00:00:00,638.26 1996-05-08 00:00:00,644.77 1996-05-09 00:00:00,645.44 1996-05-10 00:00:00,652.09 1996-05-13 00:00:00,661.51 1996-05-14 00:00:00,665.6 1996-05-15 00:00:00,665.42 1996-05-16 00:00:00,664.85 1996-05-17 00:00:00,668.91 1996-05-20 00:00:00,673.15 1996-05-21 00:00:00,672.76 1996-05-22 00:00:00,678.42 1996-05-23 00:00:00,676.0 1996-05-24 00:00:00,678.51 1996-05-28 00:00:00,672.23 1996-05-29 00:00:00,667.93 1996-05-30 00:00:00,671.7 1996-05-31 00:00:00,669.12 1996-06-03 00:00:00,667.68 1996-06-04 00:00:00,672.56 1996-06-05 00:00:00,678.44 1996-06-06 00:00:00,673.03 1996-06-07 00:00:00,673.31 1996-06-10 00:00:00,672.16 1996-06-11 00:00:00,670.97 1996-06-12 00:00:00,669.04 1996-06-13 00:00:00,667.92 1996-06-14 00:00:00,665.85 1996-06-17 00:00:00,665.16 1996-06-18 00:00:00,662.06 1996-06-19 00:00:00,661.96 1996-06-20 00:00:00,662.1 1996-06-21 00:00:00,666.84 1996-06-24 00:00:00,668.85 1996-06-25 00:00:00,668.48 1996-06-26 00:00:00,664.39 1996-06-27 00:00:00,668.55 1996-06-28 00:00:00,670.63 1996-07-01 00:00:00,675.88 1996-07-02 00:00:00,673.61 1996-07-03 00:00:00,672.4 1996-07-05 00:00:00,657.44 1996-07-08 00:00:00,652.54 1996-07-09 00:00:00,654.75 1996-07-10 00:00:00,656.06 1996-07-11 00:00:00,645.67 1996-07-12 00:00:00,646.19 1996-07-15 00:00:00,629.8 1996-07-16 00:00:00,628.37 1996-07-17 00:00:00,634.07 1996-07-18 00:00:00,643.56 1996-07-19 00:00:00,638.73 1996-07-22 00:00:00,633.77 1996-07-23 00:00:00,626.87 1996-07-24 00:00:00,626.65 1996-07-25 00:00:00,631.17 1996-07-26 00:00:00,635.9 1996-07-29 00:00:00,630.91 1996-07-30 00:00:00,635.26 1996-07-31 00:00:00,639.95 1996-08-01 00:00:00,650.02 1996-08-02 00:00:00,662.49 1996-08-05 00:00:00,660.23 1996-08-06 00:00:00,662.38 1996-08-07 00:00:00,664.16 1996-08-08 00:00:00,662.59 1996-08-09 00:00:00,662.1 1996-08-12 00:00:00,665.77 1996-08-13 00:00:00,660.2 1996-08-14 00:00:00,662.05 1996-08-15 00:00:00,662.28 1996-08-16 00:00:00,665.21 1996-08-19 00:00:00,666.58 1996-08-20 00:00:00,665.69 1996-08-21 00:00:00,665.07 1996-08-22 00:00:00,670.68 1996-08-23 00:00:00,667.03 1996-08-26 00:00:00,663.88 1996-08-27 00:00:00,666.4 1996-08-28 00:00:00,664.81 1996-08-29 00:00:00,657.4 1996-08-30 00:00:00,651.99 1996-09-03 00:00:00,654.72 1996-09-04 00:00:00,655.61 1996-09-05 00:00:00,649.44 1996-09-06 00:00:00,655.68 1996-09-09 00:00:00,663.76 1996-09-10 00:00:00,663.81 1996-09-11 00:00:00,667.28 1996-09-12 00:00:00,671.15 1996-09-13 00:00:00,680.54 1996-09-16 00:00:00,683.98 1996-09-17 00:00:00,682.94 1996-09-18 00:00:00,681.47 1996-09-19 00:00:00,683.0 1996-09-20 00:00:00,687.03 1996-09-23 00:00:00,686.48 1996-09-24 00:00:00,685.61 1996-09-25 00:00:00,685.83 1996-09-26 00:00:00,685.86 1996-09-27 00:00:00,686.19 1996-09-30 00:00:00,687.33 1996-10-01 00:00:00,689.08 1996-10-02 00:00:00,694.01 1996-10-03 00:00:00,692.78 1996-10-04 00:00:00,701.46 1996-10-07 00:00:00,703.34 1996-10-08 00:00:00,700.64 1996-10-09 00:00:00,696.74 1996-10-10 00:00:00,694.61 1996-10-11 00:00:00,700.66 1996-10-14 00:00:00,703.54 1996-10-15 00:00:00,702.57 1996-10-16 00:00:00,704.41 1996-10-17 00:00:00,706.99 1996-10-18 00:00:00,710.82 1996-10-21 00:00:00,709.85 1996-10-22 00:00:00,706.57 1996-10-23 00:00:00,707.27 1996-10-24 00:00:00,702.29 1996-10-25 00:00:00,700.92 1996-10-28 00:00:00,697.26 1996-10-29 00:00:00,701.5 1996-10-30 00:00:00,700.9 1996-10-31 00:00:00,705.27 1996-11-01 00:00:00,703.77 1996-11-04 00:00:00,706.73 1996-11-05 00:00:00,714.14 1996-11-06 00:00:00,724.59 1996-11-07 00:00:00,727.65 1996-11-08 00:00:00,730.82 1996-11-11 00:00:00,731.87 1996-11-12 00:00:00,729.56 1996-11-13 00:00:00,731.13 1996-11-14 00:00:00,735.88 1996-11-15 00:00:00,737.62 1996-11-18 00:00:00,737.02 1996-11-19 00:00:00,742.16 1996-11-20 00:00:00,743.95 1996-11-21 00:00:00,742.75 1996-11-22 00:00:00,748.73 1996-11-25 00:00:00,757.03 1996-11-26 00:00:00,755.96 1996-11-27 00:00:00,755.0 1996-11-29 00:00:00,757.02 1996-12-02 00:00:00,756.56 1996-12-03 00:00:00,748.28 1996-12-04 00:00:00,745.1 1996-12-05 00:00:00,744.38 1996-12-06 00:00:00,739.6 1996-12-09 00:00:00,749.76 1996-12-10 00:00:00,747.54 1996-12-11 00:00:00,740.73 1996-12-12 00:00:00,729.3 1996-12-13 00:00:00,728.64 1996-12-16 00:00:00,720.98 1996-12-17 00:00:00,726.04 1996-12-18 00:00:00,731.54 1996-12-19 00:00:00,745.76 1996-12-20 00:00:00,748.87 1996-12-23 00:00:00,746.92 1996-12-24 00:00:00,751.03 1996-12-26 00:00:00,755.82 1996-12-27 00:00:00,756.79 1996-12-30 00:00:00,753.85 1996-12-31 00:00:00,740.74 1997-01-02 00:00:00,737.01 1997-01-03 00:00:00,748.03 1997-01-06 00:00:00,747.65 1997-01-07 00:00:00,753.23 1997-01-08 00:00:00,748.41 1997-01-09 00:00:00,754.85 1997-01-10 00:00:00,759.5 1997-01-13 00:00:00,759.51 1997-01-14 00:00:00,768.86 1997-01-15 00:00:00,767.2 1997-01-16 00:00:00,769.75 1997-01-17 00:00:00,776.17 1997-01-20 00:00:00,776.7 1997-01-21 00:00:00,782.72 1997-01-22 00:00:00,786.23 1997-01-23 00:00:00,777.56 1997-01-24 00:00:00,770.52 1997-01-27 00:00:00,765.02 1997-01-28 00:00:00,765.02 1997-01-29 00:00:00,772.5 1997-01-30 00:00:00,784.17 1997-01-31 00:00:00,786.16 1997-02-03 00:00:00,786.73 1997-02-04 00:00:00,789.26 1997-02-05 00:00:00,778.28 1997-02-06 00:00:00,780.15 1997-02-07 00:00:00,789.56 1997-02-10 00:00:00,785.43 1997-02-11 00:00:00,789.59 1997-02-12 00:00:00,802.77 1997-02-13 00:00:00,811.82 1997-02-14 00:00:00,808.48 1997-02-18 00:00:00,816.29 1997-02-19 00:00:00,812.49 1997-02-20 00:00:00,802.8 1997-02-21 00:00:00,801.77 1997-02-24 00:00:00,810.28 1997-02-25 00:00:00,812.03 1997-02-26 00:00:00,805.68 1997-02-27 00:00:00,795.07 1997-02-28 00:00:00,790.82 1997-03-03 00:00:00,795.31 1997-03-04 00:00:00,790.95 1997-03-05 00:00:00,801.99 1997-03-06 00:00:00,798.56 1997-03-07 00:00:00,804.97 1997-03-10 00:00:00,813.65 1997-03-11 00:00:00,811.34 1997-03-12 00:00:00,804.26 1997-03-13 00:00:00,789.56 1997-03-14 00:00:00,793.17 1997-03-17 00:00:00,795.71 1997-03-18 00:00:00,789.66 1997-03-19 00:00:00,785.77 1997-03-20 00:00:00,782.65 1997-03-21 00:00:00,784.1 1997-03-24 00:00:00,790.89 1997-03-25 00:00:00,789.07 1997-03-26 00:00:00,790.5 1997-03-27 00:00:00,773.88 1997-03-31 00:00:00,757.12 1997-04-01 00:00:00,759.64 1997-04-02 00:00:00,750.11 1997-04-03 00:00:00,750.32 1997-04-04 00:00:00,757.9 1997-04-07 00:00:00,762.13 1997-04-08 00:00:00,766.12 1997-04-09 00:00:00,760.6 1997-04-10 00:00:00,758.34 1997-04-11 00:00:00,737.65 1997-04-14 00:00:00,743.73 1997-04-15 00:00:00,754.72 1997-04-16 00:00:00,763.53 1997-04-17 00:00:00,761.77 1997-04-18 00:00:00,766.34 1997-04-21 00:00:00,760.37 1997-04-22 00:00:00,774.61 1997-04-23 00:00:00,773.64 1997-04-24 00:00:00,771.18 1997-04-25 00:00:00,765.37 1997-04-28 00:00:00,772.96 1997-04-29 00:00:00,794.05 1997-04-30 00:00:00,801.34 1997-05-01 00:00:00,798.53 1997-05-02 00:00:00,812.97 1997-05-05 00:00:00,830.29 1997-05-06 00:00:00,827.76 1997-05-07 00:00:00,815.62 1997-05-08 00:00:00,820.26 1997-05-09 00:00:00,824.78 1997-05-12 00:00:00,837.66 1997-05-13 00:00:00,833.13 1997-05-14 00:00:00,836.04 1997-05-15 00:00:00,841.88 1997-05-16 00:00:00,829.75 1997-05-19 00:00:00,833.27 1997-05-20 00:00:00,841.66 1997-05-21 00:00:00,839.35 1997-05-22 00:00:00,835.66 1997-05-23 00:00:00,847.03 1997-05-27 00:00:00,849.71 1997-05-28 00:00:00,847.21 1997-05-29 00:00:00,844.08 1997-05-30 00:00:00,848.28 1997-06-02 00:00:00,846.36 1997-06-03 00:00:00,845.48 1997-06-04 00:00:00,840.11 1997-06-05 00:00:00,843.43 1997-06-06 00:00:00,858.01 1997-06-09 00:00:00,862.91 1997-06-10 00:00:00,865.27 1997-06-11 00:00:00,869.57 1997-06-12 00:00:00,883.46 1997-06-13 00:00:00,893.27 1997-06-16 00:00:00,893.9 1997-06-17 00:00:00,894.42 1997-06-18 00:00:00,889.06 1997-06-19 00:00:00,897.99 1997-06-20 00:00:00,898.7 1997-06-23 00:00:00,878.62 1997-06-24 00:00:00,896.34 1997-06-25 00:00:00,888.99 1997-06-26 00:00:00,883.68 1997-06-27 00:00:00,887.3 1997-06-30 00:00:00,885.14 1997-07-01 00:00:00,891.03 1997-07-02 00:00:00,904.03 1997-07-03 00:00:00,916.92 1997-07-07 00:00:00,912.2 1997-07-08 00:00:00,918.75 1997-07-09 00:00:00,907.54 1997-07-10 00:00:00,913.78 1997-07-11 00:00:00,916.68 1997-07-14 00:00:00,918.38 1997-07-15 00:00:00,925.76 1997-07-16 00:00:00,936.59 1997-07-17 00:00:00,931.61 1997-07-18 00:00:00,915.3 1997-07-21 00:00:00,912.94 1997-07-22 00:00:00,933.98 1997-07-23 00:00:00,936.56 1997-07-24 00:00:00,940.3 1997-07-25 00:00:00,938.79 1997-07-28 00:00:00,936.45 1997-07-29 00:00:00,942.29 1997-07-30 00:00:00,952.29 1997-07-31 00:00:00,954.31 1997-08-01 00:00:00,947.14 1997-08-04 00:00:00,950.3 1997-08-05 00:00:00,952.37 1997-08-06 00:00:00,960.32 1997-08-07 00:00:00,951.19 1997-08-08 00:00:00,933.54 1997-08-11 00:00:00,937.0 1997-08-12 00:00:00,926.53 1997-08-13 00:00:00,922.02 1997-08-14 00:00:00,924.77 1997-08-15 00:00:00,900.81 1997-08-18 00:00:00,912.49 1997-08-19 00:00:00,926.01 1997-08-20 00:00:00,939.35 1997-08-21 00:00:00,925.05 1997-08-22 00:00:00,923.54 1997-08-25 00:00:00,920.16 1997-08-26 00:00:00,913.02 1997-08-27 00:00:00,913.7 1997-08-28 00:00:00,903.67 1997-08-29 00:00:00,899.47 1997-09-02 00:00:00,927.58 1997-09-03 00:00:00,927.86 1997-09-04 00:00:00,930.87 1997-09-05 00:00:00,929.05 1997-09-08 00:00:00,931.2 1997-09-09 00:00:00,933.62 1997-09-10 00:00:00,919.03 1997-09-11 00:00:00,912.59 1997-09-12 00:00:00,923.91 1997-09-15 00:00:00,919.77 1997-09-16 00:00:00,945.64 1997-09-17 00:00:00,943.0 1997-09-18 00:00:00,947.29 1997-09-19 00:00:00,950.51 1997-09-22 00:00:00,955.43 1997-09-23 00:00:00,951.93 1997-09-24 00:00:00,944.48 1997-09-25 00:00:00,937.91 1997-09-26 00:00:00,945.22 1997-09-29 00:00:00,953.34 1997-09-30 00:00:00,947.28 1997-10-01 00:00:00,955.41 1997-10-02 00:00:00,960.46 1997-10-03 00:00:00,965.03 1997-10-06 00:00:00,972.69 1997-10-07 00:00:00,983.12 1997-10-08 00:00:00,973.84 1997-10-09 00:00:00,970.62 1997-10-10 00:00:00,966.98 1997-10-13 00:00:00,968.1 1997-10-14 00:00:00,970.28 1997-10-15 00:00:00,965.72 1997-10-16 00:00:00,955.25 1997-10-17 00:00:00,944.16 1997-10-20 00:00:00,955.61 1997-10-21 00:00:00,972.28 1997-10-22 00:00:00,968.49 1997-10-23 00:00:00,950.69 1997-10-24 00:00:00,941.64 1997-10-27 00:00:00,876.99 1997-10-28 00:00:00,921.85 1997-10-29 00:00:00,919.16 1997-10-30 00:00:00,903.68 1997-10-31 00:00:00,914.62 1997-11-03 00:00:00,938.99 1997-11-04 00:00:00,940.76 1997-11-05 00:00:00,942.76 1997-11-06 00:00:00,938.03 1997-11-07 00:00:00,927.51 1997-11-10 00:00:00,921.13 1997-11-11 00:00:00,923.78 1997-11-12 00:00:00,905.96 1997-11-13 00:00:00,916.66 1997-11-14 00:00:00,928.35 1997-11-17 00:00:00,946.2 1997-11-18 00:00:00,938.23 1997-11-19 00:00:00,944.59 1997-11-20 00:00:00,958.98 1997-11-21 00:00:00,963.09 1997-11-24 00:00:00,946.67 1997-11-25 00:00:00,950.82 1997-11-26 00:00:00,951.64 1997-11-28 00:00:00,955.4 1997-12-01 00:00:00,974.77 1997-12-02 00:00:00,971.68 1997-12-03 00:00:00,976.77 1997-12-04 00:00:00,973.1 1997-12-05 00:00:00,983.79 1997-12-08 00:00:00,982.37 1997-12-09 00:00:00,975.78 1997-12-10 00:00:00,969.79 1997-12-11 00:00:00,954.94 1997-12-12 00:00:00,953.39 1997-12-15 00:00:00,963.39 1997-12-16 00:00:00,968.04 1997-12-17 00:00:00,965.54 1997-12-18 00:00:00,955.3 1997-12-19 00:00:00,946.78 1997-12-22 00:00:00,953.7 1997-12-23 00:00:00,939.13 1997-12-24 00:00:00,932.7 1997-12-26 00:00:00,936.46 1997-12-29 00:00:00,953.35 1997-12-30 00:00:00,970.84 1997-12-31 00:00:00,970.43 1998-01-02 00:00:00,975.04 1998-01-05 00:00:00,977.07 1998-01-06 00:00:00,966.58 1998-01-07 00:00:00,964.0 1998-01-08 00:00:00,956.05 1998-01-09 00:00:00,927.69 1998-01-12 00:00:00,939.21 1998-01-13 00:00:00,952.12 1998-01-14 00:00:00,957.94 1998-01-15 00:00:00,950.73 1998-01-16 00:00:00,961.51 1998-01-20 00:00:00,978.6 1998-01-21 00:00:00,970.81 1998-01-22 00:00:00,963.04 1998-01-23 00:00:00,957.59 1998-01-26 00:00:00,956.95 1998-01-27 00:00:00,969.02 1998-01-28 00:00:00,977.46 1998-01-29 00:00:00,985.49 1998-01-30 00:00:00,980.28 1998-02-02 00:00:00,1001.27 1998-02-03 00:00:00,1006.0 1998-02-04 00:00:00,1006.9 1998-02-05 00:00:00,1003.54 1998-02-06 00:00:00,1012.46 1998-02-09 00:00:00,1010.74 1998-02-10 00:00:00,1019.01 1998-02-11 00:00:00,1020.01 1998-02-12 00:00:00,1024.14 1998-02-13 00:00:00,1020.09 1998-02-17 00:00:00,1022.76 1998-02-18 00:00:00,1032.08 1998-02-19 00:00:00,1028.28 1998-02-20 00:00:00,1034.21 1998-02-23 00:00:00,1038.14 1998-02-24 00:00:00,1030.56 1998-02-25 00:00:00,1042.9 1998-02-26 00:00:00,1048.67 1998-02-27 00:00:00,1049.34 1998-03-02 00:00:00,1047.7 1998-03-03 00:00:00,1052.02 1998-03-04 00:00:00,1047.33 1998-03-05 00:00:00,1035.05 1998-03-06 00:00:00,1055.69 1998-03-09 00:00:00,1052.31 1998-03-10 00:00:00,1064.25 1998-03-11 00:00:00,1068.47 1998-03-12 00:00:00,1069.92 1998-03-13 00:00:00,1068.61 1998-03-16 00:00:00,1079.27 1998-03-17 00:00:00,1080.45 1998-03-18 00:00:00,1085.52 1998-03-19 00:00:00,1089.74 1998-03-20 00:00:00,1099.16 1998-03-23 00:00:00,1095.55 1998-03-24 00:00:00,1105.65 1998-03-25 00:00:00,1101.93 1998-03-26 00:00:00,1100.8 1998-03-27 00:00:00,1095.44 1998-03-30 00:00:00,1093.6 1998-03-31 00:00:00,1101.75 1998-04-01 00:00:00,1108.15 1998-04-02 00:00:00,1120.01 1998-04-03 00:00:00,1122.7 1998-04-06 00:00:00,1121.38 1998-04-07 00:00:00,1109.55 1998-04-08 00:00:00,1101.65 1998-04-09 00:00:00,1110.67 1998-04-13 00:00:00,1109.69 1998-04-14 00:00:00,1115.75 1998-04-15 00:00:00,1119.32 1998-04-16 00:00:00,1108.17 1998-04-17 00:00:00,1122.72 1998-04-20 00:00:00,1123.65 1998-04-21 00:00:00,1126.67 1998-04-22 00:00:00,1130.54 1998-04-23 00:00:00,1119.58 1998-04-24 00:00:00,1107.9 1998-04-27 00:00:00,1086.54 1998-04-28 00:00:00,1085.11 1998-04-29 00:00:00,1094.62 1998-04-30 00:00:00,1111.75 1998-05-01 00:00:00,1121.0 1998-05-04 00:00:00,1122.07 1998-05-05 00:00:00,1115.5 1998-05-06 00:00:00,1104.92 1998-05-07 00:00:00,1095.14 1998-05-08 00:00:00,1108.14 1998-05-11 00:00:00,1106.64 1998-05-12 00:00:00,1115.79 1998-05-13 00:00:00,1118.86 1998-05-14 00:00:00,1117.37 1998-05-15 00:00:00,1108.73 1998-05-18 00:00:00,1105.82 1998-05-19 00:00:00,1109.52 1998-05-20 00:00:00,1119.06 1998-05-21 00:00:00,1114.64 1998-05-22 00:00:00,1110.47 1998-05-26 00:00:00,1094.02 1998-05-27 00:00:00,1092.23 1998-05-28 00:00:00,1097.6 1998-05-29 00:00:00,1090.82 1998-06-01 00:00:00,1090.98 1998-06-02 00:00:00,1093.22 1998-06-03 00:00:00,1082.73 1998-06-04 00:00:00,1094.83 1998-06-05 00:00:00,1113.86 1998-06-08 00:00:00,1115.72 1998-06-09 00:00:00,1118.41 1998-06-10 00:00:00,1112.28 1998-06-11 00:00:00,1094.58 1998-06-12 00:00:00,1098.84 1998-06-15 00:00:00,1077.01 1998-06-16 00:00:00,1087.59 1998-06-17 00:00:00,1107.11 1998-06-18 00:00:00,1106.37 1998-06-19 00:00:00,1100.65 1998-06-22 00:00:00,1103.21 1998-06-23 00:00:00,1119.49 1998-06-24 00:00:00,1132.88 1998-06-25 00:00:00,1129.28 1998-06-26 00:00:00,1133.2 1998-06-29 00:00:00,1138.49 1998-06-30 00:00:00,1133.84 1998-07-01 00:00:00,1148.56 1998-07-02 00:00:00,1146.42 1998-07-06 00:00:00,1157.33 1998-07-07 00:00:00,1154.66 1998-07-08 00:00:00,1166.38 1998-07-09 00:00:00,1158.56 1998-07-10 00:00:00,1164.33 1998-07-13 00:00:00,1165.19 1998-07-14 00:00:00,1177.58 1998-07-15 00:00:00,1174.81 1998-07-16 00:00:00,1183.99 1998-07-17 00:00:00,1186.75 1998-07-20 00:00:00,1184.1 1998-07-21 00:00:00,1165.07 1998-07-22 00:00:00,1164.08 1998-07-23 00:00:00,1139.75 1998-07-24 00:00:00,1140.8 1998-07-27 00:00:00,1147.27 1998-07-28 00:00:00,1130.24 1998-07-29 00:00:00,1125.21 1998-07-30 00:00:00,1142.95 1998-07-31 00:00:00,1120.67 1998-08-03 00:00:00,1112.44 1998-08-04 00:00:00,1072.12 1998-08-05 00:00:00,1081.43 1998-08-06 00:00:00,1089.63 1998-08-07 00:00:00,1089.45 1998-08-10 00:00:00,1083.14 1998-08-11 00:00:00,1068.98 1998-08-12 00:00:00,1084.22 1998-08-13 00:00:00,1074.91 1998-08-14 00:00:00,1062.75 1998-08-17 00:00:00,1083.67 1998-08-18 00:00:00,1101.2 1998-08-19 00:00:00,1098.06 1998-08-20 00:00:00,1091.6 1998-08-21 00:00:00,1081.24 1998-08-24 00:00:00,1088.14 1998-08-25 00:00:00,1092.85 1998-08-26 00:00:00,1084.19 1998-08-27 00:00:00,1042.59 1998-08-28 00:00:00,1027.14 1998-08-31 00:00:00,957.28 1998-09-01 00:00:00,994.26 1998-09-02 00:00:00,990.48 1998-09-03 00:00:00,982.26 1998-09-04 00:00:00,973.89 1998-09-08 00:00:00,1023.46 1998-09-09 00:00:00,1006.2 1998-09-10 00:00:00,980.19 1998-09-11 00:00:00,1009.06 1998-09-14 00:00:00,1029.72 1998-09-15 00:00:00,1037.68 1998-09-16 00:00:00,1045.48 1998-09-17 00:00:00,1018.87 1998-09-18 00:00:00,1020.09 1998-09-21 00:00:00,1023.89 1998-09-22 00:00:00,1029.63 1998-09-23 00:00:00,1066.09 1998-09-24 00:00:00,1042.72 1998-09-25 00:00:00,1044.75 1998-09-28 00:00:00,1048.69 1998-09-29 00:00:00,1049.02 1998-09-30 00:00:00,1017.01 1998-10-01 00:00:00,986.39 1998-10-02 00:00:00,1002.6 1998-10-05 00:00:00,988.56 1998-10-06 00:00:00,984.59 1998-10-07 00:00:00,970.68 1998-10-08 00:00:00,959.44 1998-10-09 00:00:00,984.39 1998-10-12 00:00:00,997.71 1998-10-13 00:00:00,994.8 1998-10-14 00:00:00,1005.53 1998-10-15 00:00:00,1047.49 1998-10-16 00:00:00,1056.42 1998-10-19 00:00:00,1062.39 1998-10-20 00:00:00,1063.93 1998-10-21 00:00:00,1069.92 1998-10-22 00:00:00,1078.48 1998-10-23 00:00:00,1070.67 1998-10-26 00:00:00,1072.32 1998-10-27 00:00:00,1065.34 1998-10-28 00:00:00,1068.09 1998-10-29 00:00:00,1085.93 1998-10-30 00:00:00,1098.67 1998-11-02 00:00:00,1111.6 1998-11-03 00:00:00,1110.84 1998-11-04 00:00:00,1118.67 1998-11-05 00:00:00,1133.85 1998-11-06 00:00:00,1141.01 1998-11-09 00:00:00,1130.2 1998-11-10 00:00:00,1128.26 1998-11-11 00:00:00,1120.97 1998-11-12 00:00:00,1117.69 1998-11-13 00:00:00,1125.72 1998-11-16 00:00:00,1135.87 1998-11-17 00:00:00,1139.32 1998-11-18 00:00:00,1144.48 1998-11-19 00:00:00,1152.61 1998-11-20 00:00:00,1163.55 1998-11-23 00:00:00,1188.21 1998-11-24 00:00:00,1182.99 1998-11-25 00:00:00,1186.87 1998-11-27 00:00:00,1192.33 1998-11-30 00:00:00,1163.63 1998-12-01 00:00:00,1175.28 1998-12-02 00:00:00,1171.25 1998-12-03 00:00:00,1150.14 1998-12-04 00:00:00,1176.74 1998-12-07 00:00:00,1187.7 1998-12-08 00:00:00,1181.38 1998-12-09 00:00:00,1183.49 1998-12-10 00:00:00,1165.02 1998-12-11 00:00:00,1166.46 1998-12-14 00:00:00,1141.2 1998-12-15 00:00:00,1162.83 1998-12-16 00:00:00,1161.94 1998-12-17 00:00:00,1179.98 1998-12-18 00:00:00,1188.03 1998-12-21 00:00:00,1202.84 1998-12-22 00:00:00,1203.57 1998-12-23 00:00:00,1228.54 1998-12-24 00:00:00,1226.27 1998-12-28 00:00:00,1225.49 1998-12-29 00:00:00,1241.81 1998-12-30 00:00:00,1231.93 1998-12-31 00:00:00,1229.23 1999-01-04 00:00:00,1228.1 1999-01-05 00:00:00,1244.78 1999-01-06 00:00:00,1272.34 1999-01-07 00:00:00,1269.73 1999-01-08 00:00:00,1275.09 1999-01-11 00:00:00,1263.88 1999-01-12 00:00:00,1239.51 1999-01-13 00:00:00,1234.4 1999-01-14 00:00:00,1212.19 1999-01-15 00:00:00,1243.26 1999-01-19 00:00:00,1252.0 1999-01-20 00:00:00,1256.62 1999-01-21 00:00:00,1235.16 1999-01-22 00:00:00,1225.19 1999-01-25 00:00:00,1233.98 1999-01-26 00:00:00,1252.31 1999-01-27 00:00:00,1243.17 1999-01-28 00:00:00,1265.37 1999-01-29 00:00:00,1279.64 1999-02-01 00:00:00,1273.0 1999-02-02 00:00:00,1261.99 1999-02-03 00:00:00,1272.07 1999-02-04 00:00:00,1248.49 1999-02-05 00:00:00,1239.4 1999-02-08 00:00:00,1243.77 1999-02-09 00:00:00,1216.14 1999-02-10 00:00:00,1223.55 1999-02-11 00:00:00,1254.04 1999-02-12 00:00:00,1230.13 1999-02-16 00:00:00,1241.87 1999-02-17 00:00:00,1224.03 1999-02-18 00:00:00,1237.28 1999-02-19 00:00:00,1239.22 1999-02-22 00:00:00,1272.14 1999-02-23 00:00:00,1271.18 1999-02-24 00:00:00,1253.41 1999-02-25 00:00:00,1245.02 1999-02-26 00:00:00,1238.33 1999-03-01 00:00:00,1236.16 1999-03-02 00:00:00,1225.5 1999-03-03 00:00:00,1227.7 1999-03-04 00:00:00,1246.64 1999-03-05 00:00:00,1275.47 1999-03-08 00:00:00,1282.73 1999-03-09 00:00:00,1279.84 1999-03-10 00:00:00,1286.84 1999-03-11 00:00:00,1297.68 1999-03-12 00:00:00,1294.59 1999-03-15 00:00:00,1307.26 1999-03-16 00:00:00,1306.38 1999-03-17 00:00:00,1297.82 1999-03-18 00:00:00,1316.55 1999-03-19 00:00:00,1299.29 1999-03-22 00:00:00,1297.01 1999-03-23 00:00:00,1262.14 1999-03-24 00:00:00,1268.59 1999-03-25 00:00:00,1289.99 1999-03-26 00:00:00,1282.8 1999-03-29 00:00:00,1310.17 1999-03-30 00:00:00,1300.75 1999-03-31 00:00:00,1286.37 1999-04-01 00:00:00,1293.72 1999-04-05 00:00:00,1321.12 1999-04-06 00:00:00,1317.89 1999-04-07 00:00:00,1326.89 1999-04-08 00:00:00,1343.98 1999-04-09 00:00:00,1348.35 1999-04-12 00:00:00,1358.63 1999-04-13 00:00:00,1349.82 1999-04-14 00:00:00,1328.44 1999-04-15 00:00:00,1322.85 1999-04-16 00:00:00,1319.0 1999-04-19 00:00:00,1289.48 1999-04-20 00:00:00,1306.17 1999-04-21 00:00:00,1336.12 1999-04-22 00:00:00,1358.82 1999-04-23 00:00:00,1356.85 1999-04-26 00:00:00,1360.04 1999-04-27 00:00:00,1362.8 1999-04-28 00:00:00,1350.91 1999-04-29 00:00:00,1342.83 1999-04-30 00:00:00,1335.18 1999-05-03 00:00:00,1354.63 1999-05-04 00:00:00,1332.0 1999-05-05 00:00:00,1347.31 1999-05-06 00:00:00,1332.05 1999-05-07 00:00:00,1345.0 1999-05-10 00:00:00,1340.3 1999-05-11 00:00:00,1355.61 1999-05-12 00:00:00,1364.0 1999-05-13 00:00:00,1367.56 1999-05-14 00:00:00,1337.8 1999-05-17 00:00:00,1339.49 1999-05-18 00:00:00,1333.32 1999-05-19 00:00:00,1344.23 1999-05-20 00:00:00,1338.83 1999-05-21 00:00:00,1330.29 1999-05-24 00:00:00,1306.65 1999-05-25 00:00:00,1284.4 1999-05-26 00:00:00,1304.76 1999-05-27 00:00:00,1281.41 1999-05-28 00:00:00,1301.84 1999-06-01 00:00:00,1294.26 1999-06-02 00:00:00,1294.81 1999-06-03 00:00:00,1299.54 1999-06-04 00:00:00,1327.75 1999-06-07 00:00:00,1334.52 1999-06-08 00:00:00,1317.33 1999-06-09 00:00:00,1318.64 1999-06-10 00:00:00,1302.82 1999-06-11 00:00:00,1293.64 1999-06-14 00:00:00,1294.0 1999-06-15 00:00:00,1301.16 1999-06-16 00:00:00,1330.41 1999-06-17 00:00:00,1339.9 1999-06-18 00:00:00,1342.84 1999-06-21 00:00:00,1349.0 1999-06-22 00:00:00,1335.88 1999-06-23 00:00:00,1333.06 1999-06-24 00:00:00,1315.78 1999-06-25 00:00:00,1315.31 1999-06-28 00:00:00,1331.35 1999-06-29 00:00:00,1351.45 1999-06-30 00:00:00,1372.71 1999-07-01 00:00:00,1380.96 1999-07-02 00:00:00,1391.22 1999-07-06 00:00:00,1388.12 1999-07-07 00:00:00,1395.86 1999-07-08 00:00:00,1394.42 1999-07-09 00:00:00,1403.28 1999-07-12 00:00:00,1399.1 1999-07-13 00:00:00,1393.56 1999-07-14 00:00:00,1398.17 1999-07-15 00:00:00,1409.62 1999-07-16 00:00:00,1418.78 1999-07-19 00:00:00,1407.65 1999-07-20 00:00:00,1377.1 1999-07-21 00:00:00,1379.29 1999-07-22 00:00:00,1360.97 1999-07-23 00:00:00,1356.94 1999-07-26 00:00:00,1347.76 1999-07-27 00:00:00,1362.84 1999-07-28 00:00:00,1365.4 1999-07-29 00:00:00,1341.03 1999-07-30 00:00:00,1328.72 1999-08-02 00:00:00,1328.05 1999-08-03 00:00:00,1322.18 1999-08-04 00:00:00,1305.33 1999-08-05 00:00:00,1313.71 1999-08-06 00:00:00,1300.29 1999-08-09 00:00:00,1297.8 1999-08-10 00:00:00,1281.43 1999-08-11 00:00:00,1301.93 1999-08-12 00:00:00,1298.16 1999-08-13 00:00:00,1327.68 1999-08-16 00:00:00,1330.77 1999-08-17 00:00:00,1344.16 1999-08-18 00:00:00,1332.84 1999-08-19 00:00:00,1323.59 1999-08-20 00:00:00,1336.61 1999-08-23 00:00:00,1360.22 1999-08-24 00:00:00,1363.5 1999-08-25 00:00:00,1381.79 1999-08-26 00:00:00,1362.01 1999-08-27 00:00:00,1348.27 1999-08-30 00:00:00,1324.02 1999-08-31 00:00:00,1320.41 1999-09-01 00:00:00,1331.07 1999-09-02 00:00:00,1319.11 1999-09-03 00:00:00,1357.24 1999-09-07 00:00:00,1350.45 1999-09-08 00:00:00,1344.15 1999-09-09 00:00:00,1347.66 1999-09-10 00:00:00,1351.66 1999-09-13 00:00:00,1344.13 1999-09-14 00:00:00,1336.29 1999-09-15 00:00:00,1317.97 1999-09-16 00:00:00,1318.48 1999-09-17 00:00:00,1335.42 1999-09-20 00:00:00,1335.53 1999-09-21 00:00:00,1307.58 1999-09-22 00:00:00,1310.51 1999-09-23 00:00:00,1280.41 1999-09-24 00:00:00,1277.36 1999-09-27 00:00:00,1283.31 1999-09-28 00:00:00,1282.2 1999-09-29 00:00:00,1268.37 1999-09-30 00:00:00,1282.71 1999-10-01 00:00:00,1282.81 1999-10-04 00:00:00,1304.6 1999-10-05 00:00:00,1301.35 1999-10-06 00:00:00,1325.4 1999-10-07 00:00:00,1317.64 1999-10-08 00:00:00,1336.02 1999-10-11 00:00:00,1335.21 1999-10-12 00:00:00,1313.04 1999-10-13 00:00:00,1285.55 1999-10-14 00:00:00,1283.42 1999-10-15 00:00:00,1247.41 1999-10-18 00:00:00,1254.13 1999-10-19 00:00:00,1261.32 1999-10-20 00:00:00,1289.43 1999-10-21 00:00:00,1283.61 1999-10-22 00:00:00,1301.65 1999-10-25 00:00:00,1293.63 1999-10-26 00:00:00,1281.91 1999-10-27 00:00:00,1296.71 1999-10-28 00:00:00,1342.44 1999-10-29 00:00:00,1362.93 1999-11-01 00:00:00,1354.12 1999-11-02 00:00:00,1347.74 1999-11-03 00:00:00,1354.93 1999-11-04 00:00:00,1362.64 1999-11-05 00:00:00,1370.23 1999-11-08 00:00:00,1377.01 1999-11-09 00:00:00,1365.28 1999-11-10 00:00:00,1373.46 1999-11-11 00:00:00,1381.46 1999-11-12 00:00:00,1396.06 1999-11-15 00:00:00,1394.39 1999-11-16 00:00:00,1420.07 1999-11-17 00:00:00,1410.71 1999-11-18 00:00:00,1424.94 1999-11-19 00:00:00,1422.0 1999-11-22 00:00:00,1420.94 1999-11-23 00:00:00,1404.64 1999-11-24 00:00:00,1417.08 1999-11-26 00:00:00,1416.62 1999-11-29 00:00:00,1407.83 1999-11-30 00:00:00,1388.91 1999-12-01 00:00:00,1397.72 1999-12-02 00:00:00,1409.04 1999-12-03 00:00:00,1433.3 1999-12-06 00:00:00,1423.33 1999-12-07 00:00:00,1409.17 1999-12-08 00:00:00,1403.88 1999-12-09 00:00:00,1408.11 1999-12-10 00:00:00,1417.04 1999-12-13 00:00:00,1415.22 1999-12-14 00:00:00,1403.17 1999-12-15 00:00:00,1413.33 1999-12-16 00:00:00,1418.78 1999-12-17 00:00:00,1421.03 1999-12-20 00:00:00,1418.09 1999-12-21 00:00:00,1433.43 1999-12-22 00:00:00,1436.13 1999-12-23 00:00:00,1458.34 1999-12-27 00:00:00,1457.1 1999-12-28 00:00:00,1457.66 1999-12-29 00:00:00,1463.46 1999-12-30 00:00:00,1464.47 1999-12-31 00:00:00,1469.25 2000-01-03 00:00:00,1455.22 2000-01-04 00:00:00,1399.42 2000-01-05 00:00:00,1402.11 2000-01-06 00:00:00,1403.45 2000-01-07 00:00:00,1441.47 2000-01-10 00:00:00,1457.6 2000-01-11 00:00:00,1438.56 2000-01-12 00:00:00,1432.25 2000-01-13 00:00:00,1449.68 2000-01-14 00:00:00,1465.15 2000-01-18 00:00:00,1455.14 2000-01-19 00:00:00,1455.9 2000-01-20 00:00:00,1445.57 2000-01-21 00:00:00,1441.36 2000-01-24 00:00:00,1401.53 2000-01-25 00:00:00,1410.03 2000-01-26 00:00:00,1404.09 2000-01-27 00:00:00,1398.56 2000-01-28 00:00:00,1360.16 2000-01-31 00:00:00,1394.46 2000-02-01 00:00:00,1409.28 2000-02-02 00:00:00,1409.12 2000-02-03 00:00:00,1424.97 2000-02-04 00:00:00,1424.37 2000-02-07 00:00:00,1424.24 2000-02-08 00:00:00,1441.72 2000-02-09 00:00:00,1411.71 2000-02-10 00:00:00,1416.83 2000-02-11 00:00:00,1387.12 2000-02-14 00:00:00,1389.94 2000-02-15 00:00:00,1402.05 2000-02-16 00:00:00,1387.67 2000-02-17 00:00:00,1388.26 2000-02-18 00:00:00,1346.09 2000-02-22 00:00:00,1352.17 2000-02-23 00:00:00,1360.69 2000-02-24 00:00:00,1353.43 2000-02-25 00:00:00,1333.36 2000-02-28 00:00:00,1348.05 2000-02-29 00:00:00,1366.42 2000-03-01 00:00:00,1379.19 2000-03-02 00:00:00,1381.76 2000-03-03 00:00:00,1409.17 2000-03-06 00:00:00,1391.28 2000-03-07 00:00:00,1355.62 2000-03-08 00:00:00,1366.7 2000-03-09 00:00:00,1401.69 2000-03-10 00:00:00,1395.07 2000-03-13 00:00:00,1383.62 2000-03-14 00:00:00,1359.15 2000-03-15 00:00:00,1392.14 2000-03-16 00:00:00,1458.47 2000-03-17 00:00:00,1464.47 2000-03-20 00:00:00,1456.63 2000-03-21 00:00:00,1493.87 2000-03-22 00:00:00,1500.64 2000-03-23 00:00:00,1527.35 2000-03-24 00:00:00,1527.46 2000-03-27 00:00:00,1523.86 2000-03-28 00:00:00,1507.73 2000-03-29 00:00:00,1508.52 2000-03-30 00:00:00,1487.92 2000-03-31 00:00:00,1498.58 2000-04-03 00:00:00,1505.97 2000-04-04 00:00:00,1494.73 2000-04-05 00:00:00,1487.37 2000-04-06 00:00:00,1501.34 2000-04-07 00:00:00,1516.35 2000-04-10 00:00:00,1504.46 2000-04-11 00:00:00,1500.59 2000-04-12 00:00:00,1467.17 2000-04-13 00:00:00,1440.51 2000-04-14 00:00:00,1356.56 2000-04-17 00:00:00,1401.44 2000-04-18 00:00:00,1441.61 2000-04-19 00:00:00,1427.47 2000-04-20 00:00:00,1434.54 2000-04-24 00:00:00,1429.86 2000-04-25 00:00:00,1477.44 2000-04-26 00:00:00,1460.99 2000-04-27 00:00:00,1464.92 2000-04-28 00:00:00,1452.43 2000-05-01 00:00:00,1468.25 2000-05-02 00:00:00,1446.29 2000-05-03 00:00:00,1415.1 2000-05-04 00:00:00,1409.57 2000-05-05 00:00:00,1432.63 2000-05-08 00:00:00,1424.17 2000-05-09 00:00:00,1412.14 2000-05-10 00:00:00,1383.05 2000-05-11 00:00:00,1407.81 2000-05-12 00:00:00,1420.96 2000-05-15 00:00:00,1452.36 2000-05-16 00:00:00,1466.04 2000-05-17 00:00:00,1447.8 2000-05-18 00:00:00,1437.21 2000-05-19 00:00:00,1406.95 2000-05-22 00:00:00,1400.72 2000-05-23 00:00:00,1373.86 2000-05-24 00:00:00,1399.05 2000-05-25 00:00:00,1381.52 2000-05-26 00:00:00,1378.02 2000-05-30 00:00:00,1422.45 2000-05-31 00:00:00,1420.6 2000-06-01 00:00:00,1448.81 2000-06-02 00:00:00,1477.26 2000-06-05 00:00:00,1467.63 2000-06-06 00:00:00,1457.84 2000-06-07 00:00:00,1471.36 2000-06-08 00:00:00,1461.67 2000-06-09 00:00:00,1456.95 2000-06-12 00:00:00,1446.0 2000-06-13 00:00:00,1469.44 2000-06-14 00:00:00,1470.54 2000-06-15 00:00:00,1478.73 2000-06-16 00:00:00,1464.46 2000-06-19 00:00:00,1486.0 2000-06-20 00:00:00,1475.95 2000-06-21 00:00:00,1479.13 2000-06-22 00:00:00,1452.18 2000-06-23 00:00:00,1441.48 2000-06-26 00:00:00,1455.31 2000-06-27 00:00:00,1450.55 2000-06-28 00:00:00,1454.82 2000-06-29 00:00:00,1442.39 2000-06-30 00:00:00,1454.6 2000-07-03 00:00:00,1469.54 2000-07-05 00:00:00,1446.23 2000-07-06 00:00:00,1456.67 2000-07-07 00:00:00,1478.9 2000-07-10 00:00:00,1475.62 2000-07-11 00:00:00,1480.88 2000-07-12 00:00:00,1492.92 2000-07-13 00:00:00,1495.84 2000-07-14 00:00:00,1509.98 2000-07-17 00:00:00,1510.49 2000-07-18 00:00:00,1493.74 2000-07-19 00:00:00,1481.96 2000-07-20 00:00:00,1495.57 2000-07-21 00:00:00,1480.19 2000-07-24 00:00:00,1464.29 2000-07-25 00:00:00,1474.47 2000-07-26 00:00:00,1452.42 2000-07-27 00:00:00,1449.62 2000-07-28 00:00:00,1419.89 2000-07-31 00:00:00,1430.83 2000-08-01 00:00:00,1438.1 2000-08-02 00:00:00,1438.7 2000-08-03 00:00:00,1452.56 2000-08-04 00:00:00,1462.93 2000-08-07 00:00:00,1479.32 2000-08-08 00:00:00,1482.8 2000-08-09 00:00:00,1472.87 2000-08-10 00:00:00,1460.25 2000-08-11 00:00:00,1471.84 2000-08-14 00:00:00,1491.56 2000-08-15 00:00:00,1484.43 2000-08-16 00:00:00,1479.85 2000-08-17 00:00:00,1496.07 2000-08-18 00:00:00,1491.72 2000-08-21 00:00:00,1499.48 2000-08-22 00:00:00,1498.13 2000-08-23 00:00:00,1505.97 2000-08-24 00:00:00,1508.31 2000-08-25 00:00:00,1506.45 2000-08-28 00:00:00,1514.09 2000-08-29 00:00:00,1509.84 2000-08-30 00:00:00,1502.59 2000-08-31 00:00:00,1517.68 2000-09-01 00:00:00,1520.77 2000-09-05 00:00:00,1507.08 2000-09-06 00:00:00,1492.25 2000-09-07 00:00:00,1502.51 2000-09-08 00:00:00,1494.5 2000-09-11 00:00:00,1489.26 2000-09-12 00:00:00,1481.99 2000-09-13 00:00:00,1484.91 2000-09-14 00:00:00,1480.87 2000-09-15 00:00:00,1465.81 2000-09-18 00:00:00,1444.51 2000-09-19 00:00:00,1459.9 2000-09-20 00:00:00,1451.34 2000-09-21 00:00:00,1449.05 2000-09-22 00:00:00,1448.72 2000-09-25 00:00:00,1439.03 2000-09-26 00:00:00,1427.21 2000-09-27 00:00:00,1426.57 2000-09-28 00:00:00,1458.29 2000-09-29 00:00:00,1436.51 2000-10-02 00:00:00,1436.23 2000-10-03 00:00:00,1426.46 2000-10-04 00:00:00,1434.32 2000-10-05 00:00:00,1436.28 2000-10-06 00:00:00,1408.99 2000-10-09 00:00:00,1402.03 2000-10-10 00:00:00,1387.02 2000-10-11 00:00:00,1364.59 2000-10-12 00:00:00,1329.78 2000-10-13 00:00:00,1374.17 2000-10-16 00:00:00,1374.62 2000-10-17 00:00:00,1349.97 2000-10-18 00:00:00,1342.13 2000-10-19 00:00:00,1388.76 2000-10-20 00:00:00,1396.93 2000-10-23 00:00:00,1395.78 2000-10-24 00:00:00,1398.13 2000-10-25 00:00:00,1364.9 2000-10-26 00:00:00,1364.44 2000-10-27 00:00:00,1379.58 2000-10-30 00:00:00,1398.66 2000-10-31 00:00:00,1429.4 2000-11-01 00:00:00,1421.22 2000-11-02 00:00:00,1428.32 2000-11-03 00:00:00,1426.69 2000-11-06 00:00:00,1432.19 2000-11-07 00:00:00,1431.87 2000-11-08 00:00:00,1409.28 2000-11-09 00:00:00,1400.14 2000-11-10 00:00:00,1365.98 2000-11-13 00:00:00,1351.26 2000-11-14 00:00:00,1382.95 2000-11-15 00:00:00,1389.81 2000-11-16 00:00:00,1372.32 2000-11-17 00:00:00,1367.72 2000-11-20 00:00:00,1342.62 2000-11-21 00:00:00,1347.35 2000-11-22 00:00:00,1322.36 2000-11-24 00:00:00,1341.77 2000-11-27 00:00:00,1348.97 2000-11-28 00:00:00,1336.09 2000-11-29 00:00:00,1341.93 2000-11-30 00:00:00,1314.95 2000-12-01 00:00:00,1315.23 2000-12-04 00:00:00,1324.97 2000-12-05 00:00:00,1376.54 2000-12-06 00:00:00,1351.46 2000-12-07 00:00:00,1343.55 2000-12-08 00:00:00,1369.89 2000-12-11 00:00:00,1380.2 2000-12-12 00:00:00,1371.18 2000-12-13 00:00:00,1359.99 2000-12-14 00:00:00,1340.93 2000-12-15 00:00:00,1312.15 2000-12-18 00:00:00,1322.74 2000-12-19 00:00:00,1305.6 2000-12-20 00:00:00,1264.74 2000-12-21 00:00:00,1274.86 2000-12-22 00:00:00,1305.95 2000-12-26 00:00:00,1315.19 2000-12-27 00:00:00,1328.92 2000-12-28 00:00:00,1334.22 2000-12-29 00:00:00,1320.28 2001-01-02 00:00:00,1283.27 2001-01-03 00:00:00,1347.56 2001-01-04 00:00:00,1333.34 2001-01-05 00:00:00,1298.35 2001-01-08 00:00:00,1295.86 2001-01-09 00:00:00,1300.8 2001-01-10 00:00:00,1313.27 2001-01-11 00:00:00,1326.82 2001-01-12 00:00:00,1318.55 2001-01-16 00:00:00,1326.65 2001-01-17 00:00:00,1329.47 2001-01-18 00:00:00,1347.97 2001-01-19 00:00:00,1342.54 2001-01-22 00:00:00,1342.9 2001-01-23 00:00:00,1360.4 2001-01-24 00:00:00,1364.3 2001-01-25 00:00:00,1357.51 2001-01-26 00:00:00,1354.95 2001-01-29 00:00:00,1364.17 2001-01-30 00:00:00,1373.73 2001-01-31 00:00:00,1366.01 2001-02-01 00:00:00,1373.47 2001-02-02 00:00:00,1349.47 2001-02-05 00:00:00,1354.31 2001-02-06 00:00:00,1352.26 2001-02-07 00:00:00,1340.89 2001-02-08 00:00:00,1332.53 2001-02-09 00:00:00,1314.76 2001-02-12 00:00:00,1330.31 2001-02-13 00:00:00,1318.8 2001-02-14 00:00:00,1315.92 2001-02-15 00:00:00,1326.61 2001-02-16 00:00:00,1301.53 2001-02-20 00:00:00,1278.94 2001-02-21 00:00:00,1255.27 2001-02-22 00:00:00,1252.82 2001-02-23 00:00:00,1245.86 2001-02-26 00:00:00,1267.65 2001-02-27 00:00:00,1257.94 2001-02-28 00:00:00,1239.94 2001-03-01 00:00:00,1241.23 2001-03-02 00:00:00,1234.18 2001-03-05 00:00:00,1241.41 2001-03-06 00:00:00,1253.8 2001-03-07 00:00:00,1261.89 2001-03-08 00:00:00,1264.74 2001-03-09 00:00:00,1233.42 2001-03-12 00:00:00,1180.16 2001-03-13 00:00:00,1197.66 2001-03-14 00:00:00,1166.71 2001-03-15 00:00:00,1173.56 2001-03-16 00:00:00,1150.53 2001-03-19 00:00:00,1170.81 2001-03-20 00:00:00,1142.62 2001-03-21 00:00:00,1122.14 2001-03-22 00:00:00,1117.58 2001-03-23 00:00:00,1139.83 2001-03-26 00:00:00,1152.69 2001-03-27 00:00:00,1182.17 2001-03-28 00:00:00,1153.29 2001-03-29 00:00:00,1147.95 2001-03-30 00:00:00,1160.33 2001-04-02 00:00:00,1145.87 2001-04-03 00:00:00,1106.46 2001-04-04 00:00:00,1103.25 2001-04-05 00:00:00,1151.44 2001-04-06 00:00:00,1128.43 2001-04-09 00:00:00,1137.59 2001-04-10 00:00:00,1168.38 2001-04-11 00:00:00,1165.89 2001-04-12 00:00:00,1183.5 2001-04-16 00:00:00,1179.68 2001-04-17 00:00:00,1191.81 2001-04-18 00:00:00,1238.16 2001-04-19 00:00:00,1253.69 2001-04-20 00:00:00,1242.98 2001-04-23 00:00:00,1224.36 2001-04-24 00:00:00,1209.47 2001-04-25 00:00:00,1228.75 2001-04-26 00:00:00,1234.52 2001-04-27 00:00:00,1253.05 2001-04-30 00:00:00,1249.46 2001-05-01 00:00:00,1266.44 2001-05-02 00:00:00,1267.43 2001-05-03 00:00:00,1248.58 2001-05-04 00:00:00,1266.61 2001-05-07 00:00:00,1263.51 2001-05-08 00:00:00,1261.2 2001-05-09 00:00:00,1255.54 2001-05-10 00:00:00,1255.18 2001-05-11 00:00:00,1245.67 2001-05-14 00:00:00,1248.92 2001-05-15 00:00:00,1249.44 2001-05-16 00:00:00,1284.99 2001-05-17 00:00:00,1288.49 2001-05-18 00:00:00,1291.96 2001-05-21 00:00:00,1312.83 2001-05-22 00:00:00,1309.38 2001-05-23 00:00:00,1289.05 2001-05-24 00:00:00,1293.17 2001-05-25 00:00:00,1277.89 2001-05-29 00:00:00,1267.93 2001-05-30 00:00:00,1248.08 2001-05-31 00:00:00,1255.82 2001-06-01 00:00:00,1260.67 2001-06-04 00:00:00,1267.11 2001-06-05 00:00:00,1283.57 2001-06-06 00:00:00,1270.03 2001-06-07 00:00:00,1276.96 2001-06-08 00:00:00,1264.96 2001-06-11 00:00:00,1254.39 2001-06-12 00:00:00,1255.85 2001-06-13 00:00:00,1241.6 2001-06-14 00:00:00,1219.87 2001-06-15 00:00:00,1214.36 2001-06-18 00:00:00,1208.43 2001-06-19 00:00:00,1212.58 2001-06-20 00:00:00,1223.14 2001-06-21 00:00:00,1237.04 2001-06-22 00:00:00,1225.35 2001-06-25 00:00:00,1218.6 2001-06-26 00:00:00,1216.76 2001-06-27 00:00:00,1211.07 2001-06-28 00:00:00,1226.2 2001-06-29 00:00:00,1224.38 2001-07-02 00:00:00,1236.72 2001-07-03 00:00:00,1234.45 2001-07-05 00:00:00,1219.24 2001-07-06 00:00:00,1190.59 2001-07-09 00:00:00,1198.78 2001-07-10 00:00:00,1181.52 2001-07-11 00:00:00,1180.18 2001-07-12 00:00:00,1208.14 2001-07-13 00:00:00,1215.68 2001-07-16 00:00:00,1202.45 2001-07-17 00:00:00,1214.44 2001-07-18 00:00:00,1207.71 2001-07-19 00:00:00,1215.02 2001-07-20 00:00:00,1210.85 2001-07-23 00:00:00,1191.03 2001-07-24 00:00:00,1171.65 2001-07-25 00:00:00,1190.49 2001-07-26 00:00:00,1202.93 2001-07-27 00:00:00,1205.82 2001-07-30 00:00:00,1204.52 2001-07-31 00:00:00,1211.23 2001-08-01 00:00:00,1215.93 2001-08-02 00:00:00,1220.75 2001-08-03 00:00:00,1214.35 2001-08-06 00:00:00,1200.48 2001-08-07 00:00:00,1204.4 2001-08-08 00:00:00,1183.53 2001-08-09 00:00:00,1183.43 2001-08-10 00:00:00,1190.16 2001-08-13 00:00:00,1191.29 2001-08-14 00:00:00,1186.73 2001-08-15 00:00:00,1178.02 2001-08-16 00:00:00,1181.66 2001-08-17 00:00:00,1161.97 2001-08-20 00:00:00,1171.41 2001-08-21 00:00:00,1157.26 2001-08-22 00:00:00,1165.31 2001-08-23 00:00:00,1162.09 2001-08-24 00:00:00,1184.93 2001-08-27 00:00:00,1179.21 2001-08-28 00:00:00,1161.51 2001-08-29 00:00:00,1148.56 2001-08-30 00:00:00,1129.03 2001-08-31 00:00:00,1133.58 2001-09-04 00:00:00,1132.94 2001-09-05 00:00:00,1131.74 2001-09-06 00:00:00,1106.4 2001-09-07 00:00:00,1085.78 2001-09-10 00:00:00,1092.54 2001-09-17 00:00:00,1038.77 2001-09-18 00:00:00,1032.74 2001-09-19 00:00:00,1016.1 2001-09-20 00:00:00,984.54 2001-09-21 00:00:00,965.8 2001-09-24 00:00:00,1003.45 2001-09-25 00:00:00,1012.27 2001-09-26 00:00:00,1007.04 2001-09-27 00:00:00,1018.61 2001-09-28 00:00:00,1040.94 2001-10-01 00:00:00,1038.55 2001-10-02 00:00:00,1051.33 2001-10-03 00:00:00,1072.28 2001-10-04 00:00:00,1069.63 2001-10-05 00:00:00,1071.38 2001-10-08 00:00:00,1062.44 2001-10-09 00:00:00,1056.75 2001-10-10 00:00:00,1080.99 2001-10-11 00:00:00,1097.43 2001-10-12 00:00:00,1091.65 2001-10-15 00:00:00,1089.98 2001-10-16 00:00:00,1097.54 2001-10-17 00:00:00,1077.09 2001-10-18 00:00:00,1068.61 2001-10-19 00:00:00,1073.48 2001-10-22 00:00:00,1089.9 2001-10-23 00:00:00,1084.78 2001-10-24 00:00:00,1085.2 2001-10-25 00:00:00,1100.09 2001-10-26 00:00:00,1104.61 2001-10-29 00:00:00,1078.3 2001-10-30 00:00:00,1059.79 2001-10-31 00:00:00,1059.78 2001-11-01 00:00:00,1084.1 2001-11-02 00:00:00,1087.2 2001-11-05 00:00:00,1102.84 2001-11-06 00:00:00,1118.86 2001-11-07 00:00:00,1115.8 2001-11-08 00:00:00,1118.54 2001-11-09 00:00:00,1120.31 2001-11-12 00:00:00,1118.33 2001-11-13 00:00:00,1139.09 2001-11-14 00:00:00,1141.21 2001-11-15 00:00:00,1142.24 2001-11-16 00:00:00,1138.65 2001-11-19 00:00:00,1151.06 2001-11-20 00:00:00,1142.66 2001-11-21 00:00:00,1137.03 2001-11-23 00:00:00,1150.34 2001-11-26 00:00:00,1157.42 2001-11-27 00:00:00,1149.5 2001-11-28 00:00:00,1128.52 2001-11-29 00:00:00,1140.2 2001-11-30 00:00:00,1139.45 2001-12-03 00:00:00,1129.9 2001-12-04 00:00:00,1144.8 2001-12-05 00:00:00,1170.35 2001-12-06 00:00:00,1167.1 2001-12-07 00:00:00,1158.31 2001-12-10 00:00:00,1139.93 2001-12-11 00:00:00,1136.76 2001-12-12 00:00:00,1137.07 2001-12-13 00:00:00,1119.38 2001-12-14 00:00:00,1123.09 2001-12-17 00:00:00,1134.36 2001-12-18 00:00:00,1142.92 2001-12-19 00:00:00,1149.56 2001-12-20 00:00:00,1139.93 2001-12-21 00:00:00,1144.89 2001-12-24 00:00:00,1144.65 2001-12-26 00:00:00,1149.37 2001-12-27 00:00:00,1157.13 2001-12-28 00:00:00,1161.02 2001-12-31 00:00:00,1148.08 2002-01-02 00:00:00,1154.67 2002-01-03 00:00:00,1165.27 2002-01-04 00:00:00,1172.51 2002-01-07 00:00:00,1164.89 2002-01-08 00:00:00,1160.71 2002-01-09 00:00:00,1155.14 2002-01-10 00:00:00,1156.55 2002-01-11 00:00:00,1145.6 2002-01-14 00:00:00,1138.41 2002-01-15 00:00:00,1146.19 2002-01-16 00:00:00,1127.57 2002-01-17 00:00:00,1138.88 2002-01-18 00:00:00,1127.58 2002-01-22 00:00:00,1119.31 2002-01-23 00:00:00,1128.18 2002-01-24 00:00:00,1132.15 2002-01-25 00:00:00,1133.28 2002-01-28 00:00:00,1133.06 2002-01-29 00:00:00,1100.64 2002-01-30 00:00:00,1113.57 2002-01-31 00:00:00,1130.2 2002-02-01 00:00:00,1122.2 2002-02-04 00:00:00,1094.44 2002-02-05 00:00:00,1090.02 2002-02-06 00:00:00,1083.51 2002-02-07 00:00:00,1080.17 2002-02-08 00:00:00,1096.22 2002-02-11 00:00:00,1111.94 2002-02-12 00:00:00,1107.5 2002-02-13 00:00:00,1118.51 2002-02-14 00:00:00,1116.48 2002-02-15 00:00:00,1104.18 2002-02-19 00:00:00,1083.34 2002-02-20 00:00:00,1097.98 2002-02-21 00:00:00,1080.95 2002-02-22 00:00:00,1089.84 2002-02-25 00:00:00,1109.43 2002-02-26 00:00:00,1109.38 2002-02-27 00:00:00,1109.89 2002-02-28 00:00:00,1106.73 2002-03-01 00:00:00,1131.78 2002-03-04 00:00:00,1153.84 2002-03-05 00:00:00,1146.14 2002-03-06 00:00:00,1162.77 2002-03-07 00:00:00,1157.54 2002-03-08 00:00:00,1164.31 2002-03-11 00:00:00,1168.26 2002-03-12 00:00:00,1165.58 2002-03-13 00:00:00,1154.09 2002-03-14 00:00:00,1153.04 2002-03-15 00:00:00,1166.16 2002-03-18 00:00:00,1165.55 2002-03-19 00:00:00,1170.29 2002-03-20 00:00:00,1151.85 2002-03-21 00:00:00,1153.59 2002-03-22 00:00:00,1148.7 2002-03-25 00:00:00,1131.87 2002-03-26 00:00:00,1138.49 2002-03-27 00:00:00,1144.58 2002-03-28 00:00:00,1147.39 2002-04-01 00:00:00,1146.54 2002-04-02 00:00:00,1136.76 2002-04-03 00:00:00,1125.4 2002-04-04 00:00:00,1126.34 2002-04-05 00:00:00,1122.73 2002-04-08 00:00:00,1125.29 2002-04-09 00:00:00,1117.8 2002-04-10 00:00:00,1130.47 2002-04-11 00:00:00,1103.69 2002-04-12 00:00:00,1111.01 2002-04-15 00:00:00,1102.55 2002-04-16 00:00:00,1128.37 2002-04-17 00:00:00,1126.07 2002-04-18 00:00:00,1124.47 2002-04-19 00:00:00,1125.17 2002-04-22 00:00:00,1107.83 2002-04-23 00:00:00,1100.96 2002-04-24 00:00:00,1093.14 2002-04-25 00:00:00,1091.48 2002-04-26 00:00:00,1076.32 2002-04-29 00:00:00,1065.45 2002-04-30 00:00:00,1076.92 2002-05-01 00:00:00,1086.46 2002-05-02 00:00:00,1084.56 2002-05-03 00:00:00,1073.43 2002-05-06 00:00:00,1052.67 2002-05-07 00:00:00,1049.49 2002-05-08 00:00:00,1088.85 2002-05-09 00:00:00,1073.01 2002-05-10 00:00:00,1054.99 2002-05-13 00:00:00,1074.56 2002-05-14 00:00:00,1097.28 2002-05-15 00:00:00,1091.07 2002-05-16 00:00:00,1098.23 2002-05-17 00:00:00,1106.59 2002-05-20 00:00:00,1091.88 2002-05-21 00:00:00,1079.88 2002-05-22 00:00:00,1086.02 2002-05-23 00:00:00,1097.08 2002-05-24 00:00:00,1083.82 2002-05-28 00:00:00,1074.55 2002-05-29 00:00:00,1067.66 2002-05-30 00:00:00,1064.66 2002-05-31 00:00:00,1067.14 2002-06-03 00:00:00,1040.68 2002-06-04 00:00:00,1040.69 2002-06-05 00:00:00,1049.9 2002-06-06 00:00:00,1029.15 2002-06-07 00:00:00,1027.53 2002-06-10 00:00:00,1030.74 2002-06-11 00:00:00,1013.6 2002-06-12 00:00:00,1020.26 2002-06-13 00:00:00,1009.56 2002-06-14 00:00:00,1007.27 2002-06-17 00:00:00,1036.17 2002-06-18 00:00:00,1037.14 2002-06-19 00:00:00,1019.99 2002-06-20 00:00:00,1006.29 2002-06-21 00:00:00,989.14 2002-06-24 00:00:00,992.72 2002-06-25 00:00:00,976.14 2002-06-26 00:00:00,973.53 2002-06-27 00:00:00,990.64 2002-06-28 00:00:00,989.82 2002-07-01 00:00:00,968.65 2002-07-02 00:00:00,948.09 2002-07-03 00:00:00,953.99 2002-07-05 00:00:00,989.03 2002-07-08 00:00:00,976.98 2002-07-09 00:00:00,952.83 2002-07-10 00:00:00,920.47 2002-07-11 00:00:00,927.37 2002-07-12 00:00:00,921.39 2002-07-15 00:00:00,917.93 2002-07-16 00:00:00,900.94 2002-07-17 00:00:00,906.04 2002-07-18 00:00:00,881.56 2002-07-19 00:00:00,847.75 2002-07-22 00:00:00,819.85 2002-07-23 00:00:00,797.7 2002-07-24 00:00:00,843.43 2002-07-25 00:00:00,838.68 2002-07-26 00:00:00,852.84 2002-07-29 00:00:00,898.96 2002-07-30 00:00:00,902.78 2002-07-31 00:00:00,911.62 2002-08-01 00:00:00,884.66 2002-08-02 00:00:00,864.24 2002-08-05 00:00:00,834.6 2002-08-06 00:00:00,859.57 2002-08-07 00:00:00,876.77 2002-08-08 00:00:00,905.46 2002-08-09 00:00:00,908.64 2002-08-12 00:00:00,903.8 2002-08-13 00:00:00,884.21 2002-08-14 00:00:00,919.62 2002-08-15 00:00:00,930.25 2002-08-16 00:00:00,928.77 2002-08-19 00:00:00,950.7 2002-08-20 00:00:00,937.43 2002-08-21 00:00:00,949.36 2002-08-22 00:00:00,962.7 2002-08-23 00:00:00,940.86 2002-08-26 00:00:00,947.95 2002-08-27 00:00:00,934.82 2002-08-28 00:00:00,917.87 2002-08-29 00:00:00,917.8 2002-08-30 00:00:00,916.07 2002-09-03 00:00:00,878.02 2002-09-04 00:00:00,893.4 2002-09-05 00:00:00,879.15 2002-09-06 00:00:00,893.92 2002-09-09 00:00:00,902.96 2002-09-10 00:00:00,909.58 2002-09-11 00:00:00,909.45 2002-09-12 00:00:00,886.91 2002-09-13 00:00:00,889.81 2002-09-16 00:00:00,891.1 2002-09-17 00:00:00,873.52 2002-09-18 00:00:00,869.46 2002-09-19 00:00:00,843.32 2002-09-20 00:00:00,845.39 2002-09-23 00:00:00,833.7 2002-09-24 00:00:00,819.29 2002-09-25 00:00:00,839.66 2002-09-26 00:00:00,854.95 2002-09-27 00:00:00,827.37 2002-09-30 00:00:00,815.28 2002-10-01 00:00:00,847.91 2002-10-02 00:00:00,827.91 2002-10-03 00:00:00,818.95 2002-10-04 00:00:00,800.58 2002-10-07 00:00:00,785.28 2002-10-08 00:00:00,798.55 2002-10-09 00:00:00,776.76 2002-10-10 00:00:00,803.92 2002-10-11 00:00:00,835.32 2002-10-14 00:00:00,841.44 2002-10-15 00:00:00,881.27 2002-10-16 00:00:00,860.02 2002-10-17 00:00:00,879.2 2002-10-18 00:00:00,884.39 2002-10-21 00:00:00,899.72 2002-10-22 00:00:00,890.16 2002-10-23 00:00:00,896.14 2002-10-24 00:00:00,882.5 2002-10-25 00:00:00,897.65 2002-10-28 00:00:00,890.23 2002-10-29 00:00:00,882.15 2002-10-30 00:00:00,890.71 2002-10-31 00:00:00,885.76 2002-11-01 00:00:00,900.96 2002-11-04 00:00:00,908.35 2002-11-05 00:00:00,915.39 2002-11-06 00:00:00,923.76 2002-11-07 00:00:00,902.65 2002-11-08 00:00:00,894.74 2002-11-11 00:00:00,876.19 2002-11-12 00:00:00,882.95 2002-11-13 00:00:00,882.53 2002-11-14 00:00:00,904.27 2002-11-15 00:00:00,909.83 2002-11-18 00:00:00,900.36 2002-11-19 00:00:00,896.74 2002-11-20 00:00:00,914.15 2002-11-21 00:00:00,933.76 2002-11-22 00:00:00,930.55 2002-11-25 00:00:00,932.87 2002-11-26 00:00:00,913.31 2002-11-27 00:00:00,938.87 2002-11-29 00:00:00,936.31 2002-12-02 00:00:00,934.53 2002-12-03 00:00:00,920.75 2002-12-04 00:00:00,917.58 2002-12-05 00:00:00,906.55 2002-12-06 00:00:00,912.23 2002-12-09 00:00:00,892.0 2002-12-10 00:00:00,904.45 2002-12-11 00:00:00,904.96 2002-12-12 00:00:00,901.58 2002-12-13 00:00:00,889.48 2002-12-16 00:00:00,910.4 2002-12-17 00:00:00,902.99 2002-12-18 00:00:00,891.12 2002-12-19 00:00:00,884.25 2002-12-20 00:00:00,895.76 2002-12-23 00:00:00,897.38 2002-12-24 00:00:00,892.47 2002-12-26 00:00:00,889.66 2002-12-27 00:00:00,875.4 2002-12-30 00:00:00,879.39 2002-12-31 00:00:00,879.82 2003-01-02 00:00:00,909.03 2003-01-03 00:00:00,908.59 2003-01-06 00:00:00,929.01 2003-01-07 00:00:00,922.93 2003-01-08 00:00:00,909.93 2003-01-09 00:00:00,927.57 2003-01-10 00:00:00,927.57 2003-01-13 00:00:00,926.26 2003-01-14 00:00:00,931.66 2003-01-15 00:00:00,918.22 2003-01-16 00:00:00,914.6 2003-01-17 00:00:00,901.78 2003-01-21 00:00:00,887.62 2003-01-22 00:00:00,878.36 2003-01-23 00:00:00,887.34 2003-01-24 00:00:00,861.4 2003-01-27 00:00:00,847.48 2003-01-28 00:00:00,858.54 2003-01-29 00:00:00,864.36 2003-01-30 00:00:00,844.61 2003-01-31 00:00:00,855.7 2003-02-03 00:00:00,860.32 2003-02-04 00:00:00,848.2 2003-02-05 00:00:00,843.59 2003-02-06 00:00:00,838.15 2003-02-07 00:00:00,829.69 2003-02-10 00:00:00,835.97 2003-02-11 00:00:00,829.2 2003-02-12 00:00:00,818.68 2003-02-13 00:00:00,817.37 2003-02-14 00:00:00,834.89 2003-02-18 00:00:00,851.17 2003-02-19 00:00:00,845.13 2003-02-20 00:00:00,837.1 2003-02-21 00:00:00,848.17 2003-02-24 00:00:00,832.58 2003-02-25 00:00:00,838.57 2003-02-26 00:00:00,827.55 2003-02-27 00:00:00,837.28 2003-02-28 00:00:00,841.15 2003-03-03 00:00:00,834.81 2003-03-04 00:00:00,821.99 2003-03-05 00:00:00,829.85 2003-03-06 00:00:00,822.1 2003-03-07 00:00:00,828.89 2003-03-10 00:00:00,807.48 2003-03-11 00:00:00,800.73 2003-03-12 00:00:00,804.19 2003-03-13 00:00:00,831.9 2003-03-14 00:00:00,833.27 2003-03-17 00:00:00,862.79 2003-03-18 00:00:00,866.45 2003-03-19 00:00:00,874.02 2003-03-20 00:00:00,875.67 2003-03-21 00:00:00,895.79 2003-03-24 00:00:00,864.23 2003-03-25 00:00:00,874.74 2003-03-26 00:00:00,869.95 2003-03-27 00:00:00,868.52 2003-03-28 00:00:00,863.5 2003-03-31 00:00:00,848.18 2003-04-01 00:00:00,858.48 2003-04-02 00:00:00,880.9 2003-04-03 00:00:00,876.45 2003-04-04 00:00:00,878.85 2003-04-07 00:00:00,879.93 2003-04-08 00:00:00,878.29 2003-04-09 00:00:00,865.99 2003-04-10 00:00:00,871.58 2003-04-11 00:00:00,868.3 2003-04-14 00:00:00,885.23 2003-04-15 00:00:00,890.81 2003-04-16 00:00:00,879.91 2003-04-17 00:00:00,893.58 2003-04-21 00:00:00,892.01 2003-04-22 00:00:00,911.37 2003-04-23 00:00:00,919.02 2003-04-24 00:00:00,911.43 2003-04-25 00:00:00,898.81 2003-04-28 00:00:00,914.84 2003-04-29 00:00:00,917.84 2003-04-30 00:00:00,916.92 2003-05-01 00:00:00,916.3 2003-05-02 00:00:00,930.08 2003-05-05 00:00:00,926.55 2003-05-06 00:00:00,934.39 2003-05-07 00:00:00,929.62 2003-05-08 00:00:00,920.27 2003-05-09 00:00:00,933.41 2003-05-12 00:00:00,945.11 2003-05-13 00:00:00,942.3 2003-05-14 00:00:00,939.28 2003-05-15 00:00:00,946.67 2003-05-16 00:00:00,944.3 2003-05-19 00:00:00,920.77 2003-05-20 00:00:00,919.73 2003-05-21 00:00:00,923.42 2003-05-22 00:00:00,931.87 2003-05-23 00:00:00,933.22 2003-05-27 00:00:00,951.48 2003-05-28 00:00:00,953.22 2003-05-29 00:00:00,949.64 2003-05-30 00:00:00,963.59 2003-06-02 00:00:00,967.0 2003-06-03 00:00:00,971.56 2003-06-04 00:00:00,986.24 2003-06-05 00:00:00,990.14 2003-06-06 00:00:00,987.76 2003-06-09 00:00:00,975.93 2003-06-10 00:00:00,984.84 2003-06-11 00:00:00,997.48 2003-06-12 00:00:00,998.51 2003-06-13 00:00:00,988.61 2003-06-16 00:00:00,1010.74 2003-06-17 00:00:00,1011.66 2003-06-18 00:00:00,1010.09 2003-06-19 00:00:00,994.7 2003-06-20 00:00:00,995.69 2003-06-23 00:00:00,981.64 2003-06-24 00:00:00,983.45 2003-06-25 00:00:00,975.32 2003-06-26 00:00:00,985.82 2003-06-27 00:00:00,976.22 2003-06-30 00:00:00,974.5 2003-07-01 00:00:00,982.32 2003-07-02 00:00:00,993.75 2003-07-03 00:00:00,985.7 2003-07-07 00:00:00,1004.42 2003-07-08 00:00:00,1007.84 2003-07-09 00:00:00,1002.21 2003-07-10 00:00:00,988.7 2003-07-11 00:00:00,998.14 2003-07-14 00:00:00,1003.86 2003-07-15 00:00:00,1000.42 2003-07-16 00:00:00,994.09 2003-07-17 00:00:00,981.73 2003-07-18 00:00:00,993.32 2003-07-21 00:00:00,978.8 2003-07-22 00:00:00,988.11 2003-07-23 00:00:00,988.61 2003-07-24 00:00:00,981.6 2003-07-25 00:00:00,998.68 2003-07-28 00:00:00,996.52 2003-07-29 00:00:00,989.28 2003-07-30 00:00:00,987.49 2003-07-31 00:00:00,990.31 2003-08-01 00:00:00,980.15 2003-08-04 00:00:00,982.82 2003-08-05 00:00:00,965.46 2003-08-06 00:00:00,967.08 2003-08-07 00:00:00,974.12 2003-08-08 00:00:00,977.59 2003-08-11 00:00:00,980.59 2003-08-12 00:00:00,990.35 2003-08-13 00:00:00,984.03 2003-08-14 00:00:00,990.51 2003-08-15 00:00:00,990.67 2003-08-18 00:00:00,999.74 2003-08-19 00:00:00,1002.35 2003-08-20 00:00:00,1000.3 2003-08-21 00:00:00,1003.27 2003-08-22 00:00:00,993.06 2003-08-25 00:00:00,993.71 2003-08-26 00:00:00,996.73 2003-08-27 00:00:00,996.79 2003-08-28 00:00:00,1002.84 2003-08-29 00:00:00,1008.01 2003-09-02 00:00:00,1021.99 2003-09-03 00:00:00,1026.27 2003-09-04 00:00:00,1027.97 2003-09-05 00:00:00,1021.39 2003-09-08 00:00:00,1031.64 2003-09-09 00:00:00,1023.17 2003-09-10 00:00:00,1010.92 2003-09-11 00:00:00,1016.42 2003-09-12 00:00:00,1018.63 2003-09-15 00:00:00,1014.81 2003-09-16 00:00:00,1029.32 2003-09-17 00:00:00,1025.97 2003-09-18 00:00:00,1039.58 2003-09-19 00:00:00,1036.3 2003-09-22 00:00:00,1022.82 2003-09-23 00:00:00,1029.03 2003-09-24 00:00:00,1009.38 2003-09-25 00:00:00,1003.27 2003-09-26 00:00:00,996.85 2003-09-29 00:00:00,1006.58 2003-09-30 00:00:00,995.97 2003-10-01 00:00:00,1018.22 2003-10-02 00:00:00,1020.24 2003-10-03 00:00:00,1029.85 2003-10-06 00:00:00,1034.35 2003-10-07 00:00:00,1039.25 2003-10-08 00:00:00,1033.78 2003-10-09 00:00:00,1038.73 2003-10-10 00:00:00,1038.06 2003-10-13 00:00:00,1045.35 2003-10-14 00:00:00,1049.48 2003-10-15 00:00:00,1046.76 2003-10-16 00:00:00,1050.07 2003-10-17 00:00:00,1039.32 2003-10-20 00:00:00,1044.68 2003-10-21 00:00:00,1046.03 2003-10-22 00:00:00,1030.36 2003-10-23 00:00:00,1033.77 2003-10-24 00:00:00,1028.91 2003-10-27 00:00:00,1031.13 2003-10-28 00:00:00,1046.79 2003-10-29 00:00:00,1048.11 2003-10-30 00:00:00,1046.94 2003-10-31 00:00:00,1050.71 2003-11-03 00:00:00,1059.02 2003-11-04 00:00:00,1053.25 2003-11-05 00:00:00,1051.81 2003-11-06 00:00:00,1058.05 2003-11-07 00:00:00,1053.21 2003-11-10 00:00:00,1047.11 2003-11-11 00:00:00,1046.57 2003-11-12 00:00:00,1058.53 2003-11-13 00:00:00,1058.41 2003-11-14 00:00:00,1050.35 2003-11-17 00:00:00,1043.63 2003-11-18 00:00:00,1034.15 2003-11-19 00:00:00,1042.44 2003-11-20 00:00:00,1033.65 2003-11-21 00:00:00,1035.28 2003-11-24 00:00:00,1052.08 2003-11-25 00:00:00,1053.89 2003-11-26 00:00:00,1058.45 2003-11-28 00:00:00,1058.2 2003-12-01 00:00:00,1070.12 2003-12-02 00:00:00,1066.62 2003-12-03 00:00:00,1064.73 2003-12-04 00:00:00,1069.72 2003-12-05 00:00:00,1061.5 2003-12-08 00:00:00,1069.3 2003-12-09 00:00:00,1060.18 2003-12-10 00:00:00,1059.05 2003-12-11 00:00:00,1071.21 2003-12-12 00:00:00,1074.14 2003-12-15 00:00:00,1068.04 2003-12-16 00:00:00,1075.13 2003-12-17 00:00:00,1076.48 2003-12-18 00:00:00,1089.18 2003-12-19 00:00:00,1088.66 2003-12-22 00:00:00,1092.94 2003-12-23 00:00:00,1096.02 2003-12-24 00:00:00,1094.04 2003-12-26 00:00:00,1095.89 2003-12-29 00:00:00,1109.48 2003-12-30 00:00:00,1109.64 2003-12-31 00:00:00,1111.92 2004-01-02 00:00:00,1108.48 2004-01-05 00:00:00,1122.22 2004-01-06 00:00:00,1123.67 2004-01-07 00:00:00,1126.33 2004-01-08 00:00:00,1131.92 2004-01-09 00:00:00,1121.86 2004-01-12 00:00:00,1127.23 2004-01-13 00:00:00,1121.22 2004-01-14 00:00:00,1130.52 2004-01-15 00:00:00,1132.05 2004-01-16 00:00:00,1139.83 2004-01-20 00:00:00,1138.77 2004-01-21 00:00:00,1147.62 2004-01-22 00:00:00,1143.94 2004-01-23 00:00:00,1141.55 2004-01-26 00:00:00,1155.37 2004-01-27 00:00:00,1144.05 2004-01-28 00:00:00,1128.48 2004-01-29 00:00:00,1134.11 2004-01-30 00:00:00,1131.13 2004-02-02 00:00:00,1135.26 2004-02-03 00:00:00,1136.03 2004-02-04 00:00:00,1126.52 2004-02-05 00:00:00,1128.59 2004-02-06 00:00:00,1142.76 2004-02-09 00:00:00,1139.81 2004-02-10 00:00:00,1145.54 2004-02-11 00:00:00,1157.76 2004-02-12 00:00:00,1152.11 2004-02-13 00:00:00,1145.81 2004-02-17 00:00:00,1156.99 2004-02-18 00:00:00,1151.82 2004-02-19 00:00:00,1147.06 2004-02-20 00:00:00,1144.11 2004-02-23 00:00:00,1140.99 2004-02-24 00:00:00,1139.09 2004-02-25 00:00:00,1143.67 2004-02-26 00:00:00,1144.91 2004-02-27 00:00:00,1144.94 2004-03-01 00:00:00,1155.97 2004-03-02 00:00:00,1149.1 2004-03-03 00:00:00,1151.03 2004-03-04 00:00:00,1154.87 2004-03-05 00:00:00,1156.86 2004-03-08 00:00:00,1147.2 2004-03-09 00:00:00,1140.58 2004-03-10 00:00:00,1123.89 2004-03-11 00:00:00,1106.78 2004-03-12 00:00:00,1120.57 2004-03-15 00:00:00,1104.49 2004-03-16 00:00:00,1110.7 2004-03-17 00:00:00,1123.75 2004-03-18 00:00:00,1122.32 2004-03-19 00:00:00,1109.78 2004-03-22 00:00:00,1095.4 2004-03-23 00:00:00,1093.95 2004-03-24 00:00:00,1091.33 2004-03-25 00:00:00,1109.19 2004-03-26 00:00:00,1108.06 2004-03-29 00:00:00,1122.47 2004-03-30 00:00:00,1127.0 2004-03-31 00:00:00,1126.21 2004-04-01 00:00:00,1132.17 2004-04-02 00:00:00,1141.81 2004-04-05 00:00:00,1150.57 2004-04-06 00:00:00,1148.16 2004-04-07 00:00:00,1140.53 2004-04-08 00:00:00,1139.32 2004-04-12 00:00:00,1145.2 2004-04-13 00:00:00,1129.44 2004-04-14 00:00:00,1128.17 2004-04-15 00:00:00,1128.84 2004-04-16 00:00:00,1134.61 2004-04-19 00:00:00,1135.82 2004-04-20 00:00:00,1118.15 2004-04-21 00:00:00,1124.09 2004-04-22 00:00:00,1139.93 2004-04-23 00:00:00,1140.6 2004-04-26 00:00:00,1135.53 2004-04-27 00:00:00,1138.11 2004-04-28 00:00:00,1122.41 2004-04-29 00:00:00,1113.89 2004-04-30 00:00:00,1107.3 2004-05-03 00:00:00,1117.49 2004-05-04 00:00:00,1119.55 2004-05-05 00:00:00,1121.53 2004-05-06 00:00:00,1113.99 2004-05-07 00:00:00,1098.7 2004-05-10 00:00:00,1087.12 2004-05-11 00:00:00,1095.45 2004-05-12 00:00:00,1097.28 2004-05-13 00:00:00,1096.44 2004-05-14 00:00:00,1095.7 2004-05-17 00:00:00,1084.1 2004-05-18 00:00:00,1091.49 2004-05-19 00:00:00,1088.68 2004-05-20 00:00:00,1089.19 2004-05-21 00:00:00,1093.56 2004-05-24 00:00:00,1095.41 2004-05-25 00:00:00,1113.05 2004-05-26 00:00:00,1114.94 2004-05-27 00:00:00,1121.28 2004-05-28 00:00:00,1120.68 2004-06-01 00:00:00,1121.2 2004-06-02 00:00:00,1124.99 2004-06-03 00:00:00,1116.64 2004-06-04 00:00:00,1122.5 2004-06-07 00:00:00,1140.42 2004-06-08 00:00:00,1142.18 2004-06-09 00:00:00,1131.33 2004-06-10 00:00:00,1136.47 2004-06-14 00:00:00,1125.29 2004-06-15 00:00:00,1132.01 2004-06-16 00:00:00,1133.56 2004-06-17 00:00:00,1132.05 2004-06-18 00:00:00,1135.02 2004-06-21 00:00:00,1130.3 2004-06-22 00:00:00,1134.41 2004-06-23 00:00:00,1144.06 2004-06-24 00:00:00,1140.65 2004-06-25 00:00:00,1134.43 2004-06-28 00:00:00,1133.35 2004-06-29 00:00:00,1136.2 2004-06-30 00:00:00,1140.84 2004-07-01 00:00:00,1128.94 2004-07-02 00:00:00,1125.38 2004-07-06 00:00:00,1116.21 2004-07-07 00:00:00,1118.33 2004-07-08 00:00:00,1109.11 2004-07-09 00:00:00,1112.81 2004-07-12 00:00:00,1114.35 2004-07-13 00:00:00,1115.14 2004-07-14 00:00:00,1111.47 2004-07-15 00:00:00,1106.69 2004-07-16 00:00:00,1101.39 2004-07-19 00:00:00,1100.9 2004-07-20 00:00:00,1108.67 2004-07-21 00:00:00,1093.88 2004-07-22 00:00:00,1096.84 2004-07-23 00:00:00,1086.2 2004-07-26 00:00:00,1084.07 2004-07-27 00:00:00,1094.83 2004-07-28 00:00:00,1095.42 2004-07-29 00:00:00,1100.43 2004-07-30 00:00:00,1101.72 2004-08-02 00:00:00,1106.62 2004-08-03 00:00:00,1099.69 2004-08-04 00:00:00,1098.63 2004-08-05 00:00:00,1080.7 2004-08-06 00:00:00,1063.97 2004-08-09 00:00:00,1065.22 2004-08-10 00:00:00,1079.04 2004-08-11 00:00:00,1075.79 2004-08-12 00:00:00,1063.23 2004-08-13 00:00:00,1064.8 2004-08-16 00:00:00,1079.34 2004-08-17 00:00:00,1081.71 2004-08-18 00:00:00,1095.17 2004-08-19 00:00:00,1091.23 2004-08-20 00:00:00,1098.35 2004-08-23 00:00:00,1095.68 2004-08-24 00:00:00,1096.19 2004-08-25 00:00:00,1104.96 2004-08-26 00:00:00,1105.09 2004-08-27 00:00:00,1107.77 2004-08-30 00:00:00,1099.15 2004-08-31 00:00:00,1104.24 2004-09-01 00:00:00,1105.91 2004-09-02 00:00:00,1118.31 2004-09-03 00:00:00,1113.63 2004-09-07 00:00:00,1121.3 2004-09-08 00:00:00,1116.27 2004-09-09 00:00:00,1118.38 2004-09-10 00:00:00,1123.92 2004-09-13 00:00:00,1125.82 2004-09-14 00:00:00,1128.33 2004-09-15 00:00:00,1120.37 2004-09-16 00:00:00,1123.5 2004-09-17 00:00:00,1128.55 2004-09-20 00:00:00,1122.2 2004-09-21 00:00:00,1129.3 2004-09-22 00:00:00,1113.56 2004-09-23 00:00:00,1108.36 2004-09-24 00:00:00,1110.11 2004-09-27 00:00:00,1103.52 2004-09-28 00:00:00,1110.06 2004-09-29 00:00:00,1114.8 2004-09-30 00:00:00,1114.58 2004-10-01 00:00:00,1131.5 2004-10-04 00:00:00,1135.17 2004-10-05 00:00:00,1134.48 2004-10-06 00:00:00,1142.05 2004-10-07 00:00:00,1130.65 2004-10-08 00:00:00,1122.14 2004-10-11 00:00:00,1124.39 2004-10-12 00:00:00,1121.84 2004-10-13 00:00:00,1113.65 2004-10-14 00:00:00,1103.29 2004-10-15 00:00:00,1108.2 2004-10-18 00:00:00,1114.02 2004-10-19 00:00:00,1103.23 2004-10-20 00:00:00,1103.66 2004-10-21 00:00:00,1106.49 2004-10-22 00:00:00,1095.74 2004-10-25 00:00:00,1094.8 2004-10-26 00:00:00,1111.09 2004-10-27 00:00:00,1125.4 2004-10-28 00:00:00,1127.44 2004-10-29 00:00:00,1130.2 2004-11-01 00:00:00,1130.51 2004-11-02 00:00:00,1130.56 2004-11-03 00:00:00,1143.2 2004-11-04 00:00:00,1161.67 2004-11-05 00:00:00,1166.17 2004-11-08 00:00:00,1164.89 2004-11-09 00:00:00,1164.08 2004-11-10 00:00:00,1162.91 2004-11-11 00:00:00,1173.48 2004-11-12 00:00:00,1184.17 2004-11-15 00:00:00,1183.81 2004-11-16 00:00:00,1175.43 2004-11-17 00:00:00,1181.94 2004-11-18 00:00:00,1183.55 2004-11-19 00:00:00,1170.34 2004-11-22 00:00:00,1177.24 2004-11-23 00:00:00,1176.94 2004-11-24 00:00:00,1181.76 2004-11-26 00:00:00,1182.65 2004-11-29 00:00:00,1178.57 2004-11-30 00:00:00,1173.82 2004-12-01 00:00:00,1191.37 2004-12-02 00:00:00,1190.33 2004-12-03 00:00:00,1191.17 2004-12-06 00:00:00,1190.25 2004-12-07 00:00:00,1177.07 2004-12-08 00:00:00,1182.81 2004-12-09 00:00:00,1189.24 2004-12-10 00:00:00,1188.0 2004-12-13 00:00:00,1198.68 2004-12-14 00:00:00,1203.38 2004-12-15 00:00:00,1205.72 2004-12-16 00:00:00,1203.21 2004-12-17 00:00:00,1194.2 2004-12-20 00:00:00,1194.65 2004-12-21 00:00:00,1205.45 2004-12-22 00:00:00,1209.57 2004-12-23 00:00:00,1210.13 2004-12-27 00:00:00,1204.92 2004-12-28 00:00:00,1213.54 2004-12-29 00:00:00,1213.45 2004-12-30 00:00:00,1213.55 2004-12-31 00:00:00,1211.92 2005-01-03 00:00:00,1202.08 2005-01-04 00:00:00,1188.05 2005-01-05 00:00:00,1183.74 2005-01-06 00:00:00,1187.89 2005-01-07 00:00:00,1186.19 2005-01-10 00:00:00,1190.25 2005-01-11 00:00:00,1182.99 2005-01-12 00:00:00,1187.7 2005-01-13 00:00:00,1177.45 2005-01-14 00:00:00,1184.52 2005-01-18 00:00:00,1195.98 2005-01-19 00:00:00,1184.63 2005-01-20 00:00:00,1175.41 2005-01-21 00:00:00,1167.87 2005-01-24 00:00:00,1163.75 2005-01-25 00:00:00,1168.41 2005-01-26 00:00:00,1174.07 2005-01-27 00:00:00,1174.55 2005-01-28 00:00:00,1171.36 2005-01-31 00:00:00,1181.27 2005-02-01 00:00:00,1189.41 2005-02-02 00:00:00,1193.19 2005-02-03 00:00:00,1189.89 2005-02-04 00:00:00,1203.03 2005-02-07 00:00:00,1201.72 2005-02-08 00:00:00,1202.3 2005-02-09 00:00:00,1191.99 2005-02-10 00:00:00,1197.01 2005-02-11 00:00:00,1205.3 2005-02-14 00:00:00,1206.14 2005-02-15 00:00:00,1210.12 2005-02-16 00:00:00,1210.34 2005-02-17 00:00:00,1200.75 2005-02-18 00:00:00,1201.59 2005-02-22 00:00:00,1184.16 2005-02-23 00:00:00,1190.8 2005-02-24 00:00:00,1200.2 2005-02-25 00:00:00,1211.37 2005-02-28 00:00:00,1203.6 2005-03-01 00:00:00,1210.41 2005-03-02 00:00:00,1210.08 2005-03-03 00:00:00,1210.47 2005-03-04 00:00:00,1222.12 2005-03-07 00:00:00,1225.31 2005-03-08 00:00:00,1219.43 2005-03-09 00:00:00,1207.01 2005-03-10 00:00:00,1209.25 2005-03-11 00:00:00,1200.08 2005-03-14 00:00:00,1206.83 2005-03-15 00:00:00,1197.75 2005-03-16 00:00:00,1188.07 2005-03-17 00:00:00,1190.21 2005-03-18 00:00:00,1189.65 2005-03-21 00:00:00,1183.78 2005-03-22 00:00:00,1171.71 2005-03-23 00:00:00,1172.53 2005-03-24 00:00:00,1171.42 2005-03-28 00:00:00,1174.28 2005-03-29 00:00:00,1165.36 2005-03-30 00:00:00,1181.41 2005-03-31 00:00:00,1180.59 2005-04-01 00:00:00,1172.92 2005-04-04 00:00:00,1176.12 2005-04-05 00:00:00,1181.39 2005-04-06 00:00:00,1184.07 2005-04-07 00:00:00,1191.14 2005-04-08 00:00:00,1181.2 2005-04-11 00:00:00,1181.21 2005-04-12 00:00:00,1187.76 2005-04-13 00:00:00,1173.79 2005-04-14 00:00:00,1162.05 2005-04-15 00:00:00,1142.62 2005-04-18 00:00:00,1145.98 2005-04-19 00:00:00,1152.78 2005-04-20 00:00:00,1137.5 2005-04-21 00:00:00,1159.95 2005-04-22 00:00:00,1152.12 2005-04-25 00:00:00,1162.1 2005-04-26 00:00:00,1151.83 2005-04-27 00:00:00,1156.38 2005-04-28 00:00:00,1143.22 2005-04-29 00:00:00,1156.85 2005-05-02 00:00:00,1162.16 2005-05-03 00:00:00,1161.17 2005-05-04 00:00:00,1175.65 2005-05-05 00:00:00,1172.63 2005-05-06 00:00:00,1171.35 2005-05-09 00:00:00,1178.84 2005-05-10 00:00:00,1166.22 2005-05-11 00:00:00,1171.11 2005-05-12 00:00:00,1159.36 2005-05-13 00:00:00,1154.05 2005-05-16 00:00:00,1165.69 2005-05-17 00:00:00,1173.8 2005-05-18 00:00:00,1185.56 2005-05-19 00:00:00,1191.08 2005-05-20 00:00:00,1189.28 2005-05-23 00:00:00,1193.86 2005-05-24 00:00:00,1194.07 2005-05-25 00:00:00,1190.01 2005-05-26 00:00:00,1197.62 2005-05-27 00:00:00,1198.78 2005-05-31 00:00:00,1191.5 2005-06-01 00:00:00,1202.22 2005-06-02 00:00:00,1204.29 2005-06-03 00:00:00,1196.02 2005-06-06 00:00:00,1197.51 2005-06-07 00:00:00,1197.26 2005-06-08 00:00:00,1194.67 2005-06-09 00:00:00,1200.93 2005-06-10 00:00:00,1198.11 2005-06-13 00:00:00,1200.82 2005-06-14 00:00:00,1203.91 2005-06-15 00:00:00,1206.58 2005-06-16 00:00:00,1210.96 2005-06-17 00:00:00,1216.96 2005-06-20 00:00:00,1216.1 2005-06-21 00:00:00,1213.61 2005-06-22 00:00:00,1213.88 2005-06-23 00:00:00,1200.73 2005-06-24 00:00:00,1191.57 2005-06-27 00:00:00,1190.69 2005-06-28 00:00:00,1201.57 2005-06-29 00:00:00,1199.85 2005-06-30 00:00:00,1191.33 2005-07-01 00:00:00,1194.44 2005-07-05 00:00:00,1204.99 2005-07-06 00:00:00,1194.94 2005-07-07 00:00:00,1197.87 2005-07-08 00:00:00,1211.86 2005-07-11 00:00:00,1219.44 2005-07-12 00:00:00,1222.21 2005-07-13 00:00:00,1223.29 2005-07-14 00:00:00,1226.5 2005-07-15 00:00:00,1227.92 2005-07-18 00:00:00,1221.13 2005-07-19 00:00:00,1229.35 2005-07-20 00:00:00,1235.2 2005-07-21 00:00:00,1227.04 2005-07-22 00:00:00,1233.68 2005-07-25 00:00:00,1229.03 2005-07-26 00:00:00,1231.16 2005-07-27 00:00:00,1236.79 2005-07-28 00:00:00,1243.72 2005-07-29 00:00:00,1234.18 2005-08-01 00:00:00,1235.35 2005-08-02 00:00:00,1244.12 2005-08-03 00:00:00,1245.04 2005-08-04 00:00:00,1235.86 2005-08-05 00:00:00,1226.42 2005-08-08 00:00:00,1223.13 2005-08-09 00:00:00,1231.38 2005-08-10 00:00:00,1229.13 2005-08-11 00:00:00,1237.81 2005-08-12 00:00:00,1230.39 2005-08-15 00:00:00,1233.87 2005-08-16 00:00:00,1219.34 2005-08-17 00:00:00,1220.24 2005-08-18 00:00:00,1219.02 2005-08-19 00:00:00,1219.71 2005-08-22 00:00:00,1221.73 2005-08-23 00:00:00,1217.59 2005-08-24 00:00:00,1209.59 2005-08-25 00:00:00,1212.37 2005-08-26 00:00:00,1205.1 2005-08-29 00:00:00,1212.28 2005-08-30 00:00:00,1208.41 2005-08-31 00:00:00,1220.33 2005-09-01 00:00:00,1221.59 2005-09-02 00:00:00,1218.02 2005-09-06 00:00:00,1233.39 2005-09-07 00:00:00,1236.36 2005-09-08 00:00:00,1231.67 2005-09-09 00:00:00,1241.48 2005-09-12 00:00:00,1240.56 2005-09-13 00:00:00,1231.2 2005-09-14 00:00:00,1227.16 2005-09-15 00:00:00,1227.73 2005-09-16 00:00:00,1237.91 2005-09-19 00:00:00,1231.02 2005-09-20 00:00:00,1221.34 2005-09-21 00:00:00,1210.2 2005-09-22 00:00:00,1214.62 2005-09-23 00:00:00,1215.29 2005-09-26 00:00:00,1215.63 2005-09-27 00:00:00,1215.66 2005-09-28 00:00:00,1216.89 2005-09-29 00:00:00,1227.68 2005-09-30 00:00:00,1228.81 2005-10-03 00:00:00,1226.7 2005-10-04 00:00:00,1214.47 2005-10-05 00:00:00,1196.39 2005-10-06 00:00:00,1191.49 2005-10-07 00:00:00,1195.9 2005-10-10 00:00:00,1187.33 2005-10-11 00:00:00,1184.87 2005-10-12 00:00:00,1177.68 2005-10-13 00:00:00,1176.84 2005-10-14 00:00:00,1186.57 2005-10-17 00:00:00,1190.1 2005-10-18 00:00:00,1178.14 2005-10-19 00:00:00,1195.76 2005-10-20 00:00:00,1177.8 2005-10-21 00:00:00,1179.59 2005-10-24 00:00:00,1199.38 2005-10-25 00:00:00,1196.54 2005-10-26 00:00:00,1191.38 2005-10-27 00:00:00,1178.9 2005-10-28 00:00:00,1198.41 2005-10-31 00:00:00,1207.01 2005-11-01 00:00:00,1202.76 2005-11-02 00:00:00,1214.76 2005-11-03 00:00:00,1219.94 2005-11-04 00:00:00,1220.14 2005-11-07 00:00:00,1222.81 2005-11-08 00:00:00,1218.59 2005-11-09 00:00:00,1220.65 2005-11-10 00:00:00,1230.96 2005-11-11 00:00:00,1234.72 2005-11-14 00:00:00,1233.76 2005-11-15 00:00:00,1229.01 2005-11-16 00:00:00,1231.21 2005-11-17 00:00:00,1242.8 2005-11-18 00:00:00,1248.27 2005-11-21 00:00:00,1254.85 2005-11-22 00:00:00,1261.23 2005-11-23 00:00:00,1265.61 2005-11-25 00:00:00,1268.25 2005-11-28 00:00:00,1257.46 2005-11-29 00:00:00,1257.48 2005-11-30 00:00:00,1249.48 2005-12-01 00:00:00,1264.67 2005-12-02 00:00:00,1265.08 2005-12-05 00:00:00,1262.09 2005-12-06 00:00:00,1263.7 2005-12-07 00:00:00,1257.37 2005-12-08 00:00:00,1255.84 2005-12-09 00:00:00,1259.37 2005-12-12 00:00:00,1260.43 2005-12-13 00:00:00,1267.43 2005-12-14 00:00:00,1272.74 2005-12-15 00:00:00,1270.94 2005-12-16 00:00:00,1267.32 2005-12-19 00:00:00,1259.92 2005-12-20 00:00:00,1259.62 2005-12-21 00:00:00,1262.79 2005-12-22 00:00:00,1268.12 2005-12-23 00:00:00,1268.66 2005-12-27 00:00:00,1256.54 2005-12-28 00:00:00,1258.17 2005-12-29 00:00:00,1254.42 2005-12-30 00:00:00,1248.29 2006-01-03 00:00:00,1268.8 2006-01-04 00:00:00,1273.46 2006-01-05 00:00:00,1273.48 2006-01-06 00:00:00,1285.45 2006-01-09 00:00:00,1290.15 2006-01-10 00:00:00,1289.69 2006-01-11 00:00:00,1294.18 2006-01-12 00:00:00,1286.06 2006-01-13 00:00:00,1287.61 2006-01-17 00:00:00,1283.03 2006-01-18 00:00:00,1277.93 2006-01-19 00:00:00,1285.04 2006-01-20 00:00:00,1261.49 2006-01-23 00:00:00,1263.82 2006-01-24 00:00:00,1266.86 2006-01-25 00:00:00,1264.68 2006-01-26 00:00:00,1273.83 2006-01-27 00:00:00,1283.72 2006-01-30 00:00:00,1285.19 2006-01-31 00:00:00,1280.08 2006-02-01 00:00:00,1282.46 2006-02-02 00:00:00,1270.84 2006-02-03 00:00:00,1264.03 2006-02-06 00:00:00,1265.02 2006-02-07 00:00:00,1254.78 2006-02-08 00:00:00,1265.65 2006-02-09 00:00:00,1263.78 2006-02-10 00:00:00,1266.99 2006-02-13 00:00:00,1262.86 2006-02-14 00:00:00,1275.53 2006-02-15 00:00:00,1280.0 2006-02-16 00:00:00,1289.38 2006-02-17 00:00:00,1287.24 2006-02-21 00:00:00,1283.03 2006-02-22 00:00:00,1292.67 2006-02-23 00:00:00,1287.79 2006-02-24 00:00:00,1289.43 2006-02-27 00:00:00,1294.12 2006-02-28 00:00:00,1280.66 2006-03-01 00:00:00,1291.24 2006-03-02 00:00:00,1289.14 2006-03-03 00:00:00,1287.23 2006-03-06 00:00:00,1278.26 2006-03-07 00:00:00,1275.88 2006-03-08 00:00:00,1278.47 2006-03-09 00:00:00,1272.23 2006-03-10 00:00:00,1281.42 2006-03-13 00:00:00,1284.13 2006-03-14 00:00:00,1297.48 2006-03-15 00:00:00,1303.02 2006-03-16 00:00:00,1305.33 2006-03-17 00:00:00,1307.25 2006-03-20 00:00:00,1305.08 2006-03-21 00:00:00,1297.23 2006-03-22 00:00:00,1305.04 2006-03-23 00:00:00,1301.67 2006-03-24 00:00:00,1302.95 2006-03-27 00:00:00,1301.61 2006-03-28 00:00:00,1293.23 2006-03-29 00:00:00,1302.89 2006-03-30 00:00:00,1300.25 2006-03-31 00:00:00,1294.87 2006-04-03 00:00:00,1297.81 2006-04-04 00:00:00,1305.93 2006-04-05 00:00:00,1311.56 2006-04-06 00:00:00,1309.04 2006-04-07 00:00:00,1295.5 2006-04-10 00:00:00,1296.62 2006-04-11 00:00:00,1286.57 2006-04-12 00:00:00,1288.12 2006-04-13 00:00:00,1289.12 2006-04-17 00:00:00,1285.33 2006-04-18 00:00:00,1307.28 2006-04-19 00:00:00,1309.93 2006-04-20 00:00:00,1311.46 2006-04-21 00:00:00,1311.28 2006-04-24 00:00:00,1308.11 2006-04-25 00:00:00,1301.74 2006-04-26 00:00:00,1305.41 2006-04-27 00:00:00,1309.72 2006-04-28 00:00:00,1310.61 2006-05-01 00:00:00,1305.19 2006-05-02 00:00:00,1313.21 2006-05-03 00:00:00,1308.12 2006-05-04 00:00:00,1312.25 2006-05-05 00:00:00,1325.76 2006-05-08 00:00:00,1324.66 2006-05-09 00:00:00,1325.14 2006-05-10 00:00:00,1322.85 2006-05-11 00:00:00,1305.92 2006-05-12 00:00:00,1291.24 2006-05-15 00:00:00,1294.5 2006-05-16 00:00:00,1292.08 2006-05-17 00:00:00,1270.32 2006-05-18 00:00:00,1261.81 2006-05-19 00:00:00,1267.03 2006-05-22 00:00:00,1262.07 2006-05-23 00:00:00,1256.58 2006-05-24 00:00:00,1258.57 2006-05-25 00:00:00,1272.88 2006-05-26 00:00:00,1280.16 2006-05-30 00:00:00,1259.87 2006-05-31 00:00:00,1270.09 2006-06-01 00:00:00,1285.71 2006-06-02 00:00:00,1288.22 2006-06-05 00:00:00,1265.29 2006-06-06 00:00:00,1263.85 2006-06-07 00:00:00,1256.15 2006-06-08 00:00:00,1257.93 2006-06-09 00:00:00,1252.3 2006-06-12 00:00:00,1237.44 2006-06-13 00:00:00,1223.69 2006-06-14 00:00:00,1230.04 2006-06-15 00:00:00,1256.16 2006-06-16 00:00:00,1251.54 2006-06-19 00:00:00,1240.13 2006-06-20 00:00:00,1240.12 2006-06-21 00:00:00,1252.2 2006-06-22 00:00:00,1245.6 2006-06-23 00:00:00,1244.5 2006-06-26 00:00:00,1250.56 2006-06-27 00:00:00,1239.2 2006-06-28 00:00:00,1246.0 2006-06-29 00:00:00,1272.87 2006-06-30 00:00:00,1270.2 2006-07-03 00:00:00,1280.19 2006-07-05 00:00:00,1270.91 2006-07-06 00:00:00,1274.08 2006-07-07 00:00:00,1265.48 2006-07-10 00:00:00,1267.34 2006-07-11 00:00:00,1272.43 2006-07-12 00:00:00,1258.6 2006-07-13 00:00:00,1242.28 2006-07-14 00:00:00,1236.2 2006-07-17 00:00:00,1234.49 2006-07-18 00:00:00,1236.86 2006-07-19 00:00:00,1259.81 2006-07-20 00:00:00,1249.13 2006-07-21 00:00:00,1240.29 2006-07-24 00:00:00,1260.91 2006-07-25 00:00:00,1268.88 2006-07-26 00:00:00,1268.4 2006-07-27 00:00:00,1263.2 2006-07-28 00:00:00,1278.55 2006-07-31 00:00:00,1276.66 2006-08-01 00:00:00,1270.92 2006-08-02 00:00:00,1277.41 2006-08-03 00:00:00,1280.27 2006-08-04 00:00:00,1279.36 2006-08-07 00:00:00,1275.77 2006-08-08 00:00:00,1271.48 2006-08-09 00:00:00,1265.95 2006-08-10 00:00:00,1271.81 2006-08-11 00:00:00,1266.74 2006-08-14 00:00:00,1268.21 2006-08-15 00:00:00,1285.58 2006-08-16 00:00:00,1295.43 2006-08-17 00:00:00,1297.48 2006-08-18 00:00:00,1302.3 2006-08-21 00:00:00,1297.52 2006-08-22 00:00:00,1298.82 2006-08-23 00:00:00,1292.99 2006-08-24 00:00:00,1296.06 2006-08-25 00:00:00,1295.09 2006-08-28 00:00:00,1301.78 2006-08-29 00:00:00,1304.28 2006-08-30 00:00:00,1305.37 2006-08-31 00:00:00,1303.82 2006-09-01 00:00:00,1311.01 2006-09-05 00:00:00,1313.25 2006-09-06 00:00:00,1300.26 2006-09-07 00:00:00,1294.02 2006-09-08 00:00:00,1298.92 2006-09-11 00:00:00,1299.54 2006-09-12 00:00:00,1313.0 2006-09-13 00:00:00,1318.07 2006-09-14 00:00:00,1316.28 2006-09-15 00:00:00,1319.66 2006-09-18 00:00:00,1321.18 2006-09-19 00:00:00,1317.64 2006-09-20 00:00:00,1325.18 2006-09-21 00:00:00,1318.03 2006-09-22 00:00:00,1314.78 2006-09-25 00:00:00,1326.37 2006-09-26 00:00:00,1336.35 2006-09-27 00:00:00,1336.59 2006-09-28 00:00:00,1338.88 2006-09-29 00:00:00,1335.85 2006-10-02 00:00:00,1331.32 2006-10-03 00:00:00,1334.11 2006-10-04 00:00:00,1350.2 2006-10-05 00:00:00,1353.22 2006-10-06 00:00:00,1349.59 2006-10-09 00:00:00,1350.66 2006-10-10 00:00:00,1353.42 2006-10-11 00:00:00,1349.95 2006-10-12 00:00:00,1362.83 2006-10-13 00:00:00,1365.62 2006-10-16 00:00:00,1369.06 2006-10-17 00:00:00,1364.05 2006-10-18 00:00:00,1365.8 2006-10-19 00:00:00,1366.96 2006-10-20 00:00:00,1368.6 2006-10-23 00:00:00,1377.02 2006-10-24 00:00:00,1377.38 2006-10-25 00:00:00,1382.22 2006-10-26 00:00:00,1389.08 2006-10-27 00:00:00,1377.34 2006-10-30 00:00:00,1377.93 2006-10-31 00:00:00,1377.94 2006-11-01 00:00:00,1367.81 2006-11-02 00:00:00,1367.34 2006-11-03 00:00:00,1364.3 2006-11-06 00:00:00,1379.78 2006-11-07 00:00:00,1382.84 2006-11-08 00:00:00,1385.72 2006-11-09 00:00:00,1378.33 2006-11-10 00:00:00,1380.9 2006-11-13 00:00:00,1384.42 2006-11-14 00:00:00,1393.22 2006-11-15 00:00:00,1396.57 2006-11-16 00:00:00,1399.76 2006-11-17 00:00:00,1401.2 2006-11-20 00:00:00,1400.5 2006-11-21 00:00:00,1402.81 2006-11-22 00:00:00,1406.09 2006-11-24 00:00:00,1400.95 2006-11-27 00:00:00,1381.96 2006-11-28 00:00:00,1386.72 2006-11-29 00:00:00,1399.48 2006-11-30 00:00:00,1400.63 2006-12-01 00:00:00,1396.71 2006-12-04 00:00:00,1409.12 2006-12-05 00:00:00,1414.76 2006-12-06 00:00:00,1412.9 2006-12-07 00:00:00,1407.29 2006-12-08 00:00:00,1409.84 2006-12-11 00:00:00,1413.04 2006-12-12 00:00:00,1411.56 2006-12-13 00:00:00,1413.21 2006-12-14 00:00:00,1425.49 2006-12-15 00:00:00,1427.09 2006-12-18 00:00:00,1422.48 2006-12-19 00:00:00,1425.55 2006-12-20 00:00:00,1423.53 2006-12-21 00:00:00,1418.3 2006-12-22 00:00:00,1410.76 2006-12-26 00:00:00,1416.9 2006-12-27 00:00:00,1426.84 2006-12-28 00:00:00,1424.73 2006-12-29 00:00:00,1418.3 2007-01-03 00:00:00,1416.6 2007-01-04 00:00:00,1418.34 2007-01-05 00:00:00,1409.71 2007-01-08 00:00:00,1412.84 2007-01-09 00:00:00,1412.11 2007-01-10 00:00:00,1414.85 2007-01-11 00:00:00,1423.82 2007-01-12 00:00:00,1430.73 2007-01-16 00:00:00,1431.9 2007-01-17 00:00:00,1430.62 2007-01-18 00:00:00,1426.37 2007-01-19 00:00:00,1430.5 2007-01-22 00:00:00,1422.95 2007-01-23 00:00:00,1427.99 2007-01-24 00:00:00,1440.13 2007-01-25 00:00:00,1423.9 2007-01-26 00:00:00,1422.18 2007-01-29 00:00:00,1420.62 2007-01-30 00:00:00,1428.82 2007-01-31 00:00:00,1438.24 2007-02-01 00:00:00,1445.94 2007-02-02 00:00:00,1448.39 2007-02-05 00:00:00,1446.99 2007-02-06 00:00:00,1448.0 2007-02-07 00:00:00,1450.02 2007-02-08 00:00:00,1448.31 2007-02-09 00:00:00,1438.06 2007-02-12 00:00:00,1433.37 2007-02-13 00:00:00,1444.26 2007-02-14 00:00:00,1455.3 2007-02-15 00:00:00,1456.81 2007-02-16 00:00:00,1455.54 2007-02-20 00:00:00,1459.68 2007-02-21 00:00:00,1457.63 2007-02-22 00:00:00,1456.38 2007-02-23 00:00:00,1451.19 2007-02-26 00:00:00,1449.37 2007-02-27 00:00:00,1399.04 2007-02-28 00:00:00,1406.82 2007-03-01 00:00:00,1403.17 2007-03-02 00:00:00,1387.17 2007-03-05 00:00:00,1374.12 2007-03-06 00:00:00,1395.41 2007-03-07 00:00:00,1391.97 2007-03-08 00:00:00,1401.89 2007-03-09 00:00:00,1402.84 2007-03-12 00:00:00,1406.6 2007-03-13 00:00:00,1377.95 2007-03-14 00:00:00,1387.17 2007-03-15 00:00:00,1392.28 2007-03-16 00:00:00,1386.95 2007-03-19 00:00:00,1402.06 2007-03-20 00:00:00,1410.94 2007-03-21 00:00:00,1435.04 2007-03-22 00:00:00,1434.54 2007-03-23 00:00:00,1436.11 2007-03-26 00:00:00,1437.5 2007-03-27 00:00:00,1428.61 2007-03-28 00:00:00,1417.23 2007-03-29 00:00:00,1422.53 2007-03-30 00:00:00,1420.86 2007-04-02 00:00:00,1424.55 2007-04-03 00:00:00,1437.77 2007-04-04 00:00:00,1439.37 2007-04-05 00:00:00,1443.76 2007-04-09 00:00:00,1444.61 2007-04-10 00:00:00,1448.39 2007-04-11 00:00:00,1438.87 2007-04-12 00:00:00,1447.8 2007-04-13 00:00:00,1452.85 2007-04-16 00:00:00,1468.33 2007-04-17 00:00:00,1471.48 2007-04-18 00:00:00,1472.5 2007-04-19 00:00:00,1470.73 2007-04-20 00:00:00,1484.35 2007-04-23 00:00:00,1480.93 2007-04-24 00:00:00,1480.41 2007-04-25 00:00:00,1495.42 2007-04-26 00:00:00,1494.25 2007-04-27 00:00:00,1494.07 2007-04-30 00:00:00,1482.37 2007-05-01 00:00:00,1486.3 2007-05-02 00:00:00,1495.92 2007-05-03 00:00:00,1502.39 2007-05-04 00:00:00,1505.62 2007-05-07 00:00:00,1509.48 2007-05-08 00:00:00,1507.72 2007-05-09 00:00:00,1512.58 2007-05-10 00:00:00,1491.47 2007-05-11 00:00:00,1505.85 2007-05-14 00:00:00,1503.15 2007-05-15 00:00:00,1501.19 2007-05-16 00:00:00,1514.14 2007-05-17 00:00:00,1512.75 2007-05-18 00:00:00,1522.75 2007-05-21 00:00:00,1525.1 2007-05-22 00:00:00,1524.12 2007-05-23 00:00:00,1522.28 2007-05-24 00:00:00,1507.51 2007-05-25 00:00:00,1515.73 2007-05-29 00:00:00,1518.11 2007-05-30 00:00:00,1530.23 2007-05-31 00:00:00,1530.62 2007-06-01 00:00:00,1536.34 2007-06-04 00:00:00,1539.18 2007-06-05 00:00:00,1530.95 2007-06-06 00:00:00,1517.38 2007-06-07 00:00:00,1490.72 2007-06-08 00:00:00,1507.67 2007-06-11 00:00:00,1509.12 2007-06-12 00:00:00,1493.0 2007-06-13 00:00:00,1515.67 2007-06-14 00:00:00,1522.97 2007-06-15 00:00:00,1532.91 2007-06-18 00:00:00,1531.05 2007-06-19 00:00:00,1533.7 2007-06-20 00:00:00,1512.84 2007-06-21 00:00:00,1522.19 2007-06-22 00:00:00,1502.56 2007-06-25 00:00:00,1497.74 2007-06-26 00:00:00,1492.89 2007-06-27 00:00:00,1506.34 2007-06-28 00:00:00,1505.71 2007-06-29 00:00:00,1503.35 2007-07-02 00:00:00,1519.43 2007-07-03 00:00:00,1524.87 2007-07-05 00:00:00,1525.4 2007-07-06 00:00:00,1530.44 2007-07-09 00:00:00,1531.85 2007-07-10 00:00:00,1510.12 2007-07-11 00:00:00,1518.76 2007-07-12 00:00:00,1547.7 2007-07-13 00:00:00,1552.5 2007-07-16 00:00:00,1549.52 2007-07-17 00:00:00,1549.37 2007-07-18 00:00:00,1546.17 2007-07-19 00:00:00,1553.08 2007-07-20 00:00:00,1534.1 2007-07-23 00:00:00,1541.57 2007-07-24 00:00:00,1511.04 2007-07-25 00:00:00,1518.09 2007-07-26 00:00:00,1482.66 2007-07-27 00:00:00,1458.95 2007-07-30 00:00:00,1473.91 2007-07-31 00:00:00,1455.27 2007-08-01 00:00:00,1465.81 2007-08-02 00:00:00,1472.2 2007-08-03 00:00:00,1433.06 2007-08-06 00:00:00,1467.67 2007-08-07 00:00:00,1476.71 2007-08-08 00:00:00,1497.49 2007-08-09 00:00:00,1453.09 2007-08-10 00:00:00,1453.64 2007-08-13 00:00:00,1452.92 2007-08-14 00:00:00,1426.54 2007-08-15 00:00:00,1406.7 2007-08-16 00:00:00,1411.27 2007-08-17 00:00:00,1445.94 2007-08-20 00:00:00,1445.55 2007-08-21 00:00:00,1447.12 2007-08-22 00:00:00,1464.07 2007-08-23 00:00:00,1462.5 2007-08-24 00:00:00,1479.37 2007-08-27 00:00:00,1466.79 2007-08-28 00:00:00,1432.36 2007-08-29 00:00:00,1463.76 2007-08-30 00:00:00,1457.64 2007-08-31 00:00:00,1473.99 2007-09-04 00:00:00,1489.42 2007-09-05 00:00:00,1472.29 2007-09-06 00:00:00,1478.55 2007-09-07 00:00:00,1453.55 2007-09-10 00:00:00,1451.7 2007-09-11 00:00:00,1471.49 2007-09-12 00:00:00,1471.56 2007-09-13 00:00:00,1483.95 2007-09-14 00:00:00,1484.25 2007-09-17 00:00:00,1476.65 2007-09-18 00:00:00,1519.78 2007-09-19 00:00:00,1529.03 2007-09-20 00:00:00,1518.75 2007-09-21 00:00:00,1525.75 2007-09-24 00:00:00,1517.73 2007-09-25 00:00:00,1517.21 2007-09-26 00:00:00,1525.42 2007-09-27 00:00:00,1531.38 2007-09-28 00:00:00,1526.75 2007-10-01 00:00:00,1547.04 2007-10-02 00:00:00,1546.63 2007-10-03 00:00:00,1539.59 2007-10-04 00:00:00,1542.84 2007-10-05 00:00:00,1557.59 2007-10-08 00:00:00,1552.58 2007-10-09 00:00:00,1565.15 2007-10-10 00:00:00,1562.47 2007-10-11 00:00:00,1554.41 2007-10-12 00:00:00,1561.8 2007-10-15 00:00:00,1548.71 2007-10-16 00:00:00,1538.53 2007-10-17 00:00:00,1541.24 2007-10-18 00:00:00,1540.08 2007-10-19 00:00:00,1500.63 2007-10-22 00:00:00,1506.33 2007-10-23 00:00:00,1519.59 2007-10-24 00:00:00,1515.88 2007-10-25 00:00:00,1514.4 2007-10-26 00:00:00,1535.28 2007-10-29 00:00:00,1540.98 2007-10-30 00:00:00,1531.02 2007-10-31 00:00:00,1549.38 2007-11-01 00:00:00,1508.44 2007-11-02 00:00:00,1509.65 2007-11-05 00:00:00,1502.17 2007-11-06 00:00:00,1520.27 2007-11-07 00:00:00,1475.62 2007-11-08 00:00:00,1474.77 2007-11-09 00:00:00,1453.7 2007-11-12 00:00:00,1439.18 2007-11-13 00:00:00,1481.05 2007-11-14 00:00:00,1470.58 2007-11-15 00:00:00,1451.15 2007-11-16 00:00:00,1458.74 2007-11-19 00:00:00,1433.27 2007-11-20 00:00:00,1439.7 2007-11-21 00:00:00,1416.77 2007-11-23 00:00:00,1440.7 2007-11-26 00:00:00,1407.22 2007-11-27 00:00:00,1428.23 2007-11-28 00:00:00,1469.02 2007-11-29 00:00:00,1469.72 2007-11-30 00:00:00,1481.14 2007-12-03 00:00:00,1472.42 2007-12-04 00:00:00,1462.79 2007-12-05 00:00:00,1485.01 2007-12-06 00:00:00,1507.34 2007-12-07 00:00:00,1504.66 2007-12-10 00:00:00,1515.96 2007-12-11 00:00:00,1477.65 2007-12-12 00:00:00,1486.59 2007-12-13 00:00:00,1488.41 2007-12-14 00:00:00,1467.95 2007-12-17 00:00:00,1445.9 2007-12-18 00:00:00,1454.98 2007-12-19 00:00:00,1453.0 2007-12-20 00:00:00,1460.12 2007-12-21 00:00:00,1484.46 2007-12-24 00:00:00,1496.45 2007-12-26 00:00:00,1497.66 2007-12-27 00:00:00,1476.27 2007-12-28 00:00:00,1478.49 2007-12-31 00:00:00,1468.36 2008-01-02 00:00:00,1447.16 2008-01-03 00:00:00,1447.16 2008-01-04 00:00:00,1411.63 2008-01-07 00:00:00,1416.18 2008-01-08 00:00:00,1390.19 2008-01-09 00:00:00,1409.13 2008-01-10 00:00:00,1420.33 2008-01-11 00:00:00,1401.02 2008-01-14 00:00:00,1416.25 2008-01-15 00:00:00,1380.95 2008-01-16 00:00:00,1373.2 2008-01-17 00:00:00,1333.25 2008-01-18 00:00:00,1325.19 2008-01-22 00:00:00,1310.5 2008-01-23 00:00:00,1338.6 2008-01-24 00:00:00,1352.07 2008-01-25 00:00:00,1330.61 2008-01-28 00:00:00,1353.96 2008-01-29 00:00:00,1362.3 2008-01-30 00:00:00,1355.81 2008-01-31 00:00:00,1378.55 2008-02-01 00:00:00,1395.42 2008-02-04 00:00:00,1380.82 2008-02-05 00:00:00,1336.64 2008-02-06 00:00:00,1326.45 2008-02-07 00:00:00,1336.91 2008-02-08 00:00:00,1331.29 2008-02-11 00:00:00,1339.13 2008-02-12 00:00:00,1348.86 2008-02-13 00:00:00,1367.21 2008-02-14 00:00:00,1348.86 2008-02-15 00:00:00,1349.99 2008-02-19 00:00:00,1348.78 2008-02-20 00:00:00,1360.03 2008-02-21 00:00:00,1342.53 2008-02-22 00:00:00,1353.11 2008-02-25 00:00:00,1371.8 2008-02-26 00:00:00,1381.29 2008-02-27 00:00:00,1380.02 2008-02-28 00:00:00,1367.68 2008-02-29 00:00:00,1330.63 2008-03-03 00:00:00,1331.34 2008-03-04 00:00:00,1326.75 2008-03-05 00:00:00,1333.7 2008-03-06 00:00:00,1304.34 2008-03-07 00:00:00,1293.37 2008-03-10 00:00:00,1273.37 2008-03-11 00:00:00,1320.65 2008-03-12 00:00:00,1308.77 2008-03-13 00:00:00,1315.48 2008-03-14 00:00:00,1288.14 2008-03-17 00:00:00,1276.6 2008-03-18 00:00:00,1330.74 2008-03-19 00:00:00,1298.42 2008-03-20 00:00:00,1329.51 2008-03-24 00:00:00,1349.88 2008-03-25 00:00:00,1352.99 2008-03-26 00:00:00,1341.13 2008-03-27 00:00:00,1325.76 2008-03-28 00:00:00,1315.22 2008-03-31 00:00:00,1322.7 2008-04-01 00:00:00,1370.18 2008-04-02 00:00:00,1367.53 2008-04-03 00:00:00,1369.31 2008-04-04 00:00:00,1370.4 2008-04-07 00:00:00,1372.54 2008-04-08 00:00:00,1365.54 2008-04-09 00:00:00,1354.49 2008-04-10 00:00:00,1360.55 2008-04-11 00:00:00,1332.83 2008-04-14 00:00:00,1328.32 2008-04-15 00:00:00,1334.43 2008-04-16 00:00:00,1364.71 2008-04-17 00:00:00,1365.56 2008-04-18 00:00:00,1390.33 2008-04-21 00:00:00,1388.17 2008-04-22 00:00:00,1375.94 2008-04-23 00:00:00,1379.93 2008-04-24 00:00:00,1388.82 2008-04-25 00:00:00,1397.84 2008-04-28 00:00:00,1396.37 2008-04-29 00:00:00,1390.94 2008-04-30 00:00:00,1385.59 2008-05-01 00:00:00,1409.34 2008-05-02 00:00:00,1413.9 2008-05-05 00:00:00,1407.49 2008-05-06 00:00:00,1418.26 2008-05-07 00:00:00,1392.57 2008-05-08 00:00:00,1397.68 2008-05-09 00:00:00,1388.28 2008-05-12 00:00:00,1403.58 2008-05-13 00:00:00,1403.04 2008-05-14 00:00:00,1408.66 2008-05-15 00:00:00,1423.57 2008-05-16 00:00:00,1425.35 2008-05-19 00:00:00,1426.63 2008-05-20 00:00:00,1413.4 2008-05-21 00:00:00,1390.71 2008-05-22 00:00:00,1394.35 2008-05-23 00:00:00,1375.93 2008-05-27 00:00:00,1385.35 2008-05-28 00:00:00,1390.84 2008-05-29 00:00:00,1398.26 2008-05-30 00:00:00,1400.38 2008-06-02 00:00:00,1385.67 2008-06-03 00:00:00,1377.65 2008-06-04 00:00:00,1377.2 2008-06-05 00:00:00,1404.05 2008-06-06 00:00:00,1360.68 2008-06-09 00:00:00,1361.76 2008-06-10 00:00:00,1358.44 2008-06-11 00:00:00,1335.49 2008-06-12 00:00:00,1339.87 2008-06-13 00:00:00,1360.03 2008-06-16 00:00:00,1360.14 2008-06-17 00:00:00,1350.93 2008-06-18 00:00:00,1337.81 2008-06-19 00:00:00,1342.83 2008-06-20 00:00:00,1317.93 2008-06-23 00:00:00,1318.0 2008-06-24 00:00:00,1314.29 2008-06-25 00:00:00,1321.97 2008-06-26 00:00:00,1283.15 2008-06-27 00:00:00,1278.38 2008-06-30 00:00:00,1280.0 2008-07-01 00:00:00,1284.91 2008-07-02 00:00:00,1261.52 2008-07-03 00:00:00,1262.9 2008-07-07 00:00:00,1252.31 2008-07-08 00:00:00,1273.7 2008-07-09 00:00:00,1244.69 2008-07-10 00:00:00,1253.39 2008-07-11 00:00:00,1239.49 2008-07-14 00:00:00,1228.3 2008-07-15 00:00:00,1214.91 2008-07-16 00:00:00,1245.36 2008-07-17 00:00:00,1260.32 2008-07-18 00:00:00,1260.68 2008-07-21 00:00:00,1260.0 2008-07-22 00:00:00,1277.0 2008-07-23 00:00:00,1282.19 2008-07-24 00:00:00,1252.54 2008-07-25 00:00:00,1257.76 2008-07-28 00:00:00,1234.37 2008-07-29 00:00:00,1263.2 2008-07-30 00:00:00,1284.26 2008-07-31 00:00:00,1267.38 2008-08-01 00:00:00,1260.31 2008-08-04 00:00:00,1249.01 2008-08-05 00:00:00,1284.88 2008-08-06 00:00:00,1289.19 2008-08-07 00:00:00,1266.07 2008-08-08 00:00:00,1296.32 2008-08-11 00:00:00,1305.32 2008-08-12 00:00:00,1289.59 2008-08-13 00:00:00,1285.83 2008-08-14 00:00:00,1292.93 2008-08-15 00:00:00,1298.2 2008-08-18 00:00:00,1278.6 2008-08-19 00:00:00,1266.69 2008-08-20 00:00:00,1274.54 2008-08-21 00:00:00,1277.72 2008-08-22 00:00:00,1292.2 2008-08-25 00:00:00,1266.84 2008-08-26 00:00:00,1271.51 2008-08-27 00:00:00,1281.66 2008-08-28 00:00:00,1300.68 2008-08-29 00:00:00,1282.83 2008-09-02 00:00:00,1277.58 2008-09-03 00:00:00,1274.98 2008-09-04 00:00:00,1236.83 2008-09-05 00:00:00,1242.31 2008-09-08 00:00:00,1267.79 2008-09-09 00:00:00,1224.51 2008-09-10 00:00:00,1232.04 2008-09-11 00:00:00,1249.05 2008-09-12 00:00:00,1251.7 2008-09-15 00:00:00,1192.7 2008-09-16 00:00:00,1213.6 2008-09-17 00:00:00,1156.39 2008-09-18 00:00:00,1206.51 2008-09-19 00:00:00,1255.08 2008-09-22 00:00:00,1207.09 2008-09-23 00:00:00,1188.22 2008-09-24 00:00:00,1185.87 2008-09-25 00:00:00,1209.18 2008-09-26 00:00:00,1213.27 2008-09-29 00:00:00,1106.42 2008-09-30 00:00:00,1166.36 2008-10-01 00:00:00,1161.06 2008-10-02 00:00:00,1114.28 2008-10-03 00:00:00,1099.23 2008-10-06 00:00:00,1056.89 2008-10-07 00:00:00,996.23 2008-10-08 00:00:00,984.94 2008-10-09 00:00:00,909.92 2008-10-10 00:00:00,899.22 2008-10-13 00:00:00,1003.35 2008-10-14 00:00:00,998.01 2008-10-15 00:00:00,907.84 2008-10-16 00:00:00,946.43 2008-10-17 00:00:00,940.55 2008-10-20 00:00:00,985.4 2008-10-21 00:00:00,955.05 2008-10-22 00:00:00,896.78 2008-10-23 00:00:00,908.11 2008-10-24 00:00:00,876.77 2008-10-27 00:00:00,848.92 2008-10-28 00:00:00,940.51 2008-10-29 00:00:00,930.09 2008-10-30 00:00:00,954.09 2008-10-31 00:00:00,968.75 2008-11-03 00:00:00,966.3 2008-11-04 00:00:00,1005.75 2008-11-05 00:00:00,952.77 2008-11-06 00:00:00,904.88 2008-11-07 00:00:00,930.99 2008-11-10 00:00:00,919.21 2008-11-11 00:00:00,898.95 2008-11-12 00:00:00,852.3 2008-11-13 00:00:00,911.29 2008-11-14 00:00:00,873.29 2008-11-17 00:00:00,850.75 2008-11-18 00:00:00,859.12 2008-11-19 00:00:00,806.58 2008-11-20 00:00:00,752.44 2008-11-21 00:00:00,800.03 2008-11-24 00:00:00,851.81 2008-11-25 00:00:00,857.39 2008-11-26 00:00:00,887.68 2008-11-28 00:00:00,896.24 2008-12-01 00:00:00,816.21 2008-12-02 00:00:00,848.81 2008-12-03 00:00:00,870.74 2008-12-04 00:00:00,845.22 2008-12-05 00:00:00,876.07 2008-12-08 00:00:00,909.7 2008-12-09 00:00:00,888.67 2008-12-10 00:00:00,899.24 2008-12-11 00:00:00,873.59 2008-12-12 00:00:00,879.73 2008-12-15 00:00:00,868.57 2008-12-16 00:00:00,913.18 2008-12-17 00:00:00,904.42 2008-12-18 00:00:00,885.28 2008-12-19 00:00:00,887.88 2008-12-22 00:00:00,871.63 2008-12-23 00:00:00,863.16 2008-12-24 00:00:00,868.15 2008-12-26 00:00:00,872.8 2008-12-29 00:00:00,869.42 2008-12-30 00:00:00,890.64 2008-12-31 00:00:00,903.25 2009-01-02 00:00:00,931.8 2009-01-05 00:00:00,927.45 2009-01-06 00:00:00,934.7 2009-01-07 00:00:00,906.65 2009-01-08 00:00:00,909.73 2009-01-09 00:00:00,890.35 2009-01-12 00:00:00,870.26 2009-01-13 00:00:00,871.79 2009-01-14 00:00:00,842.62 2009-01-15 00:00:00,843.74 2009-01-16 00:00:00,850.12 2009-01-20 00:00:00,805.22 2009-01-21 00:00:00,840.24 2009-01-22 00:00:00,827.5 2009-01-23 00:00:00,831.95 2009-01-26 00:00:00,836.57 2009-01-27 00:00:00,845.71 2009-01-28 00:00:00,874.09 2009-01-29 00:00:00,845.14 2009-01-30 00:00:00,825.88 2009-02-02 00:00:00,825.44 2009-02-03 00:00:00,838.51 2009-02-04 00:00:00,832.23 2009-02-05 00:00:00,845.85 2009-02-06 00:00:00,868.6 2009-02-09 00:00:00,869.89 2009-02-10 00:00:00,827.16 2009-02-11 00:00:00,833.74 2009-02-12 00:00:00,835.19 2009-02-13 00:00:00,826.84 2009-02-17 00:00:00,789.17 2009-02-18 00:00:00,788.42 2009-02-19 00:00:00,778.94 2009-02-20 00:00:00,770.05 2009-02-23 00:00:00,743.33 2009-02-24 00:00:00,773.14 2009-02-25 00:00:00,764.9 2009-02-26 00:00:00,752.83 2009-02-27 00:00:00,735.09 2009-03-02 00:00:00,700.82 2009-03-03 00:00:00,696.33 2009-03-04 00:00:00,712.87 2009-03-05 00:00:00,682.55 2009-03-06 00:00:00,683.38 2009-03-09 00:00:00,676.53 2009-03-10 00:00:00,719.6 2009-03-11 00:00:00,721.36 2009-03-12 00:00:00,750.74 2009-03-13 00:00:00,756.55 2009-03-16 00:00:00,753.89 2009-03-17 00:00:00,778.12 2009-03-18 00:00:00,794.35 2009-03-19 00:00:00,784.04 2009-03-20 00:00:00,768.54 2009-03-23 00:00:00,822.92 2009-03-24 00:00:00,806.12 2009-03-25 00:00:00,813.88 2009-03-26 00:00:00,832.86 2009-03-27 00:00:00,815.94 2009-03-30 00:00:00,787.53 2009-03-31 00:00:00,797.87 2009-04-01 00:00:00,811.08 2009-04-02 00:00:00,834.38 2009-04-03 00:00:00,842.5 2009-04-06 00:00:00,835.48 2009-04-07 00:00:00,815.55 2009-04-08 00:00:00,825.16 2009-04-09 00:00:00,856.56 2009-04-13 00:00:00,858.73 2009-04-14 00:00:00,841.5 2009-04-15 00:00:00,852.06 2009-04-16 00:00:00,865.3 2009-04-17 00:00:00,869.6 2009-04-20 00:00:00,832.39 2009-04-21 00:00:00,850.08 2009-04-22 00:00:00,843.55 2009-04-23 00:00:00,851.92 2009-04-24 00:00:00,866.23 2009-04-27 00:00:00,857.51 2009-04-28 00:00:00,855.16 2009-04-29 00:00:00,873.64 2009-04-30 00:00:00,872.81 2009-05-01 00:00:00,877.52 2009-05-04 00:00:00,907.24 2009-05-05 00:00:00,903.8 2009-05-06 00:00:00,919.53 2009-05-07 00:00:00,907.39 2009-05-08 00:00:00,929.23 2009-05-11 00:00:00,909.24 2009-05-12 00:00:00,908.35 2009-05-13 00:00:00,883.92 2009-05-14 00:00:00,893.07 2009-05-15 00:00:00,882.88 2009-05-18 00:00:00,909.71 2009-05-19 00:00:00,908.13 2009-05-20 00:00:00,903.47 2009-05-21 00:00:00,888.33 2009-05-22 00:00:00,887.0 2009-05-26 00:00:00,910.33 2009-05-27 00:00:00,893.06 2009-05-28 00:00:00,906.83 2009-05-29 00:00:00,919.14 2009-06-01 00:00:00,942.87 2009-06-02 00:00:00,944.74 2009-06-03 00:00:00,931.76 2009-06-04 00:00:00,942.46 2009-06-05 00:00:00,940.09 2009-06-08 00:00:00,939.14 2009-06-09 00:00:00,942.43 2009-06-10 00:00:00,939.15 2009-06-11 00:00:00,944.89 2009-06-12 00:00:00,946.21 2009-06-15 00:00:00,923.72 2009-06-16 00:00:00,911.97 2009-06-17 00:00:00,910.71 2009-06-18 00:00:00,918.37 2009-06-19 00:00:00,921.23 2009-06-22 00:00:00,893.04 2009-06-23 00:00:00,895.1 2009-06-24 00:00:00,900.94 2009-06-25 00:00:00,920.26 2009-06-26 00:00:00,918.9 2009-06-29 00:00:00,927.23 2009-06-30 00:00:00,919.32 2009-07-01 00:00:00,923.33 2009-07-02 00:00:00,896.42 2009-07-06 00:00:00,898.72 2009-07-07 00:00:00,881.03 2009-07-08 00:00:00,879.56 2009-07-09 00:00:00,882.68 2009-07-10 00:00:00,879.13 2009-07-13 00:00:00,901.05 2009-07-14 00:00:00,905.84 2009-07-15 00:00:00,932.68 2009-07-16 00:00:00,940.74 2009-07-17 00:00:00,940.38 2009-07-20 00:00:00,951.13 2009-07-21 00:00:00,954.58 2009-07-22 00:00:00,954.07 2009-07-23 00:00:00,976.29 2009-07-24 00:00:00,979.26 2009-07-27 00:00:00,982.18 2009-07-28 00:00:00,979.62 2009-07-29 00:00:00,975.15 2009-07-30 00:00:00,986.75 2009-07-31 00:00:00,987.48 2009-08-03 00:00:00,1002.63 2009-08-04 00:00:00,1005.65 2009-08-05 00:00:00,1002.72 2009-08-06 00:00:00,997.08 2009-08-07 00:00:00,1010.48 2009-08-10 00:00:00,1007.1 2009-08-11 00:00:00,994.35 2009-08-12 00:00:00,1005.81 2009-08-13 00:00:00,1012.73 2009-08-14 00:00:00,1004.09 2009-08-17 00:00:00,979.73 2009-08-18 00:00:00,989.67 2009-08-19 00:00:00,996.46 2009-08-20 00:00:00,1007.37 2009-08-21 00:00:00,1026.13 2009-08-24 00:00:00,1025.57 2009-08-25 00:00:00,1028.0 2009-08-26 00:00:00,1028.12 2009-08-27 00:00:00,1030.98 2009-08-28 00:00:00,1028.93 2009-08-31 00:00:00,1020.62 2009-09-01 00:00:00,998.04 2009-09-02 00:00:00,994.75 2009-09-03 00:00:00,1003.24 2009-09-04 00:00:00,1016.4 2009-09-08 00:00:00,1025.39 2009-09-09 00:00:00,1033.37 2009-09-10 00:00:00,1044.14 2009-09-11 00:00:00,1042.73 2009-09-14 00:00:00,1049.34 2009-09-15 00:00:00,1052.63 2009-09-16 00:00:00,1068.76 2009-09-17 00:00:00,1065.49 2009-09-18 00:00:00,1068.3 2009-09-21 00:00:00,1064.66 2009-09-22 00:00:00,1071.66 2009-09-23 00:00:00,1060.87 2009-09-24 00:00:00,1050.78 2009-09-25 00:00:00,1044.38 2009-09-28 00:00:00,1062.98 2009-09-29 00:00:00,1060.61 2009-09-30 00:00:00,1057.08 2009-10-01 00:00:00,1029.85 2009-10-02 00:00:00,1025.21 2009-10-05 00:00:00,1040.46 2009-10-06 00:00:00,1054.72 2009-10-07 00:00:00,1057.58 2009-10-08 00:00:00,1065.48 2009-10-09 00:00:00,1071.49 2009-10-12 00:00:00,1076.19 2009-10-13 00:00:00,1073.19 2009-10-14 00:00:00,1092.02 2009-10-15 00:00:00,1096.56 2009-10-16 00:00:00,1087.68 2009-10-19 00:00:00,1097.91 2009-10-20 00:00:00,1091.06 2009-10-21 00:00:00,1081.4 2009-10-22 00:00:00,1092.91 2009-10-23 00:00:00,1079.6 2009-10-26 00:00:00,1066.95 2009-10-27 00:00:00,1063.41 2009-10-28 00:00:00,1042.63 2009-10-29 00:00:00,1066.11 2009-10-30 00:00:00,1036.19 2009-11-02 00:00:00,1042.88 2009-11-03 00:00:00,1045.41 2009-11-04 00:00:00,1046.5 2009-11-05 00:00:00,1066.63 2009-11-06 00:00:00,1069.3 2009-11-09 00:00:00,1093.08 2009-11-10 00:00:00,1093.01 2009-11-11 00:00:00,1098.51 2009-11-12 00:00:00,1087.24 2009-11-13 00:00:00,1093.48 2009-11-16 00:00:00,1109.3 2009-11-17 00:00:00,1110.32 2009-11-18 00:00:00,1109.8 2009-11-19 00:00:00,1094.9 2009-11-20 00:00:00,1091.38 2009-11-23 00:00:00,1106.24 2009-11-24 00:00:00,1105.65 2009-11-25 00:00:00,1110.63 2009-11-27 00:00:00,1091.49 2009-11-30 00:00:00,1095.63 2009-12-01 00:00:00,1108.86 2009-12-02 00:00:00,1109.24 2009-12-03 00:00:00,1099.92 2009-12-04 00:00:00,1105.98 2009-12-07 00:00:00,1103.25 2009-12-08 00:00:00,1091.94 2009-12-09 00:00:00,1095.95 2009-12-10 00:00:00,1102.35 2009-12-11 00:00:00,1106.41 2009-12-14 00:00:00,1114.11 2009-12-15 00:00:00,1107.93 2009-12-16 00:00:00,1109.18 2009-12-17 00:00:00,1096.08 2009-12-18 00:00:00,1102.47 2009-12-21 00:00:00,1114.05 2009-12-22 00:00:00,1118.02 2009-12-23 00:00:00,1120.59 2009-12-24 00:00:00,1126.48 2009-12-28 00:00:00,1127.78 2009-12-29 00:00:00,1126.2 2009-12-30 00:00:00,1126.42 2009-12-31 00:00:00,1115.1 2010-01-04 00:00:00,1132.99 2010-01-05 00:00:00,1136.52 2010-01-06 00:00:00,1137.14 2010-01-07 00:00:00,1141.69 2010-01-08 00:00:00,1144.98 2010-01-11 00:00:00,1146.98 2010-01-12 00:00:00,1136.22 2010-01-13 00:00:00,1145.68 2010-01-14 00:00:00,1148.46 2010-01-15 00:00:00,1136.03 2010-01-19 00:00:00,1150.23 2010-01-20 00:00:00,1138.04 2010-01-21 00:00:00,1116.48 2010-01-22 00:00:00,1091.76 2010-01-25 00:00:00,1096.78 2010-01-26 00:00:00,1092.17 2010-01-27 00:00:00,1097.5 2010-01-28 00:00:00,1084.53 2010-01-29 00:00:00,1073.87 2010-02-01 00:00:00,1089.19 2010-02-02 00:00:00,1103.32 2010-02-03 00:00:00,1097.28 2010-02-04 00:00:00,1063.11 2010-02-05 00:00:00,1066.19 2010-02-08 00:00:00,1056.74 2010-02-09 00:00:00,1070.52 2010-02-10 00:00:00,1068.13 2010-02-11 00:00:00,1078.47 2010-02-12 00:00:00,1075.51 2010-02-16 00:00:00,1094.87 2010-02-17 00:00:00,1099.51 2010-02-18 00:00:00,1106.75 2010-02-19 00:00:00,1109.17 2010-02-22 00:00:00,1108.01 2010-02-23 00:00:00,1094.6 2010-02-24 00:00:00,1105.24 2010-02-25 00:00:00,1102.94 2010-02-26 00:00:00,1104.49 2010-03-01 00:00:00,1115.71 2010-03-02 00:00:00,1118.31 2010-03-03 00:00:00,1118.79 2010-03-04 00:00:00,1122.97 2010-03-05 00:00:00,1138.7 2010-03-08 00:00:00,1138.5 2010-03-09 00:00:00,1140.45 2010-03-10 00:00:00,1145.61 2010-03-11 00:00:00,1150.24 2010-03-12 00:00:00,1149.99 2010-03-15 00:00:00,1150.51 2010-03-16 00:00:00,1159.46 2010-03-17 00:00:00,1166.21 2010-03-18 00:00:00,1165.83 2010-03-19 00:00:00,1159.9 2010-03-22 00:00:00,1165.81 2010-03-23 00:00:00,1174.17 2010-03-24 00:00:00,1167.72 2010-03-25 00:00:00,1165.73 2010-03-26 00:00:00,1166.59 2010-03-29 00:00:00,1173.22 2010-03-30 00:00:00,1173.27 2010-03-31 00:00:00,1169.43 2010-04-01 00:00:00,1178.1 2010-04-05 00:00:00,1187.44 2010-04-06 00:00:00,1189.44 2010-04-07 00:00:00,1182.45 2010-04-08 00:00:00,1186.44 2010-04-09 00:00:00,1194.37 2010-04-12 00:00:00,1196.48 2010-04-13 00:00:00,1197.3 2010-04-14 00:00:00,1210.65 2010-04-15 00:00:00,1211.67 2010-04-16 00:00:00,1192.13 2010-04-19 00:00:00,1197.52 2010-04-20 00:00:00,1207.17 2010-04-21 00:00:00,1205.94 2010-04-22 00:00:00,1208.67 2010-04-23 00:00:00,1217.28 2010-04-26 00:00:00,1212.05 2010-04-27 00:00:00,1183.71 2010-04-28 00:00:00,1191.36 2010-04-29 00:00:00,1206.78 2010-04-30 00:00:00,1186.69 2010-05-03 00:00:00,1202.26 2010-05-04 00:00:00,1173.6 2010-05-05 00:00:00,1165.87 2010-05-06 00:00:00,1128.15 2010-05-07 00:00:00,1110.88 2010-05-10 00:00:00,1159.73 2010-05-11 00:00:00,1155.79 2010-05-12 00:00:00,1171.67 2010-05-13 00:00:00,1157.44 2010-05-14 00:00:00,1135.68 2010-05-17 00:00:00,1136.94 2010-05-18 00:00:00,1120.8 2010-05-19 00:00:00,1115.05 2010-05-20 00:00:00,1071.59 2010-05-21 00:00:00,1087.69 2010-05-24 00:00:00,1073.65 2010-05-25 00:00:00,1074.03 2010-05-26 00:00:00,1067.95 2010-05-27 00:00:00,1103.06 2010-05-28 00:00:00,1089.41 2010-06-01 00:00:00,1070.71 2010-06-02 00:00:00,1098.38 2010-06-03 00:00:00,1102.83 2010-06-04 00:00:00,1064.88 2010-06-07 00:00:00,1050.47 2010-06-08 00:00:00,1062.0 2010-06-09 00:00:00,1055.69 2010-06-10 00:00:00,1086.84 2010-06-11 00:00:00,1091.6 2010-06-14 00:00:00,1089.63 2010-06-15 00:00:00,1115.23 2010-06-16 00:00:00,1114.61 2010-06-17 00:00:00,1116.04 2010-06-18 00:00:00,1117.51 2010-06-21 00:00:00,1113.2 2010-06-22 00:00:00,1095.31 2010-06-23 00:00:00,1092.04 2010-06-24 00:00:00,1073.69 2010-06-25 00:00:00,1076.76 2010-06-28 00:00:00,1074.57 2010-06-29 00:00:00,1041.24 2010-06-30 00:00:00,1030.71 2010-07-01 00:00:00,1027.37 2010-07-02 00:00:00,1022.58 2010-07-06 00:00:00,1028.06 2010-07-07 00:00:00,1060.27 2010-07-08 00:00:00,1070.25 2010-07-09 00:00:00,1077.96 2010-07-12 00:00:00,1078.75 2010-07-13 00:00:00,1095.34 2010-07-14 00:00:00,1095.17 2010-07-15 00:00:00,1096.48 2010-07-16 00:00:00,1064.88 2010-07-19 00:00:00,1071.25 2010-07-20 00:00:00,1083.48 2010-07-21 00:00:00,1069.59 2010-07-22 00:00:00,1093.67 2010-07-23 00:00:00,1102.66 2010-07-26 00:00:00,1115.01 2010-07-27 00:00:00,1113.84 2010-07-28 00:00:00,1106.13 2010-07-29 00:00:00,1101.53 2010-07-30 00:00:00,1101.6 2010-08-02 00:00:00,1125.86 2010-08-03 00:00:00,1120.46 2010-08-04 00:00:00,1127.24 2010-08-05 00:00:00,1125.81 2010-08-06 00:00:00,1121.64 2010-08-09 00:00:00,1127.79 2010-08-10 00:00:00,1121.06 2010-08-11 00:00:00,1089.47 2010-08-12 00:00:00,1083.61 2010-08-13 00:00:00,1079.25 2010-08-16 00:00:00,1079.38 2010-08-17 00:00:00,1092.54 2010-08-18 00:00:00,1094.16 2010-08-19 00:00:00,1075.63 2010-08-20 00:00:00,1071.69 2010-08-23 00:00:00,1067.36 2010-08-24 00:00:00,1051.87 2010-08-25 00:00:00,1055.33 2010-08-26 00:00:00,1047.22 2010-08-27 00:00:00,1064.59 2010-08-30 00:00:00,1048.92 2010-08-31 00:00:00,1049.33 2010-09-01 00:00:00,1080.29 2010-09-02 00:00:00,1090.1 2010-09-03 00:00:00,1104.51 2010-09-07 00:00:00,1091.84 2010-09-08 00:00:00,1098.87 2010-09-09 00:00:00,1104.18 2010-09-10 00:00:00,1109.55 2010-09-13 00:00:00,1121.9 2010-09-14 00:00:00,1121.1 2010-09-15 00:00:00,1125.07 2010-09-16 00:00:00,1124.66 2010-09-17 00:00:00,1125.59 2010-09-20 00:00:00,1142.71 2010-09-21 00:00:00,1139.78 2010-09-22 00:00:00,1134.28 2010-09-23 00:00:00,1124.83 2010-09-24 00:00:00,1148.67 2010-09-27 00:00:00,1142.16 2010-09-28 00:00:00,1147.7 2010-09-29 00:00:00,1144.73 2010-09-30 00:00:00,1141.2 2010-10-01 00:00:00,1146.24 2010-10-04 00:00:00,1137.03 2010-10-05 00:00:00,1160.75 2010-10-06 00:00:00,1159.97 2010-10-07 00:00:00,1158.06 2010-10-08 00:00:00,1165.15 2010-10-11 00:00:00,1165.32 2010-10-12 00:00:00,1169.77 2010-10-13 00:00:00,1178.1 2010-10-14 00:00:00,1173.81 2010-10-15 00:00:00,1176.19 2010-10-18 00:00:00,1184.71 2010-10-19 00:00:00,1165.9 2010-10-20 00:00:00,1178.17 2010-10-21 00:00:00,1180.26 2010-10-22 00:00:00,1183.08 2010-10-25 00:00:00,1185.62 2010-10-26 00:00:00,1185.64 2010-10-27 00:00:00,1182.45 2010-10-28 00:00:00,1183.78 2010-10-29 00:00:00,1183.26 2010-11-01 00:00:00,1184.38 2010-11-02 00:00:00,1193.57 2010-11-03 00:00:00,1197.96 2010-11-04 00:00:00,1221.06 2010-11-05 00:00:00,1225.85 2010-11-08 00:00:00,1223.25 2010-11-09 00:00:00,1213.4 2010-11-10 00:00:00,1218.71 2010-11-11 00:00:00,1213.54 2010-11-12 00:00:00,1199.21 2010-11-15 00:00:00,1197.75 2010-11-16 00:00:00,1178.34 2010-11-17 00:00:00,1178.59 2010-11-18 00:00:00,1196.69 2010-11-19 00:00:00,1199.73 2010-11-22 00:00:00,1197.84 2010-11-23 00:00:00,1180.73 2010-11-24 00:00:00,1198.35 2010-11-26 00:00:00,1189.4 2010-11-29 00:00:00,1187.76 2010-11-30 00:00:00,1180.55 2010-12-01 00:00:00,1206.07 2010-12-02 00:00:00,1221.53 2010-12-03 00:00:00,1224.71 2010-12-06 00:00:00,1223.12 2010-12-07 00:00:00,1223.75 2010-12-08 00:00:00,1228.28 2010-12-09 00:00:00,1233.0 2010-12-10 00:00:00,1240.4 2010-12-13 00:00:00,1240.46 2010-12-14 00:00:00,1241.59 2010-12-15 00:00:00,1235.23 2010-12-16 00:00:00,1242.87 2010-12-17 00:00:00,1243.91 2010-12-20 00:00:00,1247.08 2010-12-21 00:00:00,1254.6 2010-12-22 00:00:00,1258.84 2010-12-23 00:00:00,1256.77 2010-12-27 00:00:00,1257.54 2010-12-28 00:00:00,1258.51 2010-12-29 00:00:00,1259.78 2010-12-30 00:00:00,1257.88 2010-12-31 00:00:00,1257.64 2011-01-03 00:00:00,1271.87 2011-01-04 00:00:00,1270.2 2011-01-05 00:00:00,1276.56 2011-01-06 00:00:00,1273.85 2011-01-07 00:00:00,1271.5 2011-01-10 00:00:00,1269.75 2011-01-11 00:00:00,1274.48 2011-01-12 00:00:00,1285.96 2011-01-13 00:00:00,1283.76 2011-01-14 00:00:00,1293.24 2011-01-18 00:00:00,1295.02 2011-01-19 00:00:00,1281.92 2011-01-20 00:00:00,1280.26 2011-01-21 00:00:00,1283.35 2011-01-24 00:00:00,1290.84 2011-01-25 00:00:00,1291.18 2011-01-26 00:00:00,1296.63 2011-01-27 00:00:00,1299.54 2011-01-28 00:00:00,1276.34 2011-01-31 00:00:00,1286.12 2011-02-01 00:00:00,1307.59 2011-02-02 00:00:00,1304.03 2011-02-03 00:00:00,1307.1 2011-02-04 00:00:00,1310.87 2011-02-07 00:00:00,1319.05 2011-02-08 00:00:00,1324.57 2011-02-09 00:00:00,1320.88 2011-02-10 00:00:00,1321.87 2011-02-11 00:00:00,1329.15 2011-02-14 00:00:00,1332.32 2011-02-15 00:00:00,1328.01 2011-02-16 00:00:00,1336.32 2011-02-17 00:00:00,1340.43 2011-02-18 00:00:00,1343.01 2011-02-22 00:00:00,1315.44 2011-02-23 00:00:00,1307.4 2011-02-24 00:00:00,1306.1 2011-02-25 00:00:00,1319.88 2011-02-28 00:00:00,1327.22 2011-03-01 00:00:00,1306.33 2011-03-02 00:00:00,1308.44 2011-03-03 00:00:00,1330.97 2011-03-04 00:00:00,1321.15 2011-03-07 00:00:00,1310.13 2011-03-08 00:00:00,1321.82 2011-03-09 00:00:00,1320.02 2011-03-10 00:00:00,1295.11 2011-03-11 00:00:00,1304.28 2011-03-14 00:00:00,1296.39 2011-03-15 00:00:00,1281.87 2011-03-16 00:00:00,1256.88 2011-03-17 00:00:00,1273.72 2011-03-18 00:00:00,1279.21 2011-03-21 00:00:00,1298.38 2011-03-22 00:00:00,1293.77 2011-03-23 00:00:00,1297.54 2011-03-24 00:00:00,1309.66 2011-03-25 00:00:00,1313.8 2011-03-28 00:00:00,1310.19 2011-03-29 00:00:00,1319.44 2011-03-30 00:00:00,1328.26 2011-03-31 00:00:00,1325.83 2011-04-01 00:00:00,1332.41 2011-04-04 00:00:00,1332.87 2011-04-05 00:00:00,1332.63 2011-04-06 00:00:00,1335.54 2011-04-07 00:00:00,1333.51 2011-04-08 00:00:00,1328.17 2011-04-11 00:00:00,1324.46 2011-04-12 00:00:00,1314.16 2011-04-13 00:00:00,1314.41 2011-04-14 00:00:00,1314.52 2011-04-15 00:00:00,1319.68 2011-04-18 00:00:00,1305.14 2011-04-19 00:00:00,1312.62 2011-04-20 00:00:00,1330.36 2011-04-21 00:00:00,1337.38 2011-04-25 00:00:00,1335.25 2011-04-26 00:00:00,1347.24 2011-04-27 00:00:00,1355.66 2011-04-28 00:00:00,1360.48 2011-04-29 00:00:00,1363.61 2011-05-02 00:00:00,1361.22 2011-05-03 00:00:00,1356.62 2011-05-04 00:00:00,1347.32 2011-05-05 00:00:00,1335.1 2011-05-06 00:00:00,1340.2 2011-05-09 00:00:00,1346.29 2011-05-10 00:00:00,1357.16 2011-05-11 00:00:00,1342.08 2011-05-12 00:00:00,1348.65 2011-05-13 00:00:00,1337.77 2011-05-16 00:00:00,1329.47 2011-05-17 00:00:00,1328.98 2011-05-18 00:00:00,1340.68 2011-05-19 00:00:00,1343.6 2011-05-20 00:00:00,1333.27 2011-05-23 00:00:00,1317.37 2011-05-24 00:00:00,1316.28 2011-05-25 00:00:00,1320.47 2011-05-26 00:00:00,1325.69 2011-05-27 00:00:00,1331.1 2011-05-31 00:00:00,1345.2 2011-06-01 00:00:00,1314.55 2011-06-02 00:00:00,1312.94 2011-06-03 00:00:00,1300.16 2011-06-06 00:00:00,1286.17 2011-06-07 00:00:00,1284.94 2011-06-08 00:00:00,1279.56 2011-06-09 00:00:00,1289.0 2011-06-10 00:00:00,1270.98 2011-06-13 00:00:00,1271.83 2011-06-14 00:00:00,1287.87 2011-06-15 00:00:00,1265.42 2011-06-16 00:00:00,1267.64 2011-06-17 00:00:00,1271.5 2011-06-20 00:00:00,1278.36 2011-06-21 00:00:00,1295.52 2011-06-22 00:00:00,1287.14 2011-06-23 00:00:00,1283.5 2011-06-24 00:00:00,1268.45 2011-06-27 00:00:00,1280.1 2011-06-28 00:00:00,1296.67 2011-06-29 00:00:00,1307.41 2011-06-30 00:00:00,1320.64 2011-07-01 00:00:00,1339.67 2011-07-05 00:00:00,1337.88 2011-07-06 00:00:00,1339.22 2011-07-07 00:00:00,1353.22 2011-07-08 00:00:00,1343.8 2011-07-11 00:00:00,1319.49 2011-07-12 00:00:00,1313.64 2011-07-13 00:00:00,1317.72 2011-07-14 00:00:00,1308.87 2011-07-15 00:00:00,1316.14 2011-07-18 00:00:00,1305.44 2011-07-19 00:00:00,1326.73 2011-07-20 00:00:00,1325.84 2011-07-21 00:00:00,1343.8 2011-07-22 00:00:00,1345.02 2011-07-25 00:00:00,1337.43 2011-07-26 00:00:00,1331.94 2011-07-27 00:00:00,1304.89 2011-07-28 00:00:00,1300.67 2011-07-29 00:00:00,1292.28 2011-08-01 00:00:00,1286.94 2011-08-02 00:00:00,1254.05 2011-08-03 00:00:00,1260.34 2011-08-04 00:00:00,1200.07 2011-08-05 00:00:00,1199.38 2011-08-08 00:00:00,1119.46 2011-08-09 00:00:00,1172.53 2011-08-10 00:00:00,1120.76 2011-08-11 00:00:00,1172.64 2011-08-12 00:00:00,1178.81 2011-08-15 00:00:00,1204.49 2011-08-16 00:00:00,1192.76 2011-08-17 00:00:00,1193.89 2011-08-18 00:00:00,1140.65 2011-08-19 00:00:00,1123.53 2011-08-22 00:00:00,1123.82 2011-08-23 00:00:00,1162.35 2011-08-24 00:00:00,1177.6 2011-08-25 00:00:00,1159.27 2011-08-26 00:00:00,1176.8 2011-08-29 00:00:00,1210.08 2011-08-30 00:00:00,1212.92 2011-08-31 00:00:00,1218.89 2011-09-01 00:00:00,1204.42 2011-09-02 00:00:00,1173.97 2011-09-06 00:00:00,1165.24 2011-09-07 00:00:00,1198.62 2011-09-08 00:00:00,1185.9 2011-09-09 00:00:00,1154.23 2011-09-12 00:00:00,1162.27 2011-09-13 00:00:00,1172.87 2011-09-14 00:00:00,1188.68 2011-09-15 00:00:00,1209.11 2011-09-16 00:00:00,1216.01 2011-09-19 00:00:00,1204.09 2011-09-20 00:00:00,1202.09 2011-09-21 00:00:00,1166.76 2011-09-22 00:00:00,1129.56 2011-09-23 00:00:00,1136.43 2011-09-26 00:00:00,1162.95 2011-09-27 00:00:00,1175.38 2011-09-28 00:00:00,1151.06 2011-09-29 00:00:00,1160.4 2011-09-30 00:00:00,1131.42 2011-10-03 00:00:00,1099.23 2011-10-04 00:00:00,1123.95 2011-10-05 00:00:00,1144.03 2011-10-06 00:00:00,1164.97 2011-10-07 00:00:00,1155.46 2011-10-10 00:00:00,1194.89 2011-10-11 00:00:00,1195.54 2011-10-12 00:00:00,1207.25 2011-10-13 00:00:00,1203.66 2011-10-14 00:00:00,1224.58 ================================================ FILE: 5.data-visualization/1.matplotlib/matplotlib-beginner.ipynb ================================================ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# matplotlib学习之基本使用" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 目录\n", " ### 1.figure学习\n", " ### 2.设置坐标轴\n", " ### 3.Legend 图例\n", " ### 4.Annotation 标注\n", " ### 5.tick能见度\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1.figure学习" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "import numpy as np\n", "#导入包" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "x=np.linspace(-3,3,50)#产生-3到3之间50个点" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "y1=2*x+1#定义函数\n", "y2=x**2" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# 绘制直线\n", "plt.figure()\n", "plt.plot(x,y1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "曲线与直线绘制一块" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# num=3表示图片上方标题 变为figure3,figsize=(长,宽)设置figure大小\n", "plt.figure(num=3,figsize=(8,5))\n", "plt.plot(x,y2)\n", "# 红色虚线直线宽度默认1.0\n", "plt.plot(x,y1,color='red',linewidth=1.0,linestyle='--')\n", "plt.show()\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2.设置坐标轴" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[-1. -0.25 0.5 1.25 2. ]\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# num=3表示图片上方标题 变为figure3,figsize=(长,宽)设置figure大小\n", "plt.figure(num=3,figsize=(8,5))\n", "plt.plot(x,y2)\n", "# 红色虚线直线宽度默认1.0\n", "plt.plot(x,y1,color='red',linewidth=1.0,linestyle='--')\n", "\n", "plt.xlim((-1,2))#设置x轴范围\n", "plt.ylim((-2,3))#设置轴y范围\n", "\n", "#设置坐标轴含义, 注:英文直接写,中文需要后面加上fontproperties属性\n", "plt.xlabel(u'价格',fontproperties='SimHei')\n", "plt.ylabel(u'利润',fontproperties='SimHei')\n", "\n", "# 设置x轴刻度\n", "# -1到2区间,5个点,4个区间,平均分:[-1.,-0.25,0.5,1.25,2.]\n", "new_ticks=np.linspace(-1,2,5)\n", "print(new_ticks)\n", "plt.xticks(new_ticks)\n", "\n", "# 设置y轴刻度\n", "'''\n", "设置对应坐标用汉字或英文表示,后面的属性fontproperties表示中文可见,不乱码,\n", "内部英文$$表示将英文括起来,r表示正则匹配,通过这个方式将其变为好看的字体\n", "如果要显示特殊字符,比如阿尔法,则用转意符\\alpha,前面的\\ 表示空格转意\n", "'''\n", "plt.yticks([-2,-1.8,-1,1.22,3.],\n", " ['非常糟糕','糟糕',r'$good\\ \\alpha$',r'$really\\ good$','超级好'],fontproperties='SimHei')\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# num=3表示图片上方标题 变为figure3,figsize=(长,宽)设置figure大小\n", "plt.figure(num=3,figsize=(8,5))\n", "plt.plot(x,y2)\n", "# 红色虚线直线宽度默认1.0\n", "plt.plot(x,y1,color='red',linewidth=1.0,linestyle='--')\n", "# 设置边框/坐标轴\n", "gca='get current axis/获取当前轴线'\n", "ax=plt.gca()\n", "# spines就是脊梁,即四个边框\n", "# 取消右边与上边轴\n", "ax.spines['right'].set_color('none')\n", "ax.spines['top'].set_color('none')\n", "\n", "\n", "# matlibplot并没有设置默认的x轴与y轴方向,下面就开始设置默认轴\n", "ax.xaxis.set_ticks_position('bottom')\n", "ax.yaxis.set_ticks_position('left')\n", "\n", "\n", "# 设置坐标原点\n", "# 实现将(0,-1)设为坐标原点\n", "# 设置y轴上-1为坐标原点的y点,把x轴放置再-1处\n", "ax.spines['bottom'].set_position(('data',-1)) # 也可以是('axes',0.1)后面是百分比,相当于定位到10%处\n", "# 设置x轴上0为坐标原点的x点,将y轴移置0处\n", "ax.spines['left'].set_position(('data',0))\n", "\n", "# 再写一遍以下代码,因为以上使用set_position后,中文会显示不出来\n", "\n", "plt.yticks([-2,-1.8,-1,1.22,3.],\n", " ['非常糟糕','糟糕',r'$good\\ \\alpha$',r'$really\\ good$','超级好'],fontproperties='SimHei')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3.Legend 图例" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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ml3w94eGhjJx4kR69vzDYlMWLFjAoEGDjj/u0aMHCxcuJCYmhq5du/LWW28RERFBQkICAD179iQ1NZXJkyezcuVKfvjhB5YtW0ZqaipRUVEXXGNBUDARERHxA0FBQdxzzz088MADf/hadnY25cqVO/44NDSUTp068fLLL9O2bVvat2+PtZZbbrmFdevWsXnzZsqXL8/BgweJiYnh6aefpl27dlSsWLEoL+mUFExERCRgXEzHwheMGTPmtB2Te+6556Rjr7zyCiNHjmTMmDF88MEH1K5dmwEDBtCiRQvWrVvHCy+8wLhx45g0aRLDhw9n9uzZCiYiIiJy7oYMGcLDDz/8h+NZWVmUKVPmpGOTJk2iXr16fPrpp0RHR1OzZk169eoFQGRkJCtXruTdd9/lkUce4dVXX6Vhw4ZFcg1no2AiIiLiJ957771z7pjEx8cfv8dNVlYWCQkJ5ObmEhoaSoUKFYiJiWHYsGFMnDiRPn36FEn950LBRERExE/079//pFU5x+Tl5VG1atXjj3fu3Mnbb7/Nli1bWLduHdu3bycmJoavv/6azMxMhg0bRmpqKiVKlDg+N+Wll16iZ8+eNGnSpMiu51T8audXERGRQJKdnU1KSgr79+/H4/Hw3nvvsW3btj98TJ48Ga/Xy4EDB0hNTSUyMpJffvmFJk2a8P7777N3716mTJnCa6+9RsOGDcnIyGDFihWMHj2a3r1788wzz/D888+zfft2ty9ZHRMRERFftXz5crp06UKpUqUIDg5m2LBhDBs27LTPr127NllZWUybNo0ZM2ac9DVrLbNnz+b1119nwIABANxxxx0EBQXx8MMP079/f7p161ao13MuzIk3BZKCExcXZ5cvX+52GSIiAWvt2rWuD0sUJ2f7eRpj4q21F72nvYZyRERExGcomIiIiIjPUDARERERn6FgIiIiIj5DwURERER8hoKJiIiI+AwFExERET/l8XjIzMw843OSkpJOeuz1epk3bx67d+8uzNIumIKJiIiIHwkNDWXWrFkAzJkzh7Jly+LxeE753O3bt9O6dWtmz559/FhQUBA33HADc+fOZc6cOYwfP75I6j5XCiYiIiJ+JCws7Pj9bcLDwwkODiY4OPiUz33ttdfo168f3bt3P+l4VFQUVapUoVatWowYMYKNGzcWet3nSsFERETEjwQFBR0PIsfuHnwqGzZsYMqUKYwaNYqZM2fy+OOPk5eXB0BIiHNHmkaNGvHFF1/wzTff4Cu7leteOSIiIj5s8ODBfPzxx1SpUgWAjIwMbrvtNkqWLElWVhYej4fatWsDkJaWRteuXfnoo4/o27cvL730ElFRUTz33HN07dqVJUuWsHbtWtLT07nvvvvIzMykbt26NGzYkObNm7t4lb9Rx0RERMSHlSpViiuuuOL4nYQjIiKYOnXq8bsKBwcHH//arbfeSmhoKPPnzychIYEnn3ySypUrY61l5MiRPPjggyQmJlKpUiWGDh3Krl27WLx4MR9++CGxsbFuXyqgjomIiIhPO938kdMJCgqiR48eLFy4kJiYGLp27cpbb71FREQECQkJAPTs2ZPU1FQmT57MypUr+eGHH1i2bBmpqalERUUVxmWce/2unl1ERKSoPf88GPPbR3y883Hiseefd55bvfpvx1q3do4NGXLyc1NS4IsvTj723nvOc0/1mkUgNDSUTp06MXr0aNq2bUv79u2x1tKrVy+aNm3K119/zSeffMK8efOoWrUqTz/9NLt27XI9lAAYa63bNRRLcXFx1lcmEomIBKK1a9fSpEkTt8u4aA8//DCjR48+HhpSUlKIioqiRIkSZGdnk5aWRnR0NAAHDhzguuuu47PPPuOVV17h+eefZ8yYMeTk5FC7dm327dtHixYtWLduHS+88AJLlixh0qRJPPPMM8yePZuGDRueto6z/TyNMfHW2riLvV51TERERHxcly5d2LlzJzt37iQiIoJp06axc+dOpk6dSnBw8PGv3Xbbbce/Z9KkSdSrV49PP/2UpUuX4vV66dWrF/Xq1aN9+/asXLmSd999l8GDB/Poo4+eMZQUJc0xERERKYbi4+OPLyfOysoiISGB3NxcQkNDqVChAjExMQwbNoyJEyfSp08fl6v9jTomIiIixczOnTt56qmnuP3224mNjaV69eo8+eST5OXlceDAAfr160dqaiolSpQ4vlnbSy+9xNq1a12uPAA7JsaJj8HW2jy3axERETmbvLw8FixYQI0aNQBnH5NevXodn2Pi8XiOf+3AgQNce+21VK9enV9++YWWLVvyyCOP0KpVK/bt28drr73GG2+8Qbt27VixYgVffvklvXv35qGHHuLll1+mVatWrs/LCahgYoxpA1QGrjTGbAX+BNQFwoCKwCrgHWA2MAMY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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "import numpy as np\n", "x=np.linspace(-3,3,50)\n", "y1=2*x+1\n", "y2=x**2\n", "# 绘制直线\n", "plt.figure()\n", "# plt.plot(x,y1)\n", "# 曲线与直线绘制一块\n", "# num=3表示图片上方标题 变为figure3,figsize=(长,宽)设置figure大小\n", "plt.figure(num=3,figsize=(8,5))\n", "\n", "# 设置x轴范围\n", "plt.xlim((-1,2))\n", "# 设置轴y范围\n", "plt.ylim((-2,3))\n", "# 设置坐标轴含义\n", "# 注:英文直接写,中文需要后面加上fontproperties属性\n", "plt.xlabel(u'价格',fontproperties='SimHei')\n", "plt.ylabel(u'利润',fontproperties='SimHei')\n", "\n", "# -1到2区间,5个点,4个区间,平均分:[-1.,-0.25,0.5,1.25,2.]\n", "new_ticks=np.linspace(-1,2,5)\n", "# print(new_ticks)\n", "plt.xticks(new_ticks)\n", "\n", "plt.yticks([-2,-1.8,-1,1.22,3.],\n", " ['非常糟糕','糟糕',r'$good\\ \\alpha$',r'$really\\ good$','超级好'],fontproperties='SimHei')\n", "\n", "# 设置legend图例\n", "\n", "l1,=plt.plot(x,y2) # 可添加label属性,只不过如果这里添加了,下面legend再添加,下面的就会覆盖此处的!\n", "# 红色虚线直线宽度默认1.0\n", "l2,=plt.plot(x,y1,color='red',linewidth=1.0,linestyle='--')\n", "'''\n", "prop={'family':'SimHei','size':15}显示中文\n", "legend(hadles=[,,],labels=[,,],loc='best/upper right/upper left/.../lower right')\n", "handles就是你给他添加legend的线,如果要用handles,则前面的plt.plot,必须用l1,形式(不要忘记逗号)\n", "此处labels会覆盖上述的plt.plot()的label\n", "loc默认是best,给你放在一个合适的位置上,如果你拉伸弹框,位置会跟着变,自动放置合适位置\n", "'''\n", "plt.legend(handles=[l1,l2],prop={'family':'SimHei','size':15},loc='lower right',labels=['直线','曲线'])\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4.Annotation 标注" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "import numpy as np\n", "x=np.linspace(-3,3,20)\n", "y=2*x+1\n", "# 绘制直线\n", "plt.figure(num=1,figsize=(8,5),)\n", "plt.plot(x,y)\n", "# gca='get current axis/获取当前轴线'\n", "ax=plt.gca()\n", "# spines就是脊梁,即四个边框\n", "# 取消右边与上边轴\n", "ax.spines['right'].set_color('none')\n", "ax.spines['top'].set_color('none')\n", "ax.xaxis.set_ticks_position('bottom')\n", "ax.spines['bottom'].set_position(('data',-0)) # 也可以是('axes',0.1)后面是百分比,相当于定位到10%处\n", "ax.yaxis.set_ticks_position('left')\n", "ax.spines['left'].set_position(('data',0))\n", "\n", "# 绘制特定散点\n", "x0=1\n", "y0=2*x0+1\n", "# plot散点图,上述plt.plot(x,y)变为plt.scatter(x,y)绘制出来就是散点图\n", "# s代表大小,b代表blue\n", "plt.scatter(x0,y0,s=50,color='b')\n", "# 把两个点放进去plot一下,画出垂直于x轴的一条线,[x0,x0]表示两个点的x,[0,y0]表示两个点的y\n", "\n", "\n", "# 绘制(x0,y0)垂直于x轴的线\n", "\n", "# k--表示黑色虚线,k代表黑色,--表示虚线,lw表示线宽\n", "plt.plot([x0,x0],[0,y0],'k--',lw=2.5)\n", "# 添加注释 annotate\n", "\n", "'''\n", "其中参数xycoords='data' 是说基于数据的值来选位置, xytext=(+30, -30) 和 textcoords='offset points'\n", "对于标注位置的描述 和 xy 偏差值, arrowprops是对图中箭头类型的一些设置.\n", "'''\n", "\n", "plt.annotate(r'$2x+1=%s$'%y0,xy=(x0,y0),xycoords='data',xytext=(+30,-30),textcoords='offset points',fontsize=16,arrowprops=dict(arrowstyle='->',connectionstyle='arc3,rad=.2'))\n", "# 添加注释 text\n", "\n", "# 其中-3.7, 3,是选取text的位置, 空格需要用到转字符\\ ,fontdict设置文本字体.\n", "plt.text(-3.7,3,r'$This\\ is\\ the\\ some\\ text.\\mu\\ \\sigma_i\\ \\alpha_t$',\n", " fontdict={'size':'16','color':'red'})\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 5.tick能见度" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "import numpy as np\n", "\n", "x = np.linspace(-3, 3, 50)\n", "y = 0.1*x\n", "\n", "plt.figure()\n", "# 设置 zorder 给 plot 在 z 轴方向排序\n", "plt.plot(x, y, linewidth=10, zorder=1)\n", "plt.ylim(-2, 2)\n", "ax = plt.gca()\n", "ax.spines['right'].set_color('none')\n", "ax.spines['top'].set_color('none')\n", "ax.spines['top'].set_color('none')\n", "ax.xaxis.set_ticks_position('bottom')\n", "ax.spines['bottom'].set_position(('data', 0))\n", "ax.yaxis.set_ticks_position('left')\n", "ax.spines['left'].set_position(('data', 0))\n", "\n", "\n", "# 调整坐标\n", "\n", "# 对被遮挡的图像调节相关透明度,本例中设置 x轴 和 y轴 的刻度数字进行透明度设置\n", "for label in ax.get_xticklabels()+ax.get_yticklabels():\n", " label.set_fontsize(12)\n", " '''\n", " 其中label.set_fontsize(12)重新调节字体大小,bbox设置目的内容的透明度相关参,\n", " facecolor调节 box 前景色,edgecolor 设置边框, 本处设置边框为无,alpha设置透明度.\n", " '''\n", " # 其中label.set_fontsize(12)重新调节字体大小,bbox设置目的内容的透明度相关参,\n", "# facecolor调节 box 前景色,edgecolor 设置边框, 本处设置边框为无,alpha设置透明度.\n", " label.set_bbox(dict(facecolor='white',edgecolor='none',alpha=0.7))\n", "\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 重要参考资料-A Brief matplotlib API Primer(一个简单的matplotlib API入门)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 这个内容来自《利用python进行数据分析第二版》,主要内容:\n", "\n", "### 1 Figures and Subplots(图和子图)\n", "### 2 Colors, Markers, and Line Styles(颜色,标记物,线样式)\n", "### 3 Ticks, Labels, and Legends(标记,标签,图例)\n", "### 4 Annotations and Drawing on a Subplot(注释和在subplot上画图)\n", "### 5 Saving Plots to File(把图保存为文件)\n", "### 6 matplotlib Configuration(matplotlib设置)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "要用Jupyter notebook进行可交互式的绘图,需要执行下面的语句,这样就可以直接在Notebook里绘图了。" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "%matplotlib notebook" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data = np.arange(10)#生成数据\n", "data" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "scrolled": true }, "outputs": [ { "data": { "application/javascript": [ "/* Put everything inside the global mpl namespace */\n", "window.mpl = {};\n", "\n", "\n", "mpl.get_websocket_type = function() {\n", " if (typeof(WebSocket) !== 'undefined') {\n", " return WebSocket;\n", " } else if (typeof(MozWebSocket) !== 'undefined') {\n", " return MozWebSocket;\n", " } else {\n", " alert('Your browser does not have WebSocket support.' +\n", " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", " 'Firefox 4 and 5 are also supported but you ' +\n", " 'have to enable WebSockets in about:config.');\n", " };\n", "}\n", "\n", "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", " this.id = figure_id;\n", "\n", " this.ws = websocket;\n", "\n", " this.supports_binary = (this.ws.binaryType != undefined);\n", "\n", " if (!this.supports_binary) {\n", " var warnings = document.getElementById(\"mpl-warnings\");\n", " if (warnings) {\n", " warnings.style.display = 'block';\n", " warnings.textContent = (\n", " \"This browser does not support binary websocket messages. \" +\n", " \"Performance may be slow.\");\n", " }\n", " }\n", "\n", " this.imageObj = new Image();\n", "\n", " this.context = undefined;\n", " this.message = undefined;\n", " this.canvas = undefined;\n", " this.rubberband_canvas = undefined;\n", " this.rubberband_context = undefined;\n", " this.format_dropdown = undefined;\n", "\n", " this.image_mode = 'full';\n", "\n", " this.root = $('
');\n", " this._root_extra_style(this.root)\n", " this.root.attr('style', 'display: inline-block');\n", "\n", " $(parent_element).append(this.root);\n", "\n", " this._init_header(this);\n", " this._init_canvas(this);\n", " this._init_toolbar(this);\n", "\n", " var fig = this;\n", "\n", " this.waiting = false;\n", "\n", " this.ws.onopen = function () {\n", " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", " fig.send_message(\"send_image_mode\", {});\n", " if (mpl.ratio != 1) {\n", " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", " }\n", " fig.send_message(\"refresh\", {});\n", " }\n", "\n", " this.imageObj.onload = function() {\n", " if (fig.image_mode == 'full') {\n", " // Full images could contain transparency (where diff images\n", " // almost always do), so we need to clear the canvas so that\n", " // there is no ghosting.\n", " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", " }\n", " fig.context.drawImage(fig.imageObj, 0, 0);\n", " };\n", "\n", " this.imageObj.onunload = function() {\n", " fig.ws.close();\n", " }\n", "\n", " this.ws.onmessage = this._make_on_message_function(this);\n", "\n", " this.ondownload = ondownload;\n", "}\n", "\n", "mpl.figure.prototype._init_header = function() {\n", " var titlebar = $(\n", " '
');\n", " var titletext = $(\n", " '
');\n", " titlebar.append(titletext)\n", " this.root.append(titlebar);\n", " this.header = titletext[0];\n", "}\n", "\n", "\n", "\n", "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", "\n", "}\n", "\n", "\n", "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", "\n", "}\n", "\n", "mpl.figure.prototype._init_canvas = function() {\n", " var fig = this;\n", "\n", " var canvas_div = $('
');\n", "\n", " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", "\n", " function canvas_keyboard_event(event) {\n", " return fig.key_event(event, event['data']);\n", " }\n", "\n", " canvas_div.keydown('key_press', canvas_keyboard_event);\n", " canvas_div.keyup('key_release', canvas_keyboard_event);\n", " this.canvas_div = canvas_div\n", " this._canvas_extra_style(canvas_div)\n", " this.root.append(canvas_div);\n", "\n", " var canvas = $('');\n", " canvas.addClass('mpl-canvas');\n", " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", "\n", " this.canvas = canvas[0];\n", " this.context = canvas[0].getContext(\"2d\");\n", "\n", " var backingStore = this.context.backingStorePixelRatio ||\n", "\tthis.context.webkitBackingStorePixelRatio ||\n", "\tthis.context.mozBackingStorePixelRatio ||\n", "\tthis.context.msBackingStorePixelRatio ||\n", "\tthis.context.oBackingStorePixelRatio ||\n", "\tthis.context.backingStorePixelRatio || 1;\n", "\n", " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", "\n", " var rubberband = $('');\n", " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", "\n", " var pass_mouse_events = true;\n", "\n", " canvas_div.resizable({\n", " start: function(event, ui) {\n", " pass_mouse_events = false;\n", " },\n", " resize: function(event, ui) {\n", " fig.request_resize(ui.size.width, ui.size.height);\n", " },\n", " stop: function(event, ui) {\n", " pass_mouse_events = true;\n", " fig.request_resize(ui.size.width, ui.size.height);\n", " },\n", " });\n", "\n", " function mouse_event_fn(event) {\n", " if (pass_mouse_events)\n", " return fig.mouse_event(event, event['data']);\n", " }\n", "\n", " rubberband.mousedown('button_press', mouse_event_fn);\n", " rubberband.mouseup('button_release', mouse_event_fn);\n", " // Throttle sequential mouse events to 1 every 20ms.\n", " rubberband.mousemove('motion_notify', mouse_event_fn);\n", "\n", " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", "\n", " canvas_div.on(\"wheel\", function (event) {\n", " event = event.originalEvent;\n", " event['data'] = 'scroll'\n", " if (event.deltaY < 0) {\n", " event.step = 1;\n", " } else {\n", " event.step = -1;\n", " }\n", " mouse_event_fn(event);\n", " });\n", "\n", " canvas_div.append(canvas);\n", " canvas_div.append(rubberband);\n", "\n", " this.rubberband = rubberband;\n", " this.rubberband_canvas = rubberband[0];\n", " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", " this.rubberband_context.strokeStyle = \"#000000\";\n", "\n", " this._resize_canvas = function(width, height) {\n", " // Keep the size of the canvas, canvas container, and rubber band\n", " // canvas in synch.\n", " canvas_div.css('width', width)\n", " canvas_div.css('height', height)\n", "\n", " canvas.attr('width', width * mpl.ratio);\n", " canvas.attr('height', height * mpl.ratio);\n", " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", "\n", " rubberband.attr('width', width);\n", " rubberband.attr('height', height);\n", " }\n", "\n", " // Set the figure to an initial 600x600px, this will subsequently be updated\n", " // upon first draw.\n", " this._resize_canvas(600, 600);\n", "\n", " // Disable right mouse context menu.\n", " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", " return false;\n", " });\n", "\n", " function set_focus () {\n", " canvas.focus();\n", " canvas_div.focus();\n", " }\n", "\n", " window.setTimeout(set_focus, 100);\n", "}\n", "\n", "mpl.figure.prototype._init_toolbar = function() {\n", " var fig = this;\n", "\n", " var nav_element = $('
')\n", " nav_element.attr('style', 'width: 100%');\n", " this.root.append(nav_element);\n", "\n", " // Define a callback function for later on.\n", " function toolbar_event(event) {\n", " return fig.toolbar_button_onclick(event['data']);\n", " }\n", " function toolbar_mouse_event(event) {\n", " return fig.toolbar_button_onmouseover(event['data']);\n", " }\n", "\n", " for(var toolbar_ind in mpl.toolbar_items) {\n", " var name = mpl.toolbar_items[toolbar_ind][0];\n", " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", " var image = mpl.toolbar_items[toolbar_ind][2];\n", " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", "\n", " if (!name) {\n", " // put a spacer in here.\n", " continue;\n", " }\n", " var button = $('');\n", " button.click(method_name, toolbar_event);\n", " button.mouseover(tooltip, toolbar_mouse_event);\n", " nav_element.append(button);\n", " }\n", "\n", " // Add the status bar.\n", " var status_bar = $('');\n", " nav_element.append(status_bar);\n", " this.message = status_bar[0];\n", "\n", " // Add the close button to the window.\n", " var buttongrp = $('
');\n", " var button = $('');\n", " button.click(function (evt) { fig.handle_close(fig, {}); } );\n", " button.mouseover('Stop Interaction', toolbar_mouse_event);\n", " buttongrp.append(button);\n", " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", " titlebar.prepend(buttongrp);\n", "}\n", "\n", "mpl.figure.prototype._root_extra_style = function(el){\n", " var fig = this\n", " el.on(\"remove\", function(){\n", "\tfig.close_ws(fig, {});\n", " });\n", "}\n", "\n", "mpl.figure.prototype._canvas_extra_style = function(el){\n", " // this is important to make the div 'focusable\n", " el.attr('tabindex', 0)\n", " // reach out to IPython and tell the keyboard manager to turn it's self\n", " // off when our div gets focus\n", "\n", " // location in version 3\n", " if (IPython.notebook.keyboard_manager) {\n", " IPython.notebook.keyboard_manager.register_events(el);\n", " }\n", " else {\n", " // location in version 2\n", " IPython.keyboard_manager.register_events(el);\n", " }\n", "\n", "}\n", "\n", "mpl.figure.prototype._key_event_extra = function(event, name) {\n", " var manager = IPython.notebook.keyboard_manager;\n", " if (!manager)\n", " manager = IPython.keyboard_manager;\n", "\n", " // Check for shift+enter\n", " if (event.shiftKey && event.which == 13) {\n", " this.canvas_div.blur();\n", " event.shiftKey = false;\n", " // Send a \"J\" for go to next cell\n", " event.which = 74;\n", " event.keyCode = 74;\n", " manager.command_mode();\n", " manager.handle_keydown(event);\n", " }\n", "}\n", "\n", "mpl.figure.prototype.handle_save = function(fig, msg) {\n", " fig.ondownload(fig, null);\n", "}\n", "\n", "\n", "mpl.find_output_cell = function(html_output) {\n", " // Return the cell and output element which can be found *uniquely* in the notebook.\n", " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", " // IPython event is triggered only after the cells have been serialised, which for\n", " // our purposes (turning an active figure into a static one), is too late.\n", " var cells = IPython.notebook.get_cells();\n", " var ncells = cells.length;\n", " for (var i=0; i= 3 moved mimebundle to data attribute of output\n", " data = data.data;\n", " }\n", " if (data['text/html'] == html_output) {\n", " return [cell, data, j];\n", " }\n", " }\n", " }\n", " }\n", "}\n", "\n", "// Register the function which deals with the matplotlib target/channel.\n", "// The kernel may be null if the page has been refreshed.\n", "if (IPython.notebook.kernel != null) {\n", " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", "}\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = plt.figure()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "如果实在ipython里执行,可以看到一个空白的绘图窗口出现,但是在jupyter中没有任何显示,除非我们输入一些命令。plt.figure有一些选择,其中figsize保证figure有固定的大小和长宽比,这样也方便保存到磁盘中。\n", "\n", "我们不能在一个空白的figure上绘图,必须要创建一个或更多的subplots(子图),用add_subplot:" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "ax1 = fig.add_subplot(2, 2, 1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "这行代码的意思是,figure是2x2(这样一共有4幅图),而且我们选中4个subplots(数字从1到4)中的第1个。如果要创建另外两个子图,可以输入:" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "ax2 = fig.add_subplot(2, 2, 2)\n", "ax3 = fig.add_subplot(2, 2, 3)" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "application/javascript": [ "/* Put everything inside the global mpl namespace */\n", "window.mpl = {};\n", "\n", "\n", "mpl.get_websocket_type = function() {\n", " if (typeof(WebSocket) !== 'undefined') {\n", " return WebSocket;\n", " } else if (typeof(MozWebSocket) !== 'undefined') {\n", " return MozWebSocket;\n", " } else {\n", " alert('Your browser does not have WebSocket support.' +\n", " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", " 'Firefox 4 and 5 are also supported but you ' +\n", " 'have to enable WebSockets in about:config.');\n", " };\n", "}\n", "\n", "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", " this.id = figure_id;\n", "\n", " this.ws = websocket;\n", "\n", " this.supports_binary = (this.ws.binaryType != undefined);\n", "\n", " if (!this.supports_binary) {\n", " var warnings = document.getElementById(\"mpl-warnings\");\n", " if (warnings) {\n", " warnings.style.display = 'block';\n", " warnings.textContent = (\n", " \"This browser does not support binary websocket messages. \" +\n", " \"Performance may be slow.\");\n", " }\n", " }\n", "\n", " this.imageObj = new Image();\n", "\n", " this.context = undefined;\n", " this.message = undefined;\n", " this.canvas = undefined;\n", " this.rubberband_canvas = undefined;\n", " this.rubberband_context = undefined;\n", " this.format_dropdown = undefined;\n", "\n", " this.image_mode = 'full';\n", "\n", " this.root = $('
');\n", " this._root_extra_style(this.root)\n", " this.root.attr('style', 'display: inline-block');\n", "\n", " $(parent_element).append(this.root);\n", "\n", " this._init_header(this);\n", " this._init_canvas(this);\n", " this._init_toolbar(this);\n", "\n", " var fig = this;\n", "\n", " this.waiting = false;\n", "\n", " this.ws.onopen = function () {\n", " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", " fig.send_message(\"send_image_mode\", {});\n", " if (mpl.ratio != 1) {\n", " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", " }\n", " fig.send_message(\"refresh\", {});\n", " }\n", "\n", " this.imageObj.onload = function() {\n", " if (fig.image_mode == 'full') {\n", " // Full images could contain transparency (where diff images\n", " // almost always do), so we need to clear the canvas so that\n", " // there is no ghosting.\n", " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", " }\n", " fig.context.drawImage(fig.imageObj, 0, 0);\n", " };\n", "\n", " this.imageObj.onunload = function() {\n", " fig.ws.close();\n", " }\n", "\n", " this.ws.onmessage = this._make_on_message_function(this);\n", "\n", " this.ondownload = ondownload;\n", "}\n", "\n", "mpl.figure.prototype._init_header = function() {\n", " var titlebar = $(\n", " '
');\n", " var titletext = $(\n", " '
');\n", " titlebar.append(titletext)\n", " this.root.append(titlebar);\n", " this.header = titletext[0];\n", "}\n", "\n", "\n", "\n", "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", "\n", "}\n", "\n", "\n", "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", "\n", "}\n", "\n", "mpl.figure.prototype._init_canvas = function() {\n", " var fig = this;\n", "\n", " var canvas_div = $('
');\n", "\n", " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", "\n", " function canvas_keyboard_event(event) {\n", " return fig.key_event(event, event['data']);\n", " }\n", "\n", " canvas_div.keydown('key_press', canvas_keyboard_event);\n", " canvas_div.keyup('key_release', canvas_keyboard_event);\n", " this.canvas_div = canvas_div\n", " this._canvas_extra_style(canvas_div)\n", " this.root.append(canvas_div);\n", "\n", " var canvas = $('');\n", " canvas.addClass('mpl-canvas');\n", " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", "\n", " this.canvas = canvas[0];\n", " this.context = canvas[0].getContext(\"2d\");\n", "\n", " var backingStore = this.context.backingStorePixelRatio ||\n", "\tthis.context.webkitBackingStorePixelRatio ||\n", "\tthis.context.mozBackingStorePixelRatio ||\n", "\tthis.context.msBackingStorePixelRatio ||\n", "\tthis.context.oBackingStorePixelRatio ||\n", "\tthis.context.backingStorePixelRatio || 1;\n", "\n", " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", "\n", " var rubberband = $('');\n", " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", "\n", " var pass_mouse_events = true;\n", "\n", " canvas_div.resizable({\n", " start: function(event, ui) {\n", " pass_mouse_events = false;\n", " },\n", " resize: function(event, ui) {\n", " fig.request_resize(ui.size.width, ui.size.height);\n", " },\n", " stop: function(event, ui) {\n", " pass_mouse_events = true;\n", " fig.request_resize(ui.size.width, ui.size.height);\n", " },\n", " });\n", "\n", " function mouse_event_fn(event) {\n", " if (pass_mouse_events)\n", " return fig.mouse_event(event, event['data']);\n", " }\n", "\n", " rubberband.mousedown('button_press', mouse_event_fn);\n", " rubberband.mouseup('button_release', mouse_event_fn);\n", " // Throttle sequential mouse events to 1 every 20ms.\n", " rubberband.mousemove('motion_notify', mouse_event_fn);\n", "\n", " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", "\n", " canvas_div.on(\"wheel\", function (event) {\n", " event = event.originalEvent;\n", " event['data'] = 'scroll'\n", " if (event.deltaY < 0) {\n", " event.step = 1;\n", " } else {\n", " event.step = -1;\n", " }\n", " mouse_event_fn(event);\n", " });\n", "\n", " canvas_div.append(canvas);\n", " canvas_div.append(rubberband);\n", "\n", " this.rubberband = rubberband;\n", " this.rubberband_canvas = rubberband[0];\n", " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", " this.rubberband_context.strokeStyle = \"#000000\";\n", "\n", " this._resize_canvas = function(width, height) {\n", " // Keep the size of the canvas, canvas container, and rubber band\n", " // canvas in synch.\n", " canvas_div.css('width', width)\n", " canvas_div.css('height', height)\n", "\n", " canvas.attr('width', width * mpl.ratio);\n", " canvas.attr('height', height * mpl.ratio);\n", " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", "\n", " rubberband.attr('width', width);\n", " rubberband.attr('height', height);\n", " }\n", "\n", " // Set the figure to an initial 600x600px, this will subsequently be updated\n", " // upon first draw.\n", " this._resize_canvas(600, 600);\n", "\n", " // Disable right mouse context menu.\n", " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", " return false;\n", " });\n", "\n", " function set_focus () {\n", " canvas.focus();\n", " canvas_div.focus();\n", " }\n", "\n", " window.setTimeout(set_focus, 100);\n", "}\n", "\n", "mpl.figure.prototype._init_toolbar = function() {\n", " var fig = this;\n", "\n", " var nav_element = $('
')\n", " nav_element.attr('style', 'width: 100%');\n", " this.root.append(nav_element);\n", "\n", " // Define a callback function for later on.\n", " function toolbar_event(event) {\n", " return fig.toolbar_button_onclick(event['data']);\n", " }\n", " function toolbar_mouse_event(event) {\n", " return fig.toolbar_button_onmouseover(event['data']);\n", " }\n", "\n", " for(var toolbar_ind in mpl.toolbar_items) {\n", " var name = mpl.toolbar_items[toolbar_ind][0];\n", " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", " var image = mpl.toolbar_items[toolbar_ind][2];\n", " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", "\n", " if (!name) {\n", " // put a spacer in here.\n", " continue;\n", " }\n", " var button = $('');\n", " button.click(method_name, toolbar_event);\n", " button.mouseover(tooltip, toolbar_mouse_event);\n", " nav_element.append(button);\n", " }\n", "\n", " // Add the status bar.\n", " var status_bar = $('');\n", " nav_element.append(status_bar);\n", " this.message = status_bar[0];\n", "\n", " // Add the close button to the window.\n", " var buttongrp = $('
');\n", " var button = $('');\n", " button.click(function (evt) { fig.handle_close(fig, {}); } );\n", " button.mouseover('Stop Interaction', toolbar_mouse_event);\n", " buttongrp.append(button);\n", " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", " titlebar.prepend(buttongrp);\n", "}\n", "\n", "mpl.figure.prototype._root_extra_style = function(el){\n", " var fig = this\n", " el.on(\"remove\", function(){\n", "\tfig.close_ws(fig, {});\n", " });\n", "}\n", "\n", "mpl.figure.prototype._canvas_extra_style = function(el){\n", " // this is important to make the div 'focusable\n", " el.attr('tabindex', 0)\n", " // reach out to IPython and tell the keyboard manager to turn it's self\n", " // off when our div gets focus\n", "\n", " // location in version 3\n", " if (IPython.notebook.keyboard_manager) {\n", " IPython.notebook.keyboard_manager.register_events(el);\n", " }\n", " else {\n", " // location in version 2\n", " IPython.keyboard_manager.register_events(el);\n", " }\n", "\n", "}\n", "\n", "mpl.figure.prototype._key_event_extra = function(event, name) {\n", " var manager = IPython.notebook.keyboard_manager;\n", " if (!manager)\n", " manager = IPython.keyboard_manager;\n", "\n", " // Check for shift+enter\n", " if (event.shiftKey && event.which == 13) {\n", " this.canvas_div.blur();\n", " event.shiftKey = false;\n", " // Send a \"J\" for go to next cell\n", " event.which = 74;\n", " event.keyCode = 74;\n", " manager.command_mode();\n", " manager.handle_keydown(event);\n", " }\n", "}\n", "\n", "mpl.figure.prototype.handle_save = function(fig, msg) {\n", " fig.ondownload(fig, null);\n", "}\n", "\n", "\n", "mpl.find_output_cell = function(html_output) {\n", " // Return the cell and output element which can be found *uniquely* in the notebook.\n", " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", " // IPython event is triggered only after the cells have been serialised, which for\n", " // our purposes (turning an active figure into a static one), is too late.\n", " var cells = IPython.notebook.get_cells();\n", " var ncells = cells.length;\n", " for (var i=0; i= 3 moved mimebundle to data attribute of output\n", " data = data.data;\n", " }\n", " if (data['text/html'] == html_output) {\n", " return [cell, data, j];\n", " }\n", " }\n", " }\n", " }\n", "}\n", "\n", "// Register the function which deals with the matplotlib target/channel.\n", "// The kernel may be null if the page has been refreshed.\n", "if (IPython.notebook.kernel != null) {\n", " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", "}\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = plt.figure() \n", "ax1 = fig.add_subplot(2, 2, 1) \n", "ax2 = fig.add_subplot(2, 2, 2) \n", "ax3 = fig.add_subplot(2, 2, 3)\n", "\n", "# 下面出现交互式界面后,不要关闭,运行之后的命令,可以看到最后一副图中出现了线" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "如果输入`plt.plot([1.5, 3.5, -2, 1.6])`这样的命令,matplotlib会把图画在最后一个figure的最后一个子图上。" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "plt.plot(np.random.randn(50).cumsum(), 'k--')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "'k--'是一个style(样式)选项,它表示使用黑色的虚线。在这里,fig_add_subplot返回的是一个AxesSubplot对象,我们可以直接在空白的subplot上绘图,直接在对应的AxesSubplot对象上调用方法即可:" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [], "source": [ "_ = ax1.hist(np.random.randn(100), bins=20, color='k', alpha=0.3)" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ax2.scatter(np.arange(30), np.arange(30) + 3 * np.random.randn(30))" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "application/javascript": [ "/* Put everything inside the global mpl namespace */\n", "window.mpl = {};\n", "\n", "\n", "mpl.get_websocket_type = function() {\n", " if (typeof(WebSocket) !== 'undefined') {\n", " return WebSocket;\n", " } else if (typeof(MozWebSocket) !== 'undefined') {\n", " return MozWebSocket;\n", " } else {\n", " alert('Your browser does not have WebSocket support.' +\n", " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", " 'Firefox 4 and 5 are also supported but you ' +\n", " 'have to enable WebSockets in about:config.');\n", " };\n", "}\n", "\n", "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", " this.id = figure_id;\n", "\n", " this.ws = websocket;\n", "\n", " this.supports_binary = (this.ws.binaryType != undefined);\n", "\n", " if (!this.supports_binary) {\n", " var warnings = document.getElementById(\"mpl-warnings\");\n", " if (warnings) {\n", " warnings.style.display = 'block';\n", " warnings.textContent = (\n", " \"This browser does not support binary websocket messages. \" +\n", " \"Performance may be slow.\");\n", " }\n", " }\n", "\n", " this.imageObj = new Image();\n", "\n", " this.context = undefined;\n", " this.message = undefined;\n", " this.canvas = undefined;\n", " this.rubberband_canvas = undefined;\n", " this.rubberband_context = undefined;\n", " this.format_dropdown = undefined;\n", "\n", " this.image_mode = 'full';\n", "\n", " this.root = $('
');\n", " this._root_extra_style(this.root)\n", " this.root.attr('style', 'display: inline-block');\n", "\n", " $(parent_element).append(this.root);\n", "\n", " this._init_header(this);\n", " this._init_canvas(this);\n", " this._init_toolbar(this);\n", "\n", " var fig = this;\n", "\n", " this.waiting = false;\n", "\n", " this.ws.onopen = function () {\n", " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", " fig.send_message(\"send_image_mode\", {});\n", " if (mpl.ratio != 1) {\n", " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", " }\n", " fig.send_message(\"refresh\", {});\n", " }\n", "\n", " this.imageObj.onload = function() {\n", " if (fig.image_mode == 'full') {\n", " // Full images could contain transparency (where diff images\n", " // almost always do), so we need to clear the canvas so that\n", " // there is no ghosting.\n", " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", " }\n", " fig.context.drawImage(fig.imageObj, 0, 0);\n", " };\n", "\n", " this.imageObj.onunload = function() {\n", " fig.ws.close();\n", " }\n", "\n", " this.ws.onmessage = this._make_on_message_function(this);\n", "\n", " this.ondownload = ondownload;\n", "}\n", "\n", "mpl.figure.prototype._init_header = function() {\n", " var titlebar = $(\n", " '
');\n", " var titletext = $(\n", " '
');\n", " titlebar.append(titletext)\n", " this.root.append(titlebar);\n", " this.header = titletext[0];\n", "}\n", "\n", "\n", "\n", "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", "\n", "}\n", "\n", "\n", "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", "\n", "}\n", "\n", "mpl.figure.prototype._init_canvas = function() {\n", " var fig = this;\n", "\n", " var canvas_div = $('
');\n", "\n", " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", "\n", " function canvas_keyboard_event(event) {\n", " return fig.key_event(event, event['data']);\n", " }\n", "\n", " canvas_div.keydown('key_press', canvas_keyboard_event);\n", " canvas_div.keyup('key_release', canvas_keyboard_event);\n", " this.canvas_div = canvas_div\n", " this._canvas_extra_style(canvas_div)\n", " this.root.append(canvas_div);\n", "\n", " var canvas = $('');\n", " canvas.addClass('mpl-canvas');\n", " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", "\n", " this.canvas = canvas[0];\n", " this.context = canvas[0].getContext(\"2d\");\n", "\n", " var backingStore = this.context.backingStorePixelRatio ||\n", "\tthis.context.webkitBackingStorePixelRatio ||\n", "\tthis.context.mozBackingStorePixelRatio ||\n", "\tthis.context.msBackingStorePixelRatio ||\n", "\tthis.context.oBackingStorePixelRatio ||\n", "\tthis.context.backingStorePixelRatio || 1;\n", "\n", " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", "\n", " var rubberband = $('');\n", " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", "\n", " var pass_mouse_events = true;\n", "\n", " canvas_div.resizable({\n", " start: function(event, ui) {\n", " pass_mouse_events = false;\n", " },\n", " resize: function(event, ui) {\n", " fig.request_resize(ui.size.width, ui.size.height);\n", " },\n", " stop: function(event, ui) {\n", " pass_mouse_events = true;\n", " fig.request_resize(ui.size.width, ui.size.height);\n", " },\n", " });\n", "\n", " function mouse_event_fn(event) {\n", " if (pass_mouse_events)\n", " return fig.mouse_event(event, event['data']);\n", " }\n", "\n", " rubberband.mousedown('button_press', mouse_event_fn);\n", " rubberband.mouseup('button_release', mouse_event_fn);\n", " // Throttle sequential mouse events to 1 every 20ms.\n", " rubberband.mousemove('motion_notify', mouse_event_fn);\n", "\n", " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", "\n", " canvas_div.on(\"wheel\", function (event) {\n", " event = event.originalEvent;\n", " event['data'] = 'scroll'\n", " if (event.deltaY < 0) {\n", " event.step = 1;\n", " } else {\n", " event.step = -1;\n", " }\n", " mouse_event_fn(event);\n", " });\n", "\n", " canvas_div.append(canvas);\n", " canvas_div.append(rubberband);\n", "\n", " this.rubberband = rubberband;\n", " this.rubberband_canvas = rubberband[0];\n", " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", " this.rubberband_context.strokeStyle = \"#000000\";\n", "\n", " this._resize_canvas = function(width, height) {\n", " // Keep the size of the canvas, canvas container, and rubber band\n", " // canvas in synch.\n", " canvas_div.css('width', width)\n", " canvas_div.css('height', height)\n", "\n", " canvas.attr('width', width * mpl.ratio);\n", " canvas.attr('height', height * mpl.ratio);\n", " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", "\n", " rubberband.attr('width', width);\n", " rubberband.attr('height', height);\n", " }\n", "\n", " // Set the figure to an initial 600x600px, this will subsequently be updated\n", " // upon first draw.\n", " this._resize_canvas(600, 600);\n", "\n", " // Disable right mouse context menu.\n", " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", " return false;\n", " });\n", "\n", " function set_focus () {\n", " canvas.focus();\n", " canvas_div.focus();\n", " }\n", "\n", " window.setTimeout(set_focus, 100);\n", "}\n", "\n", "mpl.figure.prototype._init_toolbar = function() {\n", " var fig = this;\n", "\n", " var nav_element = $('
')\n", " nav_element.attr('style', 'width: 100%');\n", " this.root.append(nav_element);\n", "\n", " // Define a callback function for later on.\n", " function toolbar_event(event) {\n", " return fig.toolbar_button_onclick(event['data']);\n", " }\n", " function toolbar_mouse_event(event) {\n", " return fig.toolbar_button_onmouseover(event['data']);\n", " }\n", "\n", " for(var toolbar_ind in mpl.toolbar_items) {\n", " var name = mpl.toolbar_items[toolbar_ind][0];\n", " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", " var image = mpl.toolbar_items[toolbar_ind][2];\n", " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", "\n", " if (!name) {\n", " // put a spacer in here.\n", " continue;\n", " }\n", " var button = $('');\n", " button.click(method_name, toolbar_event);\n", " button.mouseover(tooltip, toolbar_mouse_event);\n", " nav_element.append(button);\n", " }\n", "\n", " // Add the status bar.\n", " var status_bar = $('');\n", " nav_element.append(status_bar);\n", " this.message = status_bar[0];\n", "\n", " // Add the close button to the window.\n", " var buttongrp = $('
');\n", " var button = $('');\n", " button.click(function (evt) { fig.handle_close(fig, {}); } );\n", " button.mouseover('Stop Interaction', toolbar_mouse_event);\n", " buttongrp.append(button);\n", " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", " titlebar.prepend(buttongrp);\n", "}\n", "\n", "mpl.figure.prototype._root_extra_style = function(el){\n", " var fig = this\n", " el.on(\"remove\", function(){\n", "\tfig.close_ws(fig, {});\n", " });\n", "}\n", "\n", "mpl.figure.prototype._canvas_extra_style = function(el){\n", " // this is important to make the div 'focusable\n", " el.attr('tabindex', 0)\n", " // reach out to IPython and tell the keyboard manager to turn it's self\n", " // off when our div gets focus\n", "\n", " // location in version 3\n", " if (IPython.notebook.keyboard_manager) {\n", " IPython.notebook.keyboard_manager.register_events(el);\n", " }\n", " else {\n", " // location in version 2\n", " IPython.keyboard_manager.register_events(el);\n", " }\n", "\n", "}\n", "\n", "mpl.figure.prototype._key_event_extra = function(event, name) {\n", " var manager = IPython.notebook.keyboard_manager;\n", " if (!manager)\n", " manager = IPython.keyboard_manager;\n", "\n", " // Check for shift+enter\n", " if (event.shiftKey && event.which == 13) {\n", " this.canvas_div.blur();\n", " event.shiftKey = false;\n", " // Send a \"J\" for go to next cell\n", " event.which = 74;\n", " event.keyCode = 74;\n", " manager.command_mode();\n", " manager.handle_keydown(event);\n", " }\n", "}\n", "\n", "mpl.figure.prototype.handle_save = function(fig, msg) {\n", " fig.ondownload(fig, null);\n", "}\n", "\n", "\n", "mpl.find_output_cell = function(html_output) {\n", " // Return the cell and output element which can be found *uniquely* in the notebook.\n", " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", " // IPython event is triggered only after the cells have been serialised, which for\n", " // our purposes (turning an active figure into a static one), is too late.\n", " var cells = IPython.notebook.get_cells();\n", " var ncells = cells.length;\n", " for (var i=0; i= 3 moved mimebundle to data attribute of output\n", " data = data.data;\n", " }\n", " if (data['text/html'] == html_output) {\n", " return [cell, data, j];\n", " }\n", " }\n", " }\n", " }\n", "}\n", "\n", "// Register the function which deals with the matplotlib target/channel.\n", "// The kernel may be null if the page has been refreshed.\n", "if (IPython.notebook.kernel != null) {\n", " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", "}\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "f, axes = plt.subplots(2, 3)" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[,\n", " ,\n", " ],\n", " [,\n", " ,\n", " ]],\n", " dtype=object)" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "axes" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "这个操作是很有用的。axes能用一个二位数据来索引,例如,axes[0, 1]。我们可以使用sharex和sharey来指定不同subplot有相同的x-或y-axis(其实就是令坐标轴的范围相同),这能让我们在同一范围内进行数据之间的比较。不然的话,matplotlib会自动绘图的范围不一定是一样的。\n", "\n", "### Adjusting the spacing around subplots(调整subplot直接的间隔)\n", "\n", "默认情况下,matplotlib会在subplot之间留下一定间隔的边距,这取决于绘图的高度和跨度。所以如果我们调整绘图的大小,它会自动调整。我们可以用Figure对象下的subplots_adjust方法来更改间隔,当然,也可以用第一层级的函数:\n", "\n", " subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=None, hspace=None)\n", " \n", "wspace和hspace控制figure宽度和长度的百分比,可以用来控制subplot之间的间隔。这里有一个例子,我们让间隔为0:" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "application/javascript": [ "/* Put everything inside the global mpl namespace */\n", "window.mpl = {};\n", "\n", "\n", "mpl.get_websocket_type = function() {\n", " if (typeof(WebSocket) !== 'undefined') {\n", " return WebSocket;\n", " } else if (typeof(MozWebSocket) !== 'undefined') {\n", " return MozWebSocket;\n", " } else {\n", " alert('Your browser does not have WebSocket support.' +\n", " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", " 'Firefox 4 and 5 are also supported but you ' +\n", " 'have to enable WebSockets in about:config.');\n", " };\n", "}\n", "\n", "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", " this.id = figure_id;\n", "\n", " this.ws = websocket;\n", "\n", " this.supports_binary = (this.ws.binaryType != undefined);\n", "\n", " if (!this.supports_binary) {\n", " var warnings = document.getElementById(\"mpl-warnings\");\n", " if (warnings) {\n", " warnings.style.display = 'block';\n", " warnings.textContent = (\n", " \"This browser does not support binary websocket messages. \" +\n", " \"Performance may be slow.\");\n", " }\n", " }\n", "\n", " this.imageObj = new Image();\n", "\n", " this.context = undefined;\n", " this.message = undefined;\n", " this.canvas = undefined;\n", " this.rubberband_canvas = undefined;\n", " this.rubberband_context = undefined;\n", " this.format_dropdown = undefined;\n", "\n", " this.image_mode = 'full';\n", "\n", " this.root = $('
');\n", " this._root_extra_style(this.root)\n", " this.root.attr('style', 'display: inline-block');\n", "\n", " $(parent_element).append(this.root);\n", "\n", " this._init_header(this);\n", " this._init_canvas(this);\n", " this._init_toolbar(this);\n", "\n", " var fig = this;\n", "\n", " this.waiting = false;\n", "\n", " this.ws.onopen = function () {\n", " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", " fig.send_message(\"send_image_mode\", {});\n", " if (mpl.ratio != 1) {\n", " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", " }\n", " fig.send_message(\"refresh\", {});\n", " }\n", "\n", " this.imageObj.onload = function() {\n", " if (fig.image_mode == 'full') {\n", " // Full images could contain transparency (where diff images\n", " // almost always do), so we need to clear the canvas so that\n", " // there is no ghosting.\n", " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", " }\n", " fig.context.drawImage(fig.imageObj, 0, 0);\n", " };\n", "\n", " this.imageObj.onunload = function() {\n", " fig.ws.close();\n", " }\n", "\n", " this.ws.onmessage = this._make_on_message_function(this);\n", "\n", " this.ondownload = ondownload;\n", "}\n", "\n", "mpl.figure.prototype._init_header = function() {\n", " var titlebar = $(\n", " '
');\n", " var titletext = $(\n", " '
');\n", " titlebar.append(titletext)\n", " this.root.append(titlebar);\n", " this.header = titletext[0];\n", "}\n", "\n", "\n", "\n", "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", "\n", "}\n", "\n", "\n", "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", "\n", "}\n", "\n", "mpl.figure.prototype._init_canvas = function() {\n", " var fig = this;\n", "\n", " var canvas_div = $('
');\n", "\n", " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", "\n", " function canvas_keyboard_event(event) {\n", " return fig.key_event(event, event['data']);\n", " }\n", "\n", " canvas_div.keydown('key_press', canvas_keyboard_event);\n", " canvas_div.keyup('key_release', canvas_keyboard_event);\n", " this.canvas_div = canvas_div\n", " this._canvas_extra_style(canvas_div)\n", " this.root.append(canvas_div);\n", "\n", " var canvas = $('');\n", " canvas.addClass('mpl-canvas');\n", " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", "\n", " this.canvas = canvas[0];\n", " this.context = canvas[0].getContext(\"2d\");\n", "\n", " var backingStore = this.context.backingStorePixelRatio ||\n", "\tthis.context.webkitBackingStorePixelRatio ||\n", "\tthis.context.mozBackingStorePixelRatio ||\n", "\tthis.context.msBackingStorePixelRatio ||\n", "\tthis.context.oBackingStorePixelRatio ||\n", "\tthis.context.backingStorePixelRatio || 1;\n", "\n", " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", "\n", " var rubberband = $('');\n", " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", "\n", " var pass_mouse_events = true;\n", "\n", " canvas_div.resizable({\n", " start: function(event, ui) {\n", " pass_mouse_events = false;\n", " },\n", " resize: function(event, ui) {\n", " fig.request_resize(ui.size.width, ui.size.height);\n", " },\n", " stop: function(event, ui) {\n", " pass_mouse_events = true;\n", " fig.request_resize(ui.size.width, ui.size.height);\n", " },\n", " });\n", "\n", " function mouse_event_fn(event) {\n", " if (pass_mouse_events)\n", " return fig.mouse_event(event, event['data']);\n", " }\n", "\n", " rubberband.mousedown('button_press', mouse_event_fn);\n", " rubberband.mouseup('button_release', mouse_event_fn);\n", " // Throttle sequential mouse events to 1 every 20ms.\n", " rubberband.mousemove('motion_notify', mouse_event_fn);\n", "\n", " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", "\n", " canvas_div.on(\"wheel\", function (event) {\n", " event = event.originalEvent;\n", " event['data'] = 'scroll'\n", " if (event.deltaY < 0) {\n", " event.step = 1;\n", " } else {\n", " event.step = -1;\n", " }\n", " mouse_event_fn(event);\n", " });\n", "\n", " canvas_div.append(canvas);\n", " canvas_div.append(rubberband);\n", "\n", " this.rubberband = rubberband;\n", " this.rubberband_canvas = rubberband[0];\n", " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", " this.rubberband_context.strokeStyle = \"#000000\";\n", "\n", " this._resize_canvas = function(width, height) {\n", " // Keep the size of the canvas, canvas container, and rubber band\n", " // canvas in synch.\n", " canvas_div.css('width', width)\n", " canvas_div.css('height', height)\n", "\n", " canvas.attr('width', width * mpl.ratio);\n", " canvas.attr('height', height * mpl.ratio);\n", " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", "\n", " rubberband.attr('width', width);\n", " rubberband.attr('height', height);\n", " }\n", "\n", " // Set the figure to an initial 600x600px, this will subsequently be updated\n", " // upon first draw.\n", " this._resize_canvas(600, 600);\n", "\n", " // Disable right mouse context menu.\n", " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", " return false;\n", " });\n", "\n", " function set_focus () {\n", " canvas.focus();\n", " canvas_div.focus();\n", " }\n", "\n", " window.setTimeout(set_focus, 100);\n", "}\n", "\n", "mpl.figure.prototype._init_toolbar = function() {\n", " var fig = this;\n", "\n", " var nav_element = $('
')\n", " nav_element.attr('style', 'width: 100%');\n", " this.root.append(nav_element);\n", "\n", " // Define a callback function for later on.\n", " function toolbar_event(event) {\n", " return fig.toolbar_button_onclick(event['data']);\n", " }\n", " function toolbar_mouse_event(event) {\n", " return fig.toolbar_button_onmouseover(event['data']);\n", " }\n", "\n", " for(var toolbar_ind in mpl.toolbar_items) {\n", " var name = mpl.toolbar_items[toolbar_ind][0];\n", " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", " var image = mpl.toolbar_items[toolbar_ind][2];\n", " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", "\n", " if (!name) {\n", " // put a spacer in here.\n", " continue;\n", " }\n", " var button = $('');\n", " button.click(method_name, toolbar_event);\n", " button.mouseover(tooltip, toolbar_mouse_event);\n", " nav_element.append(button);\n", " }\n", "\n", " // Add the status bar.\n", " var status_bar = $('');\n", " nav_element.append(status_bar);\n", " this.message = status_bar[0];\n", "\n", " // Add the close button to the window.\n", " var buttongrp = $('
');\n", " var button = $('');\n", " button.click(function (evt) { fig.handle_close(fig, {}); } );\n", " button.mouseover('Stop Interaction', toolbar_mouse_event);\n", " buttongrp.append(button);\n", " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", " titlebar.prepend(buttongrp);\n", "}\n", "\n", "mpl.figure.prototype._root_extra_style = function(el){\n", " var fig = this\n", " el.on(\"remove\", function(){\n", "\tfig.close_ws(fig, {});\n", " });\n", "}\n", "\n", "mpl.figure.prototype._canvas_extra_style = function(el){\n", " // this is important to make the div 'focusable\n", " el.attr('tabindex', 0)\n", " // reach out to IPython and tell the keyboard manager to turn it's self\n", " // off when our div gets focus\n", "\n", " // location in version 3\n", " if (IPython.notebook.keyboard_manager) {\n", " IPython.notebook.keyboard_manager.register_events(el);\n", " }\n", " else {\n", " // location in version 2\n", " IPython.keyboard_manager.register_events(el);\n", " }\n", "\n", "}\n", "\n", "mpl.figure.prototype._key_event_extra = function(event, name) {\n", " var manager = IPython.notebook.keyboard_manager;\n", " if (!manager)\n", " manager = IPython.keyboard_manager;\n", "\n", " // Check for shift+enter\n", " if (event.shiftKey && event.which == 13) {\n", " this.canvas_div.blur();\n", " event.shiftKey = false;\n", " // Send a \"J\" for go to next cell\n", " event.which = 74;\n", " event.keyCode = 74;\n", " manager.command_mode();\n", " manager.handle_keydown(event);\n", " }\n", "}\n", "\n", "mpl.figure.prototype.handle_save = function(fig, msg) {\n", " fig.ondownload(fig, null);\n", "}\n", "\n", "\n", "mpl.find_output_cell = function(html_output) {\n", " // Return the cell and output element which can be found *uniquely* in the notebook.\n", " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", " // IPython event is triggered only after the cells have been serialised, which for\n", " // our purposes (turning an active figure into a static one), is too late.\n", " var cells = IPython.notebook.get_cells();\n", " var ncells = cells.length;\n", " for (var i=0; i= 3 moved mimebundle to data attribute of output\n", " data = data.data;\n", " }\n", " if (data['text/html'] == html_output) {\n", " return [cell, data, j];\n", " }\n", " }\n", " }\n", " }\n", "}\n", "\n", "// Register the function which deals with the matplotlib target/channel.\n", "// The kernel may be null if the page has been refreshed.\n", "if (IPython.notebook.kernel != null) {\n", " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", "}\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig = plt.figure() # 直到下一个黑体标题出现前,不要关闭这个fig" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [], "source": [ "ax = fig.add_subplot(1, 1, 1)" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ax.plot(np.random.randn(1000).cumsum())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "为了改变x-axis tick(x轴标记),使用set_xticks和set_xticklabels。前者告诉matplotlib沿着x轴的范围,把标记放在哪里;默认会把所在位置作为标签,但我们可以用set_xticklabels来设置任意值作为标签:" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [], "source": [ "ticks = ax.set_xticks([0, 250, 500, 750, 1000])" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [], "source": [ "labels = ax.set_xticklabels(['one', 'two', 'three', 'four', 'five'],\n", " rotation=30, fontsize='small')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "rotation选项让x轴上的标记标签有一个30度的旋转。set_xlabel给x轴一个名字,而set_title给subplot一个标题:" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0.5,1,'My first matplotlib plot')" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ax.set_title('My first matplotlib plot')" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0.5,99.92,'Stages')" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ax.set_xlabel('Stages')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "用相同的流程来更改y轴,把上面代码里的x变为y。axes类有一个set方法,能让我们一次设置很多绘图特性。对于上面的例子,我们可以写成下面这样:" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[Text(0.5,99.92,'Stage'), Text(0.5,1,'My first matplotlib plot')]" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "props = {\n", " 'title': 'My first matplotlib plot',\n", " 'xlabel': 'Stage'\n", "}\n", "\n", "ax.set(**props)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Adding legends (添加图例)\n", "\n", "图例对于绘图很重要。有很多方式可以添加图例。最简单的方法是用label参数:" ] }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [], "source": [ "from numpy.random import randn" ] }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [ { "data": { "application/javascript": [ "/* Put everything inside the global mpl namespace */\n", "window.mpl = {};\n", "\n", "\n", "mpl.get_websocket_type = function() {\n", " if (typeof(WebSocket) !== 'undefined') {\n", " return WebSocket;\n", " } else if (typeof(MozWebSocket) !== 'undefined') {\n", " return MozWebSocket;\n", " } else {\n", " alert('Your browser does not have WebSocket support.' +\n", " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", " 'Firefox 4 and 5 are also supported but you ' +\n", " 'have to enable WebSockets in about:config.');\n", " };\n", "}\n", "\n", "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", " this.id = figure_id;\n", "\n", " this.ws = websocket;\n", "\n", " this.supports_binary = (this.ws.binaryType != undefined);\n", "\n", " if (!this.supports_binary) {\n", " var warnings = document.getElementById(\"mpl-warnings\");\n", " if (warnings) {\n", " warnings.style.display = 'block';\n", " warnings.textContent = (\n", " \"This browser does not support binary websocket messages. \" +\n", " \"Performance may be slow.\");\n", " }\n", " }\n", "\n", " this.imageObj = new Image();\n", "\n", " this.context = undefined;\n", " this.message = undefined;\n", " this.canvas = undefined;\n", " this.rubberband_canvas = undefined;\n", " this.rubberband_context = undefined;\n", " this.format_dropdown = undefined;\n", "\n", " this.image_mode = 'full';\n", "\n", " this.root = $('
');\n", " this._root_extra_style(this.root)\n", " this.root.attr('style', 'display: inline-block');\n", "\n", " $(parent_element).append(this.root);\n", "\n", " this._init_header(this);\n", " this._init_canvas(this);\n", " this._init_toolbar(this);\n", "\n", " var fig = this;\n", "\n", " this.waiting = false;\n", "\n", " this.ws.onopen = function () {\n", " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", " fig.send_message(\"send_image_mode\", {});\n", " if (mpl.ratio != 1) {\n", " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", " }\n", " fig.send_message(\"refresh\", {});\n", " }\n", "\n", " this.imageObj.onload = function() {\n", " if (fig.image_mode == 'full') {\n", " // Full images could contain transparency (where diff images\n", " // almost always do), so we need to clear the canvas so that\n", " // there is no ghosting.\n", " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", " }\n", " fig.context.drawImage(fig.imageObj, 0, 0);\n", " };\n", "\n", " this.imageObj.onunload = function() {\n", " fig.ws.close();\n", " }\n", "\n", " this.ws.onmessage = this._make_on_message_function(this);\n", "\n", " this.ondownload = ondownload;\n", "}\n", "\n", "mpl.figure.prototype._init_header = function() {\n", " var titlebar = $(\n", " '
');\n", " var titletext = $(\n", " '
');\n", " titlebar.append(titletext)\n", " this.root.append(titlebar);\n", " this.header = titletext[0];\n", "}\n", "\n", "\n", "\n", "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", "\n", "}\n", "\n", "\n", "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", "\n", "}\n", "\n", "mpl.figure.prototype._init_canvas = function() {\n", " var fig = this;\n", "\n", " var canvas_div = $('
');\n", "\n", " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", "\n", " function canvas_keyboard_event(event) {\n", " return fig.key_event(event, event['data']);\n", " }\n", "\n", " canvas_div.keydown('key_press', canvas_keyboard_event);\n", " canvas_div.keyup('key_release', canvas_keyboard_event);\n", " this.canvas_div = canvas_div\n", " this._canvas_extra_style(canvas_div)\n", " this.root.append(canvas_div);\n", "\n", " var canvas = $('');\n", " canvas.addClass('mpl-canvas');\n", " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", "\n", " this.canvas = canvas[0];\n", " this.context = canvas[0].getContext(\"2d\");\n", "\n", " var backingStore = this.context.backingStorePixelRatio ||\n", "\tthis.context.webkitBackingStorePixelRatio ||\n", "\tthis.context.mozBackingStorePixelRatio ||\n", "\tthis.context.msBackingStorePixelRatio ||\n", "\tthis.context.oBackingStorePixelRatio ||\n", "\tthis.context.backingStorePixelRatio || 1;\n", "\n", " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", "\n", " var rubberband = $('');\n", " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", "\n", " var pass_mouse_events = true;\n", "\n", " canvas_div.resizable({\n", " start: function(event, ui) {\n", " pass_mouse_events = false;\n", " },\n", " resize: function(event, ui) {\n", " fig.request_resize(ui.size.width, ui.size.height);\n", " },\n", " stop: function(event, ui) {\n", " pass_mouse_events = true;\n", " fig.request_resize(ui.size.width, ui.size.height);\n", " },\n", " });\n", "\n", " function mouse_event_fn(event) {\n", " if (pass_mouse_events)\n", " return fig.mouse_event(event, event['data']);\n", " }\n", "\n", " rubberband.mousedown('button_press', mouse_event_fn);\n", " rubberband.mouseup('button_release', mouse_event_fn);\n", " // Throttle sequential mouse events to 1 every 20ms.\n", " rubberband.mousemove('motion_notify', mouse_event_fn);\n", "\n", " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", "\n", " canvas_div.on(\"wheel\", function (event) {\n", " event = event.originalEvent;\n", " event['data'] = 'scroll'\n", " if (event.deltaY < 0) {\n", " event.step = 1;\n", " } else {\n", " event.step = -1;\n", " }\n", " mouse_event_fn(event);\n", " });\n", "\n", " canvas_div.append(canvas);\n", " canvas_div.append(rubberband);\n", "\n", " this.rubberband = rubberband;\n", " this.rubberband_canvas = rubberband[0];\n", " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", " this.rubberband_context.strokeStyle = \"#000000\";\n", "\n", " this._resize_canvas = function(width, height) {\n", " // Keep the size of the canvas, canvas container, and rubber band\n", " // canvas in synch.\n", " canvas_div.css('width', width)\n", " canvas_div.css('height', height)\n", "\n", " canvas.attr('width', width * mpl.ratio);\n", " canvas.attr('height', height * mpl.ratio);\n", " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", "\n", " rubberband.attr('width', width);\n", " rubberband.attr('height', height);\n", " }\n", "\n", " // Set the figure to an initial 600x600px, this will subsequently be updated\n", " // upon first draw.\n", " this._resize_canvas(600, 600);\n", "\n", " // Disable right mouse context menu.\n", " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", " return false;\n", " });\n", "\n", " function set_focus () {\n", " canvas.focus();\n", " canvas_div.focus();\n", " }\n", "\n", " window.setTimeout(set_focus, 100);\n", "}\n", "\n", "mpl.figure.prototype._init_toolbar = function() {\n", " var fig = this;\n", "\n", " var nav_element = $('
')\n", " nav_element.attr('style', 'width: 100%');\n", " this.root.append(nav_element);\n", "\n", " // Define a callback function for later on.\n", " function toolbar_event(event) {\n", " return fig.toolbar_button_onclick(event['data']);\n", " }\n", " function toolbar_mouse_event(event) {\n", " return fig.toolbar_button_onmouseover(event['data']);\n", " }\n", "\n", " for(var toolbar_ind in mpl.toolbar_items) {\n", " var name = mpl.toolbar_items[toolbar_ind][0];\n", " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", " var image = mpl.toolbar_items[toolbar_ind][2];\n", " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", "\n", " if (!name) {\n", " // put a spacer in here.\n", " continue;\n", " }\n", " var button = $('');\n", " button.click(method_name, toolbar_event);\n", " button.mouseover(tooltip, toolbar_mouse_event);\n", " nav_element.append(button);\n", " }\n", "\n", " // Add the status bar.\n", " var status_bar = $('');\n", " nav_element.append(status_bar);\n", " this.message = status_bar[0];\n", "\n", " // Add the close button to the window.\n", " var buttongrp = $('
');\n", " var button = $('');\n", " button.click(function (evt) { fig.handle_close(fig, {}); } );\n", " button.mouseover('Stop Interaction', toolbar_mouse_event);\n", " buttongrp.append(button);\n", " var titlebar = this.root.find($('.ui-dialog-titlebar'));\n", " titlebar.prepend(buttongrp);\n", "}\n", "\n", "mpl.figure.prototype._root_extra_style = function(el){\n", " var fig = this\n", " el.on(\"remove\", function(){\n", "\tfig.close_ws(fig, {});\n", " });\n", "}\n", "\n", "mpl.figure.prototype._canvas_extra_style = function(el){\n", " // this is important to make the div 'focusable\n", " el.attr('tabindex', 0)\n", " // reach out to IPython and tell the keyboard manager to turn it's self\n", " // off when our div gets focus\n", "\n", " // location in version 3\n", " if (IPython.notebook.keyboard_manager) {\n", " IPython.notebook.keyboard_manager.register_events(el);\n", " }\n", " else {\n", " // location in version 2\n", " IPython.keyboard_manager.register_events(el);\n", " }\n", "\n", "}\n", "\n", "mpl.figure.prototype._key_event_extra = function(event, name) {\n", " var manager = IPython.notebook.keyboard_manager;\n", " if (!manager)\n", " manager = IPython.keyboard_manager;\n", "\n", " // Check for shift+enter\n", " if (event.shiftKey && event.which == 13) {\n", " this.canvas_div.blur();\n", " event.shiftKey = false;\n", " // Send a \"J\" for go to next cell\n", " event.which = 74;\n", " event.keyCode = 74;\n", " manager.command_mode();\n", " manager.handle_keydown(event);\n", " }\n", "}\n", "\n", "mpl.figure.prototype.handle_save = function(fig, msg) {\n", " fig.ondownload(fig, null);\n", "}\n", "\n", "\n", "mpl.find_output_cell = function(html_output) {\n", " // Return the cell and output element which can be found *uniquely* in the notebook.\n", " // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n", " // IPython event is triggered only after the cells have been serialised, which for\n", " // our purposes (turning an active figure into a static one), is too late.\n", " var cells = IPython.notebook.get_cells();\n", " var ncells = cells.length;\n", " for (var i=0; i= 3 moved mimebundle to data attribute of output\n", " data = data.data;\n", " }\n", " if (data['text/html'] == html_output) {\n", " return [cell, data, j];\n", " }\n", " }\n", " }\n", " }\n", "}\n", "\n", "// Register the function which deals with the matplotlib target/channel.\n", "// The kernel may be null if the page has been refreshed.\n", "if (IPython.notebook.kernel != null) {\n", " IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n", "}\n" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "Text(0.5,1,'Important dates in the 2008-2009 financial crisis')" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from datetime import datetime\n", "\n", "fig = plt.figure()\n", "ax = fig.add_subplot(1, 1, 1)\n", "\n", "data = pd.read_csv('examples/spx.csv', index_col=0, parse_dates=True)\n", "spx = data['SPX']\n", "\n", "spx.plot(ax=ax, style='k-')\n", "\n", "crisis_data = [\n", " (datetime(2007, 10, 11), 'Peak of bull market'),\n", " (datetime(2008, 3, 12), 'Bear Stearns Fails'),\n", " (datetime(2008, 9, 15), 'Lehman Bankruptcy')\n", "]\n", "\n", "for date, label in crisis_data:\n", " ax.annotate(label, xy=(date, spx.asof(date) + 75),\n", " xytext=(date, spx.asof(date) + 225),\n", " arrowprops=dict(facecolor='black', headwidth=4, \n", " width=2, headlength=4),\n", " horizontalalignment='left', verticalalignment='top')\n", " \n", "# Zoom in on 2007-2010\n", "ax.set_xlim(['1/1/2007', '1/1/2011'])\n", "ax.set_ylim([600, 1800])\n", "\n", "ax.set_title('Important dates in the 2008-2009 financial crisis')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "在这幅图里,有一些点是值得强调的:ax.annotate方法能在x和y坐标指示的位置画出标签。我们可以用set_xlim和set_ylim方法来手动地设置开始和结束的边界,而不是用matplotlib的默认边界。最后,ax.set_title添加一个主标题。\n", "\n", "可以联网看matplotlib gallery上查看更多关于标注的例子。\n", "\n", "要想画出图形的话,更需要细心一些。matplotlib有一些对象可以用来表示一些常见的图形,被称之为patches。其中一些,比如Rectangle和Circle,在matplotlib.pyplot也有,但是全套画图形的方法还是在matplotlib.patches里。\n", "\n", "给图中添加一个图形,必须先添加一个patch对象,shp,然后通过调用ax.add_patch(shp)把它添加到subplot中:" ] }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [ { "data": { "application/javascript": [ "/* Put everything inside the global mpl namespace */\n", "window.mpl = {};\n", "\n", "\n", "mpl.get_websocket_type = function() {\n", " if (typeof(WebSocket) !== 'undefined') {\n", " return WebSocket;\n", " } else if (typeof(MozWebSocket) !== 'undefined') {\n", " return MozWebSocket;\n", " } else {\n", " alert('Your browser does not have WebSocket support.' +\n", " 'Please try Chrome, Safari or Firefox ≥ 6. ' +\n", " 'Firefox 4 and 5 are also supported but you ' +\n", " 'have to enable WebSockets in about:config.');\n", " };\n", "}\n", "\n", "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n", " this.id = figure_id;\n", "\n", " this.ws = websocket;\n", "\n", " this.supports_binary = (this.ws.binaryType != undefined);\n", "\n", " if (!this.supports_binary) {\n", " var warnings = document.getElementById(\"mpl-warnings\");\n", " if (warnings) {\n", " warnings.style.display = 'block';\n", " warnings.textContent = (\n", " \"This browser does not support binary websocket messages. \" +\n", " \"Performance may be slow.\");\n", " }\n", " }\n", "\n", " this.imageObj = new Image();\n", "\n", " this.context = undefined;\n", " this.message = undefined;\n", " this.canvas = undefined;\n", " this.rubberband_canvas = undefined;\n", " this.rubberband_context = undefined;\n", " this.format_dropdown = undefined;\n", "\n", " this.image_mode = 'full';\n", "\n", " this.root = $('
');\n", " this._root_extra_style(this.root)\n", " this.root.attr('style', 'display: inline-block');\n", "\n", " $(parent_element).append(this.root);\n", "\n", " this._init_header(this);\n", " this._init_canvas(this);\n", " this._init_toolbar(this);\n", "\n", " var fig = this;\n", "\n", " this.waiting = false;\n", "\n", " this.ws.onopen = function () {\n", " fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n", " fig.send_message(\"send_image_mode\", {});\n", " if (mpl.ratio != 1) {\n", " fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n", " }\n", " fig.send_message(\"refresh\", {});\n", " }\n", "\n", " this.imageObj.onload = function() {\n", " if (fig.image_mode == 'full') {\n", " // Full images could contain transparency (where diff images\n", " // almost always do), so we need to clear the canvas so that\n", " // there is no ghosting.\n", " fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n", " }\n", " fig.context.drawImage(fig.imageObj, 0, 0);\n", " };\n", "\n", " this.imageObj.onunload = function() {\n", " fig.ws.close();\n", " }\n", "\n", " this.ws.onmessage = this._make_on_message_function(this);\n", "\n", " this.ondownload = ondownload;\n", "}\n", "\n", "mpl.figure.prototype._init_header = function() {\n", " var titlebar = $(\n", " '
');\n", " var titletext = $(\n", " '
');\n", " titlebar.append(titletext)\n", " this.root.append(titlebar);\n", " this.header = titletext[0];\n", "}\n", "\n", "\n", "\n", "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n", "\n", "}\n", "\n", "\n", "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n", "\n", "}\n", "\n", "mpl.figure.prototype._init_canvas = function() {\n", " var fig = this;\n", "\n", " var canvas_div = $('
');\n", "\n", " canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n", "\n", " function canvas_keyboard_event(event) {\n", " return fig.key_event(event, event['data']);\n", " }\n", "\n", " canvas_div.keydown('key_press', canvas_keyboard_event);\n", " canvas_div.keyup('key_release', canvas_keyboard_event);\n", " this.canvas_div = canvas_div\n", " this._canvas_extra_style(canvas_div)\n", " this.root.append(canvas_div);\n", "\n", " var canvas = $('');\n", " canvas.addClass('mpl-canvas');\n", " canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n", "\n", " this.canvas = canvas[0];\n", " this.context = canvas[0].getContext(\"2d\");\n", "\n", " var backingStore = this.context.backingStorePixelRatio ||\n", "\tthis.context.webkitBackingStorePixelRatio ||\n", "\tthis.context.mozBackingStorePixelRatio ||\n", "\tthis.context.msBackingStorePixelRatio ||\n", "\tthis.context.oBackingStorePixelRatio ||\n", "\tthis.context.backingStorePixelRatio || 1;\n", "\n", " mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n", "\n", " var rubberband = $('');\n", " rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n", "\n", " var pass_mouse_events = true;\n", "\n", " canvas_div.resizable({\n", " start: function(event, ui) {\n", " pass_mouse_events = false;\n", " },\n", " resize: function(event, ui) {\n", " fig.request_resize(ui.size.width, ui.size.height);\n", " },\n", " stop: function(event, ui) {\n", " pass_mouse_events = true;\n", " fig.request_resize(ui.size.width, ui.size.height);\n", " },\n", " });\n", "\n", " function mouse_event_fn(event) {\n", " if (pass_mouse_events)\n", " return fig.mouse_event(event, event['data']);\n", " }\n", "\n", " rubberband.mousedown('button_press', mouse_event_fn);\n", " rubberband.mouseup('button_release', mouse_event_fn);\n", " // Throttle sequential mouse events to 1 every 20ms.\n", " rubberband.mousemove('motion_notify', mouse_event_fn);\n", "\n", " rubberband.mouseenter('figure_enter', mouse_event_fn);\n", " rubberband.mouseleave('figure_leave', mouse_event_fn);\n", "\n", " canvas_div.on(\"wheel\", function (event) {\n", " event = event.originalEvent;\n", " event['data'] = 'scroll'\n", " if (event.deltaY < 0) {\n", " event.step = 1;\n", " } else {\n", " event.step = -1;\n", " }\n", " mouse_event_fn(event);\n", " });\n", "\n", " canvas_div.append(canvas);\n", " canvas_div.append(rubberband);\n", "\n", " this.rubberband = rubberband;\n", " this.rubberband_canvas = rubberband[0];\n", " this.rubberband_context = rubberband[0].getContext(\"2d\");\n", " this.rubberband_context.strokeStyle = \"#000000\";\n", "\n", " this._resize_canvas = function(width, height) {\n", " // Keep the size of the canvas, canvas container, and rubber band\n", " // canvas in synch.\n", " canvas_div.css('width', width)\n", " canvas_div.css('height', height)\n", "\n", " canvas.attr('width', width * mpl.ratio);\n", " canvas.attr('height', height * mpl.ratio);\n", " canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n", "\n", " rubberband.attr('width', width);\n", " rubberband.attr('height', height);\n", " }\n", "\n", " // Set the figure to an initial 600x600px, this will subsequently be updated\n", " // upon first draw.\n", " this._resize_canvas(600, 600);\n", "\n", " // Disable right mouse context menu.\n", " $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n", " return false;\n", " });\n", "\n", " function set_focus () {\n", " canvas.focus();\n", " canvas_div.focus();\n", " }\n", "\n", " window.setTimeout(set_focus, 100);\n", "}\n", "\n", "mpl.figure.prototype._init_toolbar = function() {\n", " var fig = this;\n", "\n", " var nav_element = $('
')\n", " nav_element.attr('style', 'width: 100%');\n", " this.root.append(nav_element);\n", "\n", " // Define a callback function for later on.\n", " function toolbar_event(event) {\n", " return fig.toolbar_button_onclick(event['data']);\n", " }\n", " function toolbar_mouse_event(event) {\n", " return fig.toolbar_button_onmouseover(event['data']);\n", " }\n", "\n", " for(var toolbar_ind in mpl.toolbar_items) {\n", " var name = mpl.toolbar_items[toolbar_ind][0];\n", " var tooltip = mpl.toolbar_items[toolbar_ind][1];\n", " var image = mpl.toolbar_items[toolbar_ind][2];\n", " var method_name = mpl.toolbar_items[toolbar_ind][3];\n", "\n", " if (!name) {\n", " // put a spacer in here.\n", " continue;\n", " }\n", " var button = $('