{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "向量化的数组运算比纯python同等程度的运算要快很多。\n", "\n", "一个简单的例子,假设我们想要评价函数`sqrt(x^2 + y^2)`。`np.meshgrid`函数取两个1维的数组,产生一个2维的矩阵,对应于所有两个数组中(x, y)的组合:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import numpy as np" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "在进行书中的内容之前,先举个例子说明meshgrid的效果。meshgrid函数用两个坐标轴上的点在平面上画网格。用法:\n", "\n", "- `[X,Y]=meshgrid(x,y)`\n", "\n", "- `[X,Y]=meshgrid(x)`与`[X,Y]=meshgrid(x,x)`是等同的\n", "\n", "- `[X,Y,Z]=meshgrid(x,y,z)`生成三维数组,可用来计算三变量的函数和绘制三维立体图\n", "\n", "这里,主要以`[X,Y]=meshgrid(x,y)`为例,来对该函数进行介绍。\n", "\n", "`[X,Y] = meshgrid(x,y)` 将向量x和y定义的区域转换成矩阵X和Y,其中矩阵X的行向量是向量x的简单复制,而矩阵Y的列向量是向量y的简单复制(注:下面代码中X和Y均是数组,在文中统一称为矩阵了)。\n", "\n", "假设x是长度为m的向量,y是长度为n的向量,则最终生成的矩阵X和Y的维度都是 nm (注意不是mn)。" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([ 0. , 0.25, 0.5 , 0.75, 1. ])" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "m, n = (5, 3)\n", "x = np.linspace(0, 1, m)\n", "y = np.linspace(0, 1, n)\n", "X, Y = np.meshgrid(x, y)\n", "x" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([ 0. , 0.5, 1. ])" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[ 0. , 0.25, 0.5 , 0.75, 1. ],\n", " [ 0. , 0.25, 0.5 , 0.75, 1. ],\n", " [ 0. , 0.25, 0.5 , 0.75, 1. ]])" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[ 0. , 0. , 0. , 0. , 0. ],\n", " [ 0.5, 0.5, 0.5, 0.5, 0.5],\n", " [ 1. , 1. , 1. , 1. , 1. ]])" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Y" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "可以看到X和Y的shape都是3x5,用图的话更好理解:\n", "\n", "[](../MarkdownPhotos/chp04/v2-a7f1c996c371d1167a0fb7b5273c6d01_r.jpg)\n", "\n", "![](http://oydgk2hgw.bkt.clouddn.com/pydata-book/jaa76.jpg)\n", "\n", "\n", "把X和Y画出来后,就可以看到网格了:\n", "\n" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[,\n", " ,\n", " ,\n", " ,\n", " ]" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAhEAAAFqCAYAAACkkwiNAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAHq9JREFUeJzt3X9sVfX9x/HXrb0UkfbW/qCVTmhKaePgYqOosdS1mxDp\nMB1mUOSrxnbIJkSDYsjEkjiWkFjYiBowK0hAa+pSY6ZljYWM1M7b6vzqRPlRUljTZQUtXeu9vQ57\nae39/kG831WLcj7tPbe3fT4S/+DTz+fc931/sPfFOefe6wgGg0EBAABYFBPpAgAAQHQiRAAAACOE\nCAAAYIQQAQAAjBAiAACAEUIEAAAwQogAAABGCBEAAMAIIQIAABghRAAAACOWQ0Rra6sqKyv1q1/9\nSqtWrdIHH3zwvWtOnDihX//617rvvvu0YcMGvf322ya1yuPxGK2DOXpuP3puP3puP3puv3D03HKI\nCAQCyszM1EMPPXRF88+fP69nnnlGbrdbO3bsUHFxsaqqqvTJJ59YLra5udnyGowOPbcfPbcfPbcf\nPbdfOHoea3VBXl6e8vLyrnj+4cOHlZaWpvvvv1+SNHPmTJ06dUr19fVasGCB1YcHAADjRNjviTh9\n+rTcbvewsby8PLW1tYX7oQEAQBiFPUR4vV65XK5hYy6XSxcuXNDAwEC4Hx4AAIRJVL0744Ybboh0\nCZNOWlpapEuYdOi5/ei5/ei5/cLxGmr5ngirEhMT5fP5ho35fD5NmzZNTqdzxDUej+dbN4DccMMN\nKikpCVudGFlZWVmkS5h06Ln96Ln96Ln9SkpKVFdXp9bW1mHjixYtUkFBgdExwx4icnJydPTo0WFj\nH3/8sXJyci67pqCg4LJP6H/+R7rqqovaudM34s8xthISEtTX1zemx9y40aUTJ6aE/jxvHvv538LR\n83CL9j2Nxp6Hkx37Sc/ts3GjS199NUU1NZeCxFj+g9xyiOjv79dnn30W+nNXV5c6Ojo0ffp0paSk\nqKamRr29vXrkkUckSUuWLNGhQ4f0yiuv6Cc/+YmOHTum9957T5s3bzYq+KqrLmrTpl4NDAwZrYc1\nwWBwzO9d2bSpVw89dK26uq5SWtpX2rTpc/bzv4Sj5+EW7XsajT0PJzv2k57bZ9OmXu3YkSRpyvfO\ntcoRDAaDVhacPHlSW7du/dZ4YWGh1q9frxdeeEHd3d16+umnh6156aWX1NnZqeTkZK1YsUI/+tGP\njAru7u7mL56NkpKS1NvbG+kyJhV6bj96bj96bi+n06nU1NQxP67lEBFphAh78T+6/ei5/ei5/ei5\nvcIVIqLq3RkAAGD8IEQAAAAjhAgAAGCEEAEAAIwQIgAAgBFCBAAAMEKIAAAARggRAADACCECAAAY\nIUQAAAAjhAgAAGCEEAEAAIwQIgAAgBFCBAAAMEKIAAAARggRAADACCECAAAYIUQAAAAjhAgAAGCE\nEAEAAIwQIgAAgBFCBAAAMEKIAAAARggRAADACCECAAAYIUQAAAAjhAgAAGCEEAEAAIwQIgAAgBFC\nBAAAMEKIAAAARggRAADACCECAAAYIUQAAAAjhAgAAGCEEAEAAIwQIgAAgBFCBAAAMEKIAAAARggR\nAADACCECAAAYIUQAAAAjhAgAAGCEEAEAAIwQIgAAgBFCBAAAMEKIAAAARggRAADACCECAAAYIUQA\nAAAjhAgAAGAk1mRRQ0ODDh48KK/Xq8zMTJWXlys7O/uy89955x3V1dXps88+07Rp05SXl6cHHnhA\n06dPNy4cAABEluUzES0tLaqurlZpaam2b9+u2bNna9u2berr6xtx/qlTp7R7927deeed2rlzpzZu\n3KgzZ86oqqpq1MUDAIDIsRwi6uvrtXjxYhUWFiojI0Nr165VXFycGhsbR5x/+vRpzZgxQ0uXLlVq\naqpyc3O1ZMkSnTlzZtTFAwCAyLEUIgYHB9Xe3i632x0aczgccrvdamtrG3FNTk6Oenp69NFHH0mS\nvF6v3n33Xd10002jKBsAAESapXsi/H6/hoaG5HK5ho27XC6dO3duxDW5ubl69NFH9eyzz+rixYsa\nGhrSzTffrDVr1phXDQAAIs7oxkorOjs7tX//fq1cuVILFiyQ1+tVdXW19uzZo4cffjjcDw8AAMLE\nUoiIj49XTEyMfD7fsHGfz6fExMQR17zxxhvKzc3V3XffLUmaNWuW1qxZo6efflr33nvviOs8Ho+a\nm5uHjaWlpamsrEwJCQkKBoNWysYoOJ1OJSUlRbqMSYWe24+e24+e28vhcEiSDhw4oK6urmE/W7Ro\nkQoKCoyOaylExMbGKisrS8eOHdPChQslScFgUMePH1dxcfGIawKBgGJjhz9MTMx334pRUFBw2SfU\n19engYEBK2VjFJKSktTb2xvpMiYVem4/em4/em4vp9Op1NRUlZWVjelxLb87Y9myZTpy5Iiampp0\n9uxZ7d27V4FAQEVFRZKkmpoa7dq1KzT/5ptv1t/+9jcdPnxY58+f16lTp7R//37NnTv3smcvAADA\n+Gf5noj8/Hz5/X7V1taGPmyqoqJCCQkJki69+6Knpyc0v6ioSP39/Tp06JCqq6t1zTXXaP78+brv\nvvvG7lkAAADbOYJRdoNBd3c3lzNsxClH+9Fz+9Fz+9Fze319OWOs8d0ZAADACCECAAAYIUQAAAAj\nhAgAAGCEEAEAAIwQIgAAgBFCBAAAMEKIAAAARggRAADACCECAAAYIUQAAAAjhAgAAGCEEAEAAIwQ\nIgAAgBFCBAAAMEKIAAAARggRAADACCECAAAYIUQAAAAjhAgAAGCEEAEAAIwQIgAAgBFCBAAAMEKI\nAAAARggRAADACCECAAAYIUQAAAAjhAgAAGCEEAEAAIwQIgAAgBFCBAAAMEKIAAAARggRAADACCEC\nAAAYIUQAAAAjhAgAAGCEEAEAAIwQIgAAgBFCBAAAMEKIAAAARggRAADACCECAAAYIUQAAAAjhAgA\nAGCEEAEAAIwQIgAAgBFCBAAAMEKIAAAARggRAADACCECAAAYIUQAAAAjsSaLGhoadPDgQXm9XmVm\nZqq8vFzZ2dmXnT84OKjXXntNHo9HXq9X1157rVasWKGioiLTugEAQIRZDhEtLS2qrq7WL3/5S2Vn\nZ6u+vl7btm3Tc889p4SEhBHX7Ny5U319fVq3bp3S09P1+eefKxgMjrp4AAAQOZZDRH19vRYvXqzC\nwkJJ0tq1a/X3v/9djY2N+tnPfvat+UePHlVra6t27dqla665RpKUkpIyyrIBAECkWQoRg4ODam9v\n1z333BMaczgccrvdamtrG3HNBx98oDlz5ujNN9/UX//6V8XFxWnhwoVatWqVpkyZMrrqAQBAxFgK\nEX6/X0NDQ3K5XMPGXS6Xzp07N+Ka8+fPq7W1VU6nU5s2bZLf79fevXv1xRdfaN26deaVAwCAiAr7\nuzOCwaBiYmK0YcMGzZkzR3l5eXrwwQfV1NSkgYGBcD88AAAIE0tnIuLj4xUTEyOfzzds3OfzKTEx\nccQ1iYmJSkpK0tSpU0NjGRkZCgaD6unpUXp6+rfWeDweNTc3DxtLS0tTWVmZEhISuCnTRk6nU0lJ\nSZEuY1Kh5/aj5/aj5/ZyOBySpAMHDqirq2vYzxYtWqSCggKj41oKEbGxscrKytKxY8e0cOFCSZfO\nNBw/flzFxcUjrsnNzdV7772nQCCguLg4SdK5c+cUExOj5OTkEdcUFBRc9gn19fVxBsNGSUlJ6u3t\njXQZkwo9tx89tx89t5fT6VRqaqrKysrG9LiWL2csW7ZMR44cUVNTk86ePau9e/cqEAiEPvOhpqZG\nu3btCs0vKChQfHy8XnjhBXV2durkyZN65ZVX9OMf/1hOp3PMnggAALCX5bd45ufny+/3q7a2NvRh\nUxUVFaHPiPB6verp6QnNnzp1qrZs2aL9+/dr8+bNio+PV35+vlatWjV2zwIAANjOEYyyGwy6u7u5\nnGEjTjnaj57bj57bj57b6+vLGWON784AAABGCBEAAMAIIQIAABghRAAAACOECAAAYIQQAQAAjBAi\nAACAEUIEAAAwQogAAABGCBEAAMAIIQIAABghRAAAACOECAAAYIQQAQAAjBAiAACAEUIEAAAwQogA\nAABGCBEAAMAIIQIAABghRAAAACOECAAAYIQQAQAAjBAiAACAEUIEAAAwEnUhYuNGl/7976grG/+l\nuztGy5cn6/bbZ2j58mT2cwJgTycW9nNi6e6O0caNrrAc2xEMBoNhOXKY3HSTFBsb0Btv9ES6lEkh\nKSlJvb29Y3rM5cuT9b//Gxf68y23sJ//LRw9D7do39No7Hk42bGf9Nw+y5cna3AwTn//+9gfOyrj\nZVfXVZEuAaPwzf1jP6MfezqxsJ8TSzj3LypDRFraV5EuAaPwzf1jP6MfezqxsJ8TSzj3L+pCxLx5\nF/Xii59HugyMwosvfq5bbglo1qxB3XJLgP2cANjTiYX9nFhefPFzzZt3MSzHjrp7Irq7uzUwMBDp\nMiYNrlvaj57bj57bj57by+l0KjU1dcyPG3VnIgAAwPhAiAAAAEYIEQAAwAghAgAAGCFEAAAAI4QI\nAABghBABAACMECIAAIARQgQAADBCiAAAAEYIEQAAwAghAgAAGCFEAAAAI4QIAABghBABAACMECIA\nAIARQgQAADBCiAAAAEYIEQAAwAghAgAAGCFEAAAAI7EmixoaGnTw4EF5vV5lZmaqvLxc2dnZ37vu\n1KlT2rp1q2bNmqXKykqThwYAAOOE5TMRLS0tqq6uVmlpqbZv367Zs2dr27Zt6uvr+851Fy5c0O7d\nu+V2u42LBQAA44flEFFfX6/FixersLBQGRkZWrt2reLi4tTY2Pid6/bs2aM77rhDc+fONS4WAACM\nH5ZCxODgoNrb24edTXA4HHK73Wpra7vsusbGRnV3d2vFihXmlQIAgHHFUojw+/0aGhqSy+UaNu5y\nueT1ekdc8+mnn+rVV1/Vo48+qpgY7uMEAGCiCOur+tDQkJ5//nmVlpYqPT1dkhQMBsP5kAAAwCaW\n3p0RHx+vmJgY+Xy+YeM+n0+JiYnfmt/f36/29nZ1dHRo3759ki4FC0lavXq1tmzZonnz5n1rncfj\nUXNz87CxtLQ0lZWVKSEhgSBiI6fTqaSkpEiXManQc/vRc/vRc3s5HA5J0oEDB9TV1TXsZ4sWLVJB\nQYHZcYMWX5ErKiqUnZ2t8vJySZfOLKxfv17FxcUqKSkZNjcYDOrs2bPDxhoaGnTixAk98cQTmjFj\nhqZMmWKp4O7ubg0MDFhaA3NJSUnq7e2NdBmTCj23Hz23Hz23l9PpVGpq6pgf1/LnRCxbtkwvvPCC\nsrKylJ2drfr6egUCARUVFUmSampq1Nvbq0ceeUQOh0M/+MEPhq13uVyaMmXKt8YBAEB0sRwi8vPz\n5ff7VVtbG/qwqYqKCiUkJEiSvF6venp6xrxQAAAwvli+nBFpXM6wF6cc7UfP7UfP7UfP7RWuyxm8\n5xIAABghRAAAACOECAAAYIQQAQAAjBAiAACAEUIEAAAwQogAAABGCBEAAMAIIQIAABghRAAAACOE\nCAAAYIQQAQAAjBAiAACAEUIEAAAwQogAAABGCBEAAMAIIQIAABghRAAAACOECAAAYIQQAQAAjBAi\nAACAEUIEAAAwQogAAABGCBEAAMAIIQIAABghRAAAACOECAAAYIQQAQAAjBAiAACAEUIEAAAwQogA\nAABGCBEAAMAIIQIAABghRAAAACOECAAAYIQQAQAAjBAiAACAEUIEAAAwQogAAABGCBEAAMAIIQIA\nABghRAAAACOECAAAYIQQAQAAjBAiAACAEUIEAAAwQogAAABGCBEAAMAIIQIAABghRAAAACOECAAA\nYCTWZFFDQ4MOHjwor9erzMxMlZeXKzs7e8S577//vg4fPqyOjg4NDAzo+uuv18qVK3XjjTeOqnAA\nABBZls9EtLS0qLq6WqWlpdq+fbtmz56tbdu2qa+vb8T5J0+e1IIFC/TUU0+psrJS8+bNU2VlpTo6\nOkZbOwAAiCDLIaK+vl6LFy9WYWGhMjIytHbtWsXFxamxsXHE+WVlZSopKVFWVpbS09O1evVqXXfd\ndfrwww9HXTwAAIgcSyFicHBQ7e3tcrvdoTGHwyG32622trYrOkYwGNSXX36p6dOnW6sUAACMK5ZC\nhN/v19DQkFwu17Bxl8slr9d7Rceoq6tTIBDQ7bffbuWhAQDAOGPruzM8Ho9ef/11Pf7440pISLDz\noQEAwBiz9O6M+Ph4xcTEyOfzDRv3+XxKTEz8zrXNzc2qqqrSE088ofnz53/nXI/Ho+bm5mFjaWlp\nKisrU0JCgoLBoJWyMQpOp1NJSUmRLmNSoef2o+f2o+f2cjgckqQDBw6oq6tr2M8WLVqkgoICo+Na\nChGxsbHKysrSsWPHtHDhQkmX7nE4fvy4iouLL7vO4/GoqqpKjz32mPLy8r73cQoKCi77hPr6+jQw\nMGClbIxCUlKSent7I13GpELP7UfP7UfP7eV0OpWamqqysrIxPa7lyxnLli3TkSNH1NTUpLNnz2rv\n3r0KBAIqKiqSJNXU1GjXrl2h+R6PR7t379YDDzygOXPmyOv1yuv16sKFC2P2JAAAgP0sf9hUfn6+\n/H6/amtrQx82VVFREbrHwev1qqenJzT/yJEjGhoa0r59+7Rv377QeGFhodavXz8GTwEAAESCIxhl\nNxh0d3dzOcNGnHK0Hz23Hz23Hz2319eXM8Ya350BAACMECIAAIARQgQAADBCiAAAAEYIEQAAwAgh\nAgAAGCFEAAAAI4QIAABghBABAACMECIAAIARQgQAADBCiAAAAEYIEQAAwAghAgAAGCFEAAAAI4QI\nAABghBABAACMECIAAIARQgQAADBCiAAAAEYIEQAAwAghAgAAGCFEAAAAI4QIAABghBABAACMECIA\nAIARQgQAADBCiAAAAEYIEQAAwAghAgAAGCFEAAAAI4QIAABghBABAACMECIAAIARQgQAADBCiAAA\nAEYIEQAAwAghAgAAGCFEAAAAI4QIAABghBABAACMECIAAIARQgQAADBCiAAAAEYIEQAAwAghAgAA\nGCFEAAAAI4QIAABghBABAACMECIAAIARQgQAADASa7KooaFBBw8elNfrVWZmpsrLy5WdnX3Z+SdO\nnNDLL7+szs5OpaSk6J577lFRUZFpzQAAYBywfCaipaVF1dXVKi0t1fbt2zV79mxt27ZNfX19I84/\nf/68nnnmGbndbu3YsUPFxcWqqqrSJ598MuriAQBA5FgOEfX19Vq8eLEKCwuVkZGhtWvXKi4uTo2N\njSPOP3z4sNLS0nT//fdr5syZWrp0qW677TbV19ePungAABA5lkLE4OCg2tvb5Xa7Q2MOh0Nut1tt\nbW0jrjl9+vSw+ZKUl5d32fkAACA6WAoRfr9fQ0NDcrlcw8ZdLpe8Xu+Ia7xe74jzL1y4oIGBAYvl\nShs3uvTvf3M/aDTr7o7R8uXJuv32GVq+PJn9nADY04mF/ZxYurtjtHGj6/snGjC6sTKSvvpqinbs\nSNLOnb5IlzIpOBwOOZ3OMT3m737n0uDgFCUnS4ODseznN4Sj5+EW7XsajT0PJzv2k57b53e/c+mr\nr6aE5diWQkR8fLxiYmLk8w3/y+Tz+ZSYmDjimsTExBHnT5s27bJ/gTwej5qbm4eN3XDDDSopKVFN\njSRNkZRqpXSMQmrq2Pa6uvqbI+znN411z8NtIuxptPU8nOzaT3puj//ez7q6OrW2tg77+aJFi1RQ\nUGB0bEshIjY2VllZWTp27JgWLlwoSQoGgzp+/LiKi4tHXJOTk6OjR48OG/v444+Vk5Nz2ccpKCgY\n8QnV1dWppKTESskYpQMHDqisrCzSZUwq9Nx+9Nx+9Nx+X7+GjuXrqOULXcuWLdORI0fU1NSks2fP\nau/evQoEAqHPfaipqdGuXbtC85csWaKuri698sorOnfunA4dOqT33ntPy5Yts1zsN9MTwq+rqyvS\nJUw69Nx+9Nx+9Nx+4XgNtXxPRH5+vvx+v2pra0MfNlVRUaGEhARJl26k7OnpCc2fMWOGnnzySb30\n0kt66623lJycrHXr1mnBggVj9ywAAIDtjG6svOuuu3TXXXeN+LP169d/a+yHP/yhKisrTR4KAACM\nU7xvBwAAGLnqN7/5zW8iXYQVs2bNinQJkw49tx89tx89tx89t99Y99wRDAaDY3pEAAAwKXA5AwAA\nGCFEAAAAI4QIAABghBABAACMjKsv4GpoaNDBgwdDH2JVXl6u7Ozsy84/ceKEXn75ZXV2diolJUX3\n3HNP6JMzcWWs9Pz999/X4cOH1dHRoYGBAV1//fVauXKlbrzxRpurjm5W/55/7dSpU9q6datmzZrF\n565YZLXng4ODeu211+TxeOT1enXttddqxYoV/H6xwGrP33nnHdXV1emzzz7TtGnTlJeXpwceeEDT\np0+3sero1draqrq6OrW3t8vr9WrTpk2hr6e4nLF4DR03ZyJaWlpUXV2t0tJSbd++XbNnz9a2bdvU\n19c34vzz58/rmWeekdvt1o4dO1RcXKyqqip98sknNlcevaz2/OTJk1qwYIGeeuopVVZWat68eaqs\nrFRHR4e9hUcxqz3/2oULF7R792653W6bKp04THq+c+dOnThxQuvWrdNzzz2nDRs2aObMmTZWHd2s\n9vzUqVPavXu37rzzTu3cuVMbN27UmTNnVFVVZXPl0SsQCCgzM1MPPfTQFc0fq9fQcRMi6uvrtXjx\nYhUWFiojI0Nr165VXFycGhsbR5x/+PBhpaWl6f7779fMmTO1dOlS3Xbbbaqvr7e58uhltedlZWUq\nKSlRVlaW0tPTtXr1al133XX68MMPba48elnt+df27NmjO+64Q3PnzrWp0onDas+PHj2q1tZWbd68\nWfPnz1dKSormzp37nV8aiOGs9vz06dOaMWOGli5dqtTUVOXm5mrJkiU6c+aMzZVHr7y8PK1atUq3\n3HLLFc0fq9fQcREiBgcH1d7ePuxfWQ6HQ263W21tbSOuOX369Lf+VZaXl3fZ+RjOpOffFAwG9eWX\nX3K68QqZ9ryxsVHd3d1asWKFHWVOKCY9/+CDDzRnzhy9+eabevjhh7VhwwZVV1fr4sWLdpUd1Ux6\nnpOTo56eHn300UeSLn0H07vvvqubbrrJlpono7F6DR0X90T4/X4NDQ3J5XING3e5XDp37tyIa7xe\n74jzL1y4oIGBATmdzrDVOxGY9Pyb6urqFAgEdPvtt4ejxAnHpOeffvqpXn31Vf32t79VTMy4yPxR\nxaTn58+fV2trq5xOpzZt2iS/36+9e/fqiy++0Lp16+woO6qZ9Dw3N1ePPvqonn32WV28eFFDQ0O6\n+eabtWbNGjtKnpTG6jWU30ow4vF49Prrr+vxxx8PfYMrxtbQ0JCef/55lZaWKj09XdKlsz8Ir2Aw\nqJiYGG3YsEFz5sxRXl6eHnzwQTU1NWlgYCDS5U1InZ2d2r9/v1auXKnKykpVVFSou7tbe/bsiXRp\n+B7j4kxEfHy8YmJi5PP5ho37fD4lJiaOuCYxMXHE+dOmTeMsxBUw6fnXmpubVVVVpSeeeELz588P\nZ5kTitWe9/f3q729XR0dHdq3b5+kS8FCklavXq0tW7Zo3rx54S88ipn+bklKStLUqVNDYxkZGQoG\ng+rp6QkFOozMpOdvvPGGcnNzdffdd0u69P0Oa9as0dNPP6177733e38nwbqxeg0dF2ciYmNjlZWV\npWPHjoXGgsGgjh8/rtzc3BHX5OTk6Pjx48PGPv74Y25+ukImPZcunYH4wx/+oMcee0x5eXl2lDph\nWO351Vdfrd///vfasWNH6L8lS5Zo5syZ2rFjBzdZXgGTv+e5ubnq7e1VIBAIjZ07d04xMTFKTk4O\ne83RzqTngUBAV1111bAxLt+F11i9ho6bb/G8+uqrVVtbq+TkZDmdTv3xj3/UP//5Tz388MOKi4tT\nTU2NmpqadOutt0qS0tPT9ac//Un/+c9/lJKSopaWFv35z3/WL37xC6WlpUX42UQHqz33eDzavXu3\nHnzwQbndbvX396u/v19DQ0Oc/blCVnrucDiUkJAw7L9//OMf6urq0s9//vNv/dLFyKz+PZ85c6be\nfvtttbe36/rrrw+dar/11ltDc/DdrPb84sWLqqurU3x8vOLj4/Wvf/1LBw4cUEpKin76059G+NlE\nh/7+fnV2dsrr9eovf/mLsrOzNWXKFA0ODmratGlhew0dF5czJCk/P19+v1+1tbWhDyepqKgIXW/3\ner3q6ekJzZ8xY4aefPJJvfTSS3rrrbeUnJysdevWacGCBZF6ClHHas+PHDmioaEh7du3L3R6XZIK\nCwu1fv162+uPRlZ7jtGz2vOpU6dqy5Yt2r9/vzZv3qz4+Hjl5+dr1apVkXoKUcdqz4uKitTf369D\nhw6purpa11xzjebPn6/77rsvUk8h6rS3t2vr1q2hP7/88suS/v/3c7heQ/kqcAAAYISLTgAAwAgh\nAgAAGCFEAAAAI4QIAABghBABAACMECIAAIARQgQAADBCiAAAAEYIEQAAwAghAgAAGCFEAAAAI4QI\nAABg5P8AUGes10LjfHEAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "%matplotlib inline\n", "plt.style.use('ggplot')\n", "\n", "plt.plot(X, Y, marker='.', color='blue', linestyle='none')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "可以用zip得到网格平面上坐标点的数据:" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[(0.0, 0.0),\n", " (0.25, 0.0),\n", " (0.5, 0.0),\n", " (0.75, 0.0),\n", " (1.0, 0.0),\n", " (0.0, 0.5),\n", " (0.25, 0.5),\n", " (0.5, 0.5),\n", " (0.75, 0.5),\n", " (1.0, 0.5),\n", " (0.0, 1.0),\n", " (0.25, 1.0),\n", " (0.5, 1.0),\n", " (0.75, 1.0),\n", " (1.0, 1.0)]" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "z = [i for i in zip(X.flat, Y.flat)]\n", "z" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "好了,下面继续进入书中的内容" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[-5. , -5. , -5. , ..., -5. , -5. , -5. ],\n", " [-4.99, -4.99, -4.99, ..., -4.99, -4.99, -4.99],\n", " [-4.98, -4.98, -4.98, ..., -4.98, -4.98, -4.98],\n", " ..., \n", " [ 4.97, 4.97, 4.97, ..., 4.97, 4.97, 4.97],\n", " [ 4.98, 4.98, 4.98, ..., 4.98, 4.98, 4.98],\n", " [ 4.99, 4.99, 4.99, ..., 4.99, 4.99, 4.99]])" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "points = np.arange(-5, 5, 0.01) # 1000 equally spaced points\n", "xs, ys = np.meshgrid(points, points) # xs和ys是一样的\n", "ys" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[ 7.07106781, 7.06400028, 7.05693985, ..., 7.04988652,\n", " 7.05693985, 7.06400028],\n", " [ 7.06400028, 7.05692568, 7.04985815, ..., 7.04279774,\n", " 7.04985815, 7.05692568],\n", " [ 7.05693985, 7.04985815, 7.04278354, ..., 7.03571603,\n", " 7.04278354, 7.04985815],\n", " ..., \n", " [ 7.04988652, 7.04279774, 7.03571603, ..., 7.0286414 ,\n", " 7.03571603, 7.04279774],\n", " [ 7.05693985, 7.04985815, 7.04278354, ..., 7.03571603,\n", " 7.04278354, 7.04985815],\n", " [ 7.06400028, 7.05692568, 7.04985815, ..., 7.04279774,\n", " 7.04985815, 7.05692568]])" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "z = np.sqrt(xs ** 2 + ys ** 2)\n", "z" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "这里我们用matplotlib把图画出来:" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAcgAAAGECAYAAACyO7D9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAIABJREFUeJzsfXmYFcW5/nvOsO8CIpuAKOACQuS6goKaBJe4RTDGJYyI\nihONJiQxcfm5JLhDjJHcoKIQDWoS18QNjJoAokSDN3FFRERF4cIwYEBwYPr3h+lza2q+76uvqvuc\nMyP9Ps88p7vq26q6u96upWtyURRFyJAhQ4YMGTLUQ77cAWTIkCFDhgyNERlBZsiQIUOGDAQygsyQ\nIUOGDBkIZASZIUOGDBkyEMgIMkOGDBkyZCCQEWSGDBkyZMhAICPIDBkyZMiQgUBGkBkyZMiQIQOB\njCAzZMiQIUMGAhlBZsiQIUOGDAQygsyQIUOGDBkINCt3ABky2Mjn88jlcuUOo9EgiiLkcjls3769\n3KFkyLBDIZdtVp6hMWHVqlWYPn06pkyZUu5QMmTIsIMjG2LN0Kjw4IMP4uSTTy53GBkyZMiQEWSG\nxoWXX34Z++23X7nDyJAhQ4aMIDM0HnzyySfo2bNnucPIkCFDBgAZQWZoRHjwwQfxzW9+s9xhZMiQ\nIQOAbBVrhkaEl156Cd/97ncT23nxxRexcOFCfPrpp3jhhRdw+eWX47DDDkshwnTRVOLMkGFHRUaQ\nGRoFVq9ejR49eiS289lnn+HRRx/FddddBwD44x//iKOPPhrLli1LxX5aaCpxZsiwIyMbYi0D3n//\nfeTzeUyYMKHcoXjh1ltvxT777IM2bdogn8/j1ltvTc32Qw89lMrw6rJly3DjjTdi+fLlAIAxY8bg\ns88+w8KFCxPbThNpx1nMa/NlQMgz169fP/Tv37+IUX2BxnTtmmrbVCwE9SDjD7mzD5fLi/fffx+7\n7bYbKisrcddddxXV1/3334+LL74Y++23H77//e+jZcuWOOigg1Kzv2jRIpx//vmJ7QwZMgQLFy4s\nNGwffPABcrkcBgwY4G3r888/R4sWLRLHRCHNOIt9bb4syOVyXhtQlGKziuzaNW5kQ6wZVHj88ceR\ny+Xw+OOPY5dddknV9po1a1K1aTYw119/PSZPnoyhQ4d62/nud7+La665pmhDnmnFWcxr82VBr169\n8Oabb6Jjx47lDqUesmvXuJERZBNGKTdBWrVqFQAU5SFOa3jVxl133YWePXvi+uuvD9Lftm0bamtr\nU46qIZLGWcxr82VBs2bNMHDgwHKH0QDZtWvcSGUO0hy3Xr58OcaOHYuuXbuiQ4cOGDNmDF5//XUA\nwNq1a3HuueeiZ8+eaN26NQ444AA8//zzpM1Zs2Zh7Nix2H333dGmTRt07NgRI0eOxO9+9zs2jl/+\n8pfYZ5990Lp1a/Tu3RsXXnghNm7cKM4lvPTSSxg7dix69OiBli1bok+fPpg0aRI+/vhj77K//fbb\nOPHEE9GlSxe0a9cOhx56KObNm6eyY+L3v/89DjvsMHTq1Alt2rTBvvvui+uvvx6ff/55Qebqq69G\n//79kcvlMGvWLOTz+cLfb3/721T95PN5PPfcc4iiqOCjoqLCu1wcXnjhBRx88MGp2QP+7838+uuv\nx9atW/H++++naj8tJIlTe2001zmGeT+/8847+Na3voVddtkFFRUV+Nvf/ibGE/LMSvB5nl1xS3Nr\nt912GwYPHtzATwi0dR3yXL300kvI5/PiTlN77bUXWrdujZqamkJaGtflr3/9K/L5PK655hoyn2tj\nfdvXxx57DEceeSR69uyJVq1aoVevXhg9ejT++7//Wx1rmki1B/nee+/hwAMPxN57742zzjoLK1as\nwEMPPYTDDz8cL7zwAo466ih07NgRp556Kqqrq3HffffhmGOOwdKlS9G7d+96tqqqqjB48GCMGjUK\nPXr0wLp16/DEE0/gzDPPxNKlS3H11Vc3kP/Nb36DXr164bzzzkOLFi3w2GOPYfHixdi2bRs5l3TX\nXXfhvPPOQ6tWrXD88cdj1113xTvvvIOZM2fiT3/6E1566aUGcXFYvnw5Dj74YOy7776FG+CBBx7A\n0Ucfjfvuuw/jxo1T2bn00ktx/fXXY+edd8bpp5+Odu3a4cknn8Sll16KuXPnYu7cuWjWrBkOP/xw\nbNiwAbfccguGDRuGE088sWBj2LBhqfrJ5XK4++67sXLlSlx11VWFzbO12LJlC1q1akXmrV27Fjvv\nvLPTxuLFi3H//fcjl8vh/fffxx133IEZM2agpqYGH330Ea655hrstttuAL54mFevXo1jjz0Wn3zy\nCV588UX06NEDffv2Vcccivfeew/Tpk3DihUr8O1vfxunnXZaIe+mm27CK6+8gvvvvz+VODXXRnud\nbSxbtgwHHnggBg0ahDPOOAOfffYZOnToIMbj+8y6bPk+zyFxX3TRRfjVr36Fnj174rzzzkPz5s3x\n6KOP4qWXXsLnn3+Oli1bqmP2qeuQ5you1xNPPIH169djp512qpf/97//HW+//TbGjRuHTp061avL\ntK4LBypu3/b19ttvx6RJk9CjRw8cf/zx6Nq1K9asWYN//vOfmDVrViprFLwRBSCXy0X5fL5wvmLF\nikLaddddV0/2Zz/7WZTL5aLOnTtHVVVV9fLuueeeKJfLRT/4wQ8a+Fi+fHmDtNra2ujII4+MWrRo\nEa1ataqQPn/+/CiXy0V77bVXtHHjxnryhx12WJTL5aLddtutnq2lS5dGLVq0iAYOHBh9/PHH9fKe\nffbZqKKiIvrmN7/prAuz7Jdcckm9vFdeeSVq3rx51Llz5+jTTz9toHPWWWfVk1+0aFGUy+Wifv36\nRWvWrCmkb9++PTruuOMa1C9nxwVfP1EURaNHj653zbXYvn179I1vfCN67bXXyPwZM2ZE8+fPF20s\nXbo0+t73vlc4r6ysjAYOHBi9+OKL0YIFC6J8Ph9NmzYtiqIv7pv27dtH+Xw+yufzhWtj1r8WlZWV\n0fvvv++lc/7550e1tbXRLbfcEg0dOrRe3uDBg6NTTz019Ti5axNync37+fLLL/eKw+eZlRDyPLvi\npp6VF154IcrlctHAgQOjmpqaQvrWrVujgw8+mPTDIaSuo8j/ubruuuuifD4fTZ8+vUFeVVVVlM/n\no8cff7xeus914dqU559/PsrlctHVV19NxtWvX796dRXSvg4fPjxq1apVtHbt2gb2161bR/otNlIl\nyP79+0d1dXX1ZFeuXBnlcrmoXbt20b///e96edu3b4+aN28eHXHEEWrfDz30UJTP56N77rmnkHb2\n2WdH+Xw+uvfeexvIL1y4kLzRL7744iifz0dPPPEE6eekk06Kmjdv3iBmG3HZd9ppJ1K2srIyyufz\n0W9/+9sGOvZNOHHixCifz0d33nlnAztLly6NKioqot13391pxwVfP1EUTpA333xz1Ldv3+j6668n\n888880ynje9+97vR5s2bC+djx46NDjrooCiKouiDDz6IfvSjH0XV1dXesblQWVkZrVixQi2/YMGC\n6P7774+iKIqOOuqoaNy4cYW86urqKJ/PR7/5zW9Sj5O7NiHXOb6nevToEX3++eepxEc9sxJCnmdX\n3NSzEtfP7NmzG8jHhKAlyJC6jiL/5+rDDz+MKioqogMOOKBe+ueffx516dIl6t69e7R9+3aVLeq6\n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\nODU/aeCYY47BhAkT8Le//Q2HH344/vrXv6o2RB41ahTOOussvPLKK3jllVfw0ksvoaqqCueffz5a\ntGiB448/HgceeGCqsSbFL3/5S0ycOBHf+9730LJlS/zrX//CTjvt1GD4q9go5XX2fWYlhDzPITjk\nkENw4YUXFjYKGDt2bOE7yM6dO3ttMVjqZ+qQQw7BHnvsgT/84Q+ora0tfDdoI63r0qxZM1x00UX4\n+c9/jmHDhuGkk07Ctm3bMG/ePPTq1avBPzoPaV9POukktGvXDgcddBD69euHKIowf/58/P3vf8f+\n+++Pr371q8kqLQQhS19zuVxUUVFROF+xYkWUz+ejCRMmkPL5fJ79lKNfv35R//79G6QvWrQoOvLI\nI6POnTtHHTp0iA499NDosccei55//vkon89H11xzTQOdW265Jdprr72iVq1aRb169YouvPDCaOPG\njVH79u2jr3zlK6T/1157LTrrrLOifv36Ra1atYq6dOkSDRkyJJo0aVL03HPPOevCXBb91ltvRSee\neGLUuXPnqG3bttGhhx4azZs3j9SR6uuBBx6IDj300KhDhw5R69ato8GDB0fXXXddtHXr1gay7777\nbnT88cdHXbt2jSoqKthl60n9jB49ut41D8EhhxwS/eAHP4iqq6ujCy+8MJGtUuCss87y/g7SRl1d\nXdS9e/fo7LPPTimqhnBdG5/r7Lo3JYQ8sxJ8nmdX3FL+9OnTo7333ruBH65tkuBT11GU7Ln6+c9/\nHuXz+aiioiJ6+OGHWTmf6+KqxxtuuCHaY489opYtW0Z9+/aNfvKTn0SfffYZW1c+7euMGTOib37z\nm9Huu+8etW3bNurSpUu03377RTfffLPzc7tiIYggmxKWLl0a5XK56LTTTiuK/dBvEXdEXHfdddGA\nAQOiu+66K3rmmWfKHY4Tr776arRt2zYvnW9961v1Ngh46KGHotatW0fvvvtu2uHtkCj285whg4lG\nOQcZgtWrVzdYdbh582ZcfPHFyOVyRdkMO4MfjjvuOCxbtgx33313qp9pFAtDhw713nP22WefLcw1\nrlq1Cj/84Q8xe/bskvxfwS8Tsuc5Q2NAo5yD1OKpp57Cn/70J9TU1OC9997DypUr8dWvfhU9evTA\nJ598gr/85S/46KOPcMwxx7Ab/C5YsAAjR44sceTlRznKvc8++6Bfv37Yc889U5lDCkGxyz1jxgy8\n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\no2vXPxdj8uTJKCkpwfz583Ho0CHU1NRg+vTprfK56aabsGjRIvzgBz9ASclnCwVMnTo1yaqkSpUq\nVaqjRKNHj8a+ffuwYsWK3EIBd9xxB0444QQAn03K2bVrV86+srISt912G5YuXYpnnnkGffv2xY03\n3oizzz47KN9EAXnmmWdi+fLlqk1tbS1qa2vF+NLSUkybNg3Tpk0TbXr27ImbbropdjlTpUqVKtWx\npYkTJ2LixIlsXF1dXZuwM888Ez/+8Y/zyrNzzk5JlSpVqlSpPOr0gBwzZkx7F6FdlNa7cymtd6pU\n4cq0HGvLq6dKlSpVqlRFUKfvQaZKlSpVqlScUkCmSpUqVapUjFJApkqVKlWqVIxSQKZKlSpVqlSM\nOvVi5aH/UH0068knn8Rrr72G7du3o1u3bhg2bBiuu+469O/fv5Xd8uXL8dJLL6GxsRHV1dWYOXMm\n+vXrl4s/dOgQli5dildffRWHDh3COeecgxkzZogLXR9tWrlyJX75y1/i0ksvxeTJk3PhHbHeu3fv\nxi9+8Qu8+eabOHjwIL7whS/gxhtvxKBBg3I2Ha3eR44cwYoVK7BmzRpks1n06dMH48ePx1VXXdXK\n7liv98aNG7Fq1So0NDQgm83illtuwahRo1rZJFHH/fv3Y/HixXjjjTdyi65MmTIFxx13XNHqejSr\n0/YgQ/+h+mjX22+/jUsuuQRz587FnXfeicOHD2Pu3Ln49NNPczYrV67E6tWrcf311+OHP/whunfv\njrlz56K5uTlnU19fj3Xr1mH27NmYM2cOPv74Y8ybN689qhSsLVu24IUXXsBpp53WKrwj1ruxsRF3\n3nknSktLcccdd+C+++7Dt7/9bfTq1Stn0xHrvXLlSrzwwguYMWMGfvrTn+Jb3/oWVq1ahdWrV7ey\nOdbrffDgQVRVVWHGjBlsfFJ1vP/++/H+++/jrrvuwm233YaNGzdiwYIFBa3bMaWWTqrbb7+9ZfHi\nxbn9I0eOtHznO99pWblyZTuWKjnt2bOnpba2tmXjxo25sOuvv77lqaeeyu03Nja2/NVf/VXL2rVr\nc/vXXntty3/913/lbN5///2W2trals2bNxev8DH0ySeftNx0000t69evb7n77rtb6uvrc3Edsd6P\nPfZYy1133aXadMR6/+hHP2r5+c9/3irsJz/5Scs///M/5/Y7Wr1ra2tb/vu//7tVWBJ1fO+991pq\na2tbGhoacjbr1q1rueaaa1o+/vjjQlbpmFGn7EHG+YfqY01NTU0AkOtR7Ny5E9lstlWdy8rKMHTo\n0FydGxoacPjwYZx11lk5m/79+6OiouKoPy4PP/wwRo4c2arsQMet9xtvvIHBgwdj/vz5mDlzJm69\n9Va8+OKLufiOWu/q6mps2LABH3zwAQBg69ateOedd/ClL30JQMett6uk6rh582b07NkTp59+es7m\n7LPPRiaTwebNm4tUm6NbnfIZZJx/qD6W1NLSgvr6egwfPhynnHIKgM8W8wXA1jmKy2az6Nq1a6v/\n4qQ2R6PWrl2LP/7xj/jRj37UJq6j1nvHjh147rnncPnll+Mb3/gGtmzZgiVLlqC0tBQXXnhhh633\nlVdeiU8++QQ333wzSkpK0NLSgkmTJuVWzOmo9XaVVB2z2WwbHyUlJejVq9cxcRyKoU4JyI6uhx9+\nGNu2bcMPfvCD9i5KwbVr1y7U19fjzjvvbPWvMB1dLS0tGDx4MCZNmgQAqKqqwnvvvYfnn38eF154\nYTuXrnB65ZVXsGbNGtx888045ZRTsHXrVtTX1+PEE0/s0PVO1T7qlEOscf6h+ljRokWLsG7dOtx9\n993o06dPLjyql1bn8vJyNDc354ZnOZujTQ0NDdi7dy9uvfVWXHvttbj22mvxhz/8Af/6r/+Ka6+9\nNneH3NHq3adPHwwYMKBV2IABA3L/vdpRf+/HHnsMV155Jc4//3yceuqpuOCCC3DZZZfhySefBNBx\n6+0qqTqWl5e38XHkyBHs37//mDgOxVCnBGScf6g+FrRo0SK8/vrr+P73v4+KiopWcZWVlSgvL29V\n56amJmzevDlX50GDBqFLly6t/ol7+/bt+Oijj4L/ibtYGjFiBObNm4d777039xk0aBAuuOAC3Hvv\nvTj55JM7ZL2rq6vbPA7Yvn177nfvqL/3p59+ipKS1s1WJpNBy+dLSnfUertKqo7Dhg1DY2Mj3n33\n3ZzN+vXr0dLSgqFDhxapNke3utx99913t3ch2kM9evTAihUr0LdvX5SWluLxxx/HH//4R9xwww3o\n3r17excvWA8//DDWrl2Lv/u7v0N5eTkOHDiAAwcOoKSkBF26dAHw2d3hypUrMWDAADQ3N2Px4sVo\nbm7GtGnTUFJSgtLSUnz88cdYvXo1qqqqsH//fixcuBAVFRVt3jM7WtS1a1eccMIJrT5r167FySef\nnBty64j1rqiowK9+9SuUlJSgT58+ePPNN/GrX/0KkyZNwsCBAwF0zHq///77+Ld/+zf0798fXbt2\nxVtvvYXHH38cY8eOzU1a6Qj1PnDgALZt24ZsNosXXngBQ4YMQbdu3dDc3IyysrJE6njCCSdgy5Yt\nWLt2LaqqqrBz504sXLgQNTU1GDduXDsfgaNDnfrfPJ599lmsWrUqt1DAtGnTMHjw4PYuVixdc801\nbHhdXV2rk33FihV48cUX0djYiDPOOAPTp09v83Lxo48+irVr1+LQoUOoqanB9OnTj5oXqC2aM2cO\nqqqqWi0U0BHr/bvf/Q7Lli3Dhx9+iMrKSlx++eWYMGFCK5uOVu8DBw5g+fLleO2117B371706dMH\nY8eOxVVXXZW7EQSO/Xr/4Q9/wJw5c9qEjxs3LvfnwEnUsbGxEYsWLWq1UMDUqVOPyU5CIdSpAZkq\nVapUqVJJ6pTPIFOlSpUqVSqfUkCmSpUqVapUjFJApkqVKlWqVIxSQKZKlSpVqlSMUkCmSpUqVapU\njFJApkqVKlWqVIxSQKZKlSpVqlSMUkCmSpUqVapUjFJApkqVKlWqVIxSQKZKlSpVqlSMUkCmSpUq\nVapUjFJApkqVKlWqVIz+P/ccRi8qaOT2AAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.imshow(z, cmap=plt.cm.gray); plt.colorbar()\n", "plt.title(\"Image plot of $\\sqrt{x^2 + y^2}$ for a grid of values\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 1 Expressing Conditional Logic as Array Operations (像数组操作一样表示逻辑条件)\n", "\n", "`numpy.where`函数是一个向量版的三相表达式,`x if condition else y`。假设我们有一个布尔数组和两个数组:" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "collapsed": true }, "outputs": [], "source": [ "xarr = np.array([1.1, 1.2, 1.3, 1.4, 1.5])\n", "yarr = np.array([2.1, 2.2, 2.3, 2.4, 2.5])\n", "cond = np.array([True, False, True, True, False])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "假设如果cond中为true,我们去xarr中对应的值,否则就取yarr中的值。列表表达式的话会这么写:" ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "[1.1000000000000001, 2.2000000000000002, 1.3, 1.3999999999999999, 2.5]" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "result = [(x if c else y)\n", " for x, y, c in zip(xarr, yarr, cond)]\n", "\n", "result" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "这么做的话会有很多问题。首先,对于很大的数组,会比较慢。第二,对于多维数组不起作用。但`np.where`能让我们写得更简洁:" ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([ 1.1, 2.2, 1.3, 1.4, 2.5])" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "result = np.where(cond, xarr, yarr)\n", "result" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`np.where`中第二个和第三个参数不用必须是数组。where在数据分析中一个典型的用法是基于一个数组,产生一个新的数组值。假设我们有一个随机数字生成的矩阵,我们想要把所有的正数变为2,所有的负数变为-2。用where的话会非常简单:" ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[ 2.18194474, 0.15001978, -0.77191684, 0.18716397],\n", " [ 1.2083149 , -0.22911585, 1.30880201, 0.14197253],\n", " [ 0.65639111, -1.28394185, 0.65706167, 1.14277598],\n", " [-0.32639966, -0.26880881, -0.10225964, 0.4739671 ]])" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr = np.random.randn(4, 4)\n", "arr" ] }, { "cell_type": "code", "execution_count": 32, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[ True, True, False, True],\n", " [ True, False, True, True],\n", " [ True, False, True, True],\n", " [False, False, False, True]], dtype=bool)" ] }, "execution_count": 32, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr > 0" ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[ 2, 2, -2, 2],\n", " [ 2, -2, 2, 2],\n", " [ 2, -2, 2, 2],\n", " [-2, -2, -2, 2]])" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.where(arr > 0, 2, -2)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "我们可以结合标量和数组。比如只把整数变为2,其他仍未原来的数字:" ] }, { "cell_type": "code", "execution_count": 34, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[ 2. , 2. , -0.77191684, 2. ],\n", " [ 2. , -0.22911585, 2. , 2. ],\n", " [ 2. , -1.28394185, 2. , 2. ],\n", " [-0.32639966, -0.26880881, -0.10225964, 2. ]])" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.where(arr > 0, 2, arr) # set only positive value to 2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 2 Mathematical and Statistical Methods (数学和统计方法)\n", "\n", "一些能计算统计值的数学函数能基于整个数组,或者沿着一个axis(轴)。可以使用aggregations(often called reductions,汇总,或被叫做降维),比如sum, mean, and std(标准差).\n", "\n", "下面是一些aggregate statistics(汇总统计):\n" ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[-1.53575656, -1.39268394, -1.02284353, -1.03165049],\n", " [ 0.53301867, 0.50258973, -0.49389656, 0.24610963],\n", " [ 0.95377174, -1.57268184, 0.42969986, 1.22912566],\n", " [ 0.73686692, -2.82328155, 0.48018497, -1.38046692],\n", " [ 0.94164808, 0.19599722, -0.88779738, -0.87556277]])" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr = np.random.randn(5, 4)\n", "arr" ] }, { "cell_type": "code", "execution_count": 36, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "-0.33838045197794597" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr.mean()" ] }, { "cell_type": "code", "execution_count": 37, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "-0.33838045197794597" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.mean(arr)" ] }, { "cell_type": "code", "execution_count": 38, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "-6.767609039558919" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr.sum()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "mean, sum这样的函数能接受axis作为参数来计算统计数字,返回的结果维度更少:" ] }, { "cell_type": "code", "execution_count": 39, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([-1.24573363, 0.19695537, 0.25997886, -0.74667415, -0.15642871])" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr.mean(axis=1)" ] }, { "cell_type": "code", "execution_count": 40, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([ 1.62954886, -5.09006038, -1.49465263, -1.81244489])" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr.sum(axis=0)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "这里`arr.mean(1)`表示,compute mean acros the columns(计算各列之间的平均值)。`arr.sum(0)`表示,compute sum down the rows(计算各行总和)。\n", "\n", "其他一些方法,像cumsum和cumprod不做汇总,而是产生一个中间结果的数组:" ] }, { "cell_type": "code", "execution_count": 41, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([ 0, 1, 3, 6, 10, 15, 21, 28])" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr = np.array([0, 1, 2, 3, 4, 5, 6, 7])\n", "arr.cumsum()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "上面的计算是一个累加的结果,`0+1=1,1+2=3,3+3=6`以此类推。" ] }, { "cell_type": "code", "execution_count": 44, "metadata": { "collapsed": true }, "outputs": [], "source": [ "np.cumsum?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "对于多维数组,accumulation functions(累积函数)比如cumsum,返回的是同样大小的数组,但是部分聚合会沿着指示的轴向较低维度进行切片:" ] }, { "cell_type": "code", "execution_count": 45, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[0, 1, 2],\n", " [3, 4, 5],\n", " [6, 7, 8]])" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]])\n", "arr" ] }, { "cell_type": "code", "execution_count": 46, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[ 0, 1, 2],\n", " [ 3, 5, 7],\n", " [ 9, 12, 15]])" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr.cumsum(axis=0) # 沿着行加法" ] }, { "cell_type": "code", "execution_count": 47, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[ 0, 0, 0],\n", " [ 3, 12, 60],\n", " [ 6, 42, 336]])" ] }, "execution_count": 47, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr.cumprod(axis=1) # 沿着列乘法" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "这里有一些基本的统计计算方法:\n", "![](http://oydgk2hgw.bkt.clouddn.com/pydata-book/9mzrp.png)\n", "\n", "# 3 Methods for Boolean Arrays(布尔数组的方法)\n", "\n", "sum是用来计算布尔数组中有多少个true的:" ] }, { "cell_type": "code", "execution_count": 48, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "46" ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr = np.random.randn(100)\n", "(arr > 0).sum() # Number of positive values" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "有两个其他方法,any和all,对于布尔数组特别有用。any检测数组中只要有一个ture返回就是true,而all检测数组中都是true才会返回true。" ] }, { "cell_type": "code", "execution_count": 49, "metadata": { "collapsed": true }, "outputs": [], "source": [ "bools = np.array([False, False, True, False])" ] }, { "cell_type": "code", "execution_count": 50, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" } ], "source": [ "bools.any()" ] }, { "cell_type": "code", "execution_count": 51, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "False" ] }, "execution_count": 51, "metadata": {}, "output_type": "execute_result" } ], "source": [ "bools.all()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 4 Sorting(排序)\n", "\n", "numpy中也有sort方法:" ] }, { "cell_type": "code", "execution_count": 53, "metadata": { "collapsed": true }, "outputs": [], "source": [ "np.random.randn?\n", "# 返回符合正态分布的数值" ] }, { "cell_type": "code", "execution_count": 54, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([ 1.93663555, -1.29810982, 0.83366006, 0.51674613, 2.32879117,\n", " 1.07342758])" ] }, "execution_count": 54, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr = np.random.randn(6)\n", "arr" ] }, { "cell_type": "code", "execution_count": 55, "metadata": { "collapsed": true }, "outputs": [], "source": [ "arr.sort()" ] }, { "cell_type": "code", "execution_count": 56, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([-1.29810982, 0.51674613, 0.83366006, 1.07342758, 1.93663555,\n", " 2.32879117])" ] }, "execution_count": 56, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "如果是多维数组,还可以按axis来排序:" ] }, { "cell_type": "code", "execution_count": 57, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[-0.76658562, -1.00222899, 0.39039437],\n", " [ 0.23100317, -1.0581081 , 1.69177329],\n", " [ 1.0239365 , 0.84698669, -0.97911915],\n", " [ 0.76255951, 0.27828523, 0.41807172],\n", " [ 0.40792019, -1.19514714, -1.41666804]])" ] }, "execution_count": 57, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr = np.random.randn(5, 3)\n", "arr" ] }, { "cell_type": "code", "execution_count": 58, "metadata": { "collapsed": true }, "outputs": [], "source": [ "arr.sort(1)" ] }, { "cell_type": "code", "execution_count": 59, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array([[-1.00222899, -0.76658562, 0.39039437],\n", " [-1.0581081 , 0.23100317, 1.69177329],\n", " [-0.97911915, 0.84698669, 1.0239365 ],\n", " [ 0.27828523, 0.41807172, 0.76255951],\n", " [-1.41666804, -1.19514714, 0.40792019]])" ] }, "execution_count": 59, "metadata": {}, "output_type": "execute_result" } ], "source": [ "arr" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "上面是直接调用数组的sort方法,会改变原有数组的顺序。但如果使用`np.sort()`函数的话,会生成一个新的排序后的结果。\n", "\n", "一个计算分位数的快捷方法是先给数组排序,然后选择某个排名的值:" ] }, { "cell_type": "code", "execution_count": 60, "metadata": { "collapsed": true }, "outputs": [], "source": [ "large_arr = np.random.randn(1000)\n", "large_arr.sort()" ] }, { "cell_type": "code", "execution_count": 61, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "-1.6908607973872243" ] }, "execution_count": 61, "metadata": {}, "output_type": "execute_result" } ], "source": [ "large_arr[int(0.05 * len(large_arr))] # 5% quantile" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# 5 Unique and Other Set Logic (单一性和其他集合逻辑)\n", "\n", "Numpy也有一些基本的集合操作用于一维数组。`np.unique`,能返回排好序且不重复的值:" ] }, { "cell_type": "code", "execution_count": 62, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "array(['Bob', 'Joe', 'Will'], \n", " dtype='