{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## Faster wedge" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Going to look at faster ways to make wedges." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "% matplotlib inline\n", "import matplotlib.pyplot as plt\n", "\n", "import numpy as np" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Set up the model parameters." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "length = 100.# x range\n", "width = 100. # y range\n", "depth = 240. # z range" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Define the plotting function." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "def plot_slices(data, interpolation='nearest', cmap='Greys', vmin=0., vmax=1.):\n", " plt.figure(figsize=(16,12))\n", " \n", " for j in range(3):\n", " plt.subplot(3,4,j+1)\n", " plt.title('y = ' + str(int(j*(length/3))))\n", " plt.imshow(data[:,:,int(j*(length/3))], interpolation=interpolation, cmap=cmap, vmax=vmax, vmin=vmin)\n", " plt.subplot(3,4,4)\n", " plt.title('y = ' + str(int(length-1)))\n", " plt.imshow(data[:,:,-1], interpolation=interpolation, cmap=cmap, vmax=vmax, vmin=vmin)\n", " \n", " for j in range(3):\n", " plt.subplot(3,4,5+j)\n", " plt.title('x = ' + str(int(j*(width/3))))\n", " plt.imshow(data[:,int(j*(width/3)),:], interpolation=interpolation, cmap=cmap, vmax=vmax, vmin=vmin)\n", " plt.subplot(3,4,8)\n", " plt.title('x = ' + str(int(width-1)))\n", " plt.imshow(data[:,-1,:], interpolation=interpolation, cmap=cmap, vmax=vmax, vmin=vmin)\n", " \n", " for j in range(3):\n", " plt.subplot(3,4,9+j)\n", " plt.title('z = ' + str(1 + int(1 + depth/3 + j*depth/(3*3))))\n", " plt.imshow(data[1 + int(depth/3 + j*depth/(3*3)),:,:], interpolation=interpolation, cmap=cmap, vmax=vmax, vmin=vmin)\n", " plt.subplot(3,4,12)\n", " plt.title('z = ' + str(int(2*depth/3 - 1)))\n", " plt.imshow(data[int(2*depth/3 - 1),:,:], interpolation=interpolation, cmap=cmap, vmax=vmax, vmin=vmin)\n", " \n", " plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Original formulation" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's start with the wedge code from version 1 of Spectral_wedge.ipynb. The main difference is that we will need to use the rock properties directly, rather than building an array of ints first. " ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0.798 0.798 0.588 0.588]\n" ] } ], "source": [ "rocks = [(2800, 2850), (2800, 2850), (2400, 2450), (2400,2450)]\n", "\n", "def make_ai(rocks):\n", " rx = np.array(rocks)\n", " return rx[:,0] * rx[:,1] / 10e6\n", "\n", "ai = make_ai(rocks)\n", "print(ai)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "def make_earth(depth, length, width, ai):\n", " \n", " earth = np.ones((depth,length,width))\n", "\n", " for xslice in range(int(length)):\n", " thickness = (depth/3)*(1 + xslice/length)\n", " \n", " value = (ai[1]*xslice/length) + (ai[2]*(length-xslice)/length)\n", " earth[:,xslice,:] *= value \n", " \n", " # Draw the bottom of the wedge\n", " value = ai[0]\n", " for (z,y),v in np.ndenumerate(earth[:,xslice,:]):\n", " if z > thickness:\n", " earth[z,xslice,y] = value\n", " \n", " # Put the top on\n", " value = ai[3]\n", " for (z,y),v in np.ndenumerate(earth[:,xslice,:]):\n", " if z < depth/3:\n", " earth[z,xslice,y] = value\n", " \n", " return earth" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "ename": "TypeError", "evalue": "'float' object cannot be interpreted as an integer", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\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[0mget_ipython\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrun_line_magic\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'timeit'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'earth = make_earth(depth, length, width, ai)'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;32m~/anaconda3/lib/python3.6/site-packages/IPython/core/interactiveshell.py\u001b[0m in \u001b[0;36mrun_line_magic\u001b[0;34m(self, magic_name, line, _stack_depth)\u001b[0m\n\u001b[1;32m 2093\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'local_ns'\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0msys\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_getframe\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstack_depth\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mf_locals\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2094\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbuiltin_trap\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2095\u001b[0;31m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2096\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mresult\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2097\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m\u001b[0m in \u001b[0;36mtimeit\u001b[0;34m(self, line, cell, local_ns)\u001b[0m\n", "\u001b[0;32m~/anaconda3/lib/python3.6/site-packages/IPython/core/magic.py\u001b[0m in \u001b[0;36m\u001b[0;34m(f, *a, **k)\u001b[0m\n\u001b[1;32m 185\u001b[0m \u001b[0;31m# but it's overkill for just that one bit of state.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 186\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mmagic_deco\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 187\u001b[0;31m \u001b[0mcall\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mlambda\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mk\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mk\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 188\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 189\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mcallable\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/anaconda3/lib/python3.6/site-packages/IPython/core/magics/execution.py\u001b[0m in \u001b[0;36mtimeit\u001b[0;34m(self, line, cell, local_ns)\u001b[0m\n\u001b[1;32m 1096\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mindex\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m10\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1097\u001b[0m \u001b[0mnumber\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m10\u001b[0m \u001b[0;34m**\u001b[0m \u001b[0mindex\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1098\u001b[0;31m \u001b[0mtime_number\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtimer\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtimeit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnumber\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1099\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mtime_number\u001b[0m \u001b[0;34m>=\u001b[0m \u001b[0;36m0.2\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1100\u001b[0m \u001b[0;32mbreak\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/anaconda3/lib/python3.6/site-packages/IPython/core/magics/execution.py\u001b[0m in \u001b[0;36mtimeit\u001b[0;34m(self, number)\u001b[0m\n\u001b[1;32m 158\u001b[0m \u001b[0mgc\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdisable\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 159\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 160\u001b[0;31m \u001b[0mtiming\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minner\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mit\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtimer\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 161\u001b[0m \u001b[0;32mfinally\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 162\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mgcold\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m\u001b[0m in \u001b[0;36minner\u001b[0;34m(_it, _timer)\u001b[0m\n", "\u001b[0;32m\u001b[0m in \u001b[0;36mmake_earth\u001b[0;34m(depth, length, width, ai)\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mmake_earth\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdepth\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlength\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mwidth\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mai\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mearth\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mones\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdepth\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mlength\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mwidth\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 4\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mxslice\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlength\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/anaconda3/lib/python3.6/site-packages/numpy/core/numeric.py\u001b[0m in \u001b[0;36mones\u001b[0;34m(shape, dtype, order)\u001b[0m\n\u001b[1;32m 186\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 187\u001b[0m \"\"\"\n\u001b[0;32m--> 188\u001b[0;31m \u001b[0ma\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mempty\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mshape\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0morder\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 189\u001b[0m \u001b[0mmultiarray\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcopyto\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcasting\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'unsafe'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 190\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mTypeError\u001b[0m: 'float' object cannot be interpreted as an integer" ] } ], "source": [ "%timeit earth = make_earth(depth, length, width, ai)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "earth = make_earth(depth, length, width, ai)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(240, 100, 100)" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "earth.shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Index the array with a list - SLOW" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can index an array with an array-like object — a list or another array. " ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[2 4 6 8]\n", "[2 8]\n" ] } ], "source": [ "a = np.array([1,2,3,4,5,6,7,8]) # A 1D array\n", "b = [1,3,5,7]\n", "print a[b]\n", "\n", "d = np.array([[1,2,3,4],[5,6,7,8]]) # A 2D array...\n", "e = [[0,1],[1,3]] # Needs 2 indices\n", "print d[e]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now let's try using index lists, building the indices with nested list comprehensions." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "def use_index_lists(depth, length, width, ai):\n", " \n", " earth = np.ones((depth,length,width))\n", " \n", " # Bottom indices\n", " indices = [[[x for x in range(int(length))] for y in range(int(width))] for z in range(int(depth/2))] \n", " earth[indices] = 2.\n", " \n", " return earth" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Only getting started, let's test it...\n", "%timeit earth_index_lists = use_index_lists(depth, length, width, ai)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "earth_index_lists = use_index_lists(depth, length, width, ai)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "earth_index_lists.shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "That was unbelievably slow. Forget it. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Fewer loops - FAST" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "It occurs to me I have too many loops. I think I need one, because the values I want vary with index.\n", "\n", "I just realized that instead of enumerating and deciding if the *z*-index is greater than thickness, say, I can just slice with thickness as the index. Doh! NumPy is awesome..." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "def one_loop(depth, length, width, ai):\n", " \n", " earth = np.ones((depth,length,width))\n", " \n", " d = depth/3\n", " \n", " for xslice in range(int(length)):\n", " xl = xslice/length\n", " thickness = d*(1 + xl)\n", " mix = (ai[1]*xl) + (ai[2]*(length-xslice)/length)\n", " \n", " # Draw wedge\n", " earth[:,xslice,:] *= mix \n", "\n", " # Put the top on\n", " earth[:d,:,:] = ai[3]\n", " \n", " return earth" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "100 loops, best of 3: 13.8 ms per loop\n" ] } ], "source": [ "%timeit one_loop(depth, length, width, ai)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Holy crap, that's a bit better." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "earth = one_loop(depth, length, width, ai)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Check plot" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "image/png": "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\nEhYWVrJ8+fLnb3e8zWYLHjdu3KeRkZFFw4YN+8frr7/+n0IIUV1dHRAfH789PDz8WEJCQl5NTY3f\n7a7V2NjoER0dXTh58uRt7b1GTU2N34wZM94bOnToYavVWrx///7R7V1Denr6C5GRkUVRUVGHZs+e\n/c7Vq1d7duR5AK5ERsko9M2oGSWf6Cq0ymhn8ikEGdUdVVWZdozD4fAYNGjQ8dLS0pD6+nqvESNG\nHCwuLh56q3MqKyv7FRYWPqCqqqitrfUJDw8/WlxcPPQ3v/nNS8uXL39OVVWRkZHx/PPPP59xu6+/\nYsWKX8+ePfu/J0+enKOqqmjPNebNm5eVmZmZqqqqaGho8KypqenTnvNLS0tDQkNDT1y5cqWnqqoi\nKSlp87p161I68jwYxlVDRskoo+8xakbJJ9NVRsuMdiafqkpG9TaaL6Crzd69e//98ccfz3U+Tk9P\nX5qenr60PdeYMmVK9vbt2ycMGTLkSFVVlUlVmwM6ZMiQI7c6z2azWcaPH79j586d4yZNmrRNVVVx\np9eoqanpExoaeqL19vas4fz58wHh4eFHq6ur/RsaGjwnTZq0LS8vL769z4NhXDlklIwy+h6jZpR8\nMl1ltMpoZ/KpqmRUj8Ots+1UUVFhDg4OtjkfWyyW8oqKCvOdnl9WVhZSWFgYPXr06P12u91kMpns\nQghhMpnsdrvddKtzf/WrX7368ssv/6ZHjx5Nzm13eo3S0tLQ++677+z8+fPXjhw58sCiRYtWX7p0\nybs9awgICKhesmTJiv79+5+6//77T/v5+dXEx8dvb+/zAFyJjJJR6JtRM0o+0VVoldHO5FMIMqpH\nFM126sw/YFtXV+czffr091euXPm0r69vbevr3uraf/vb3yYFBgaeiY6OLlRv8o++3uoaDofD88CB\nAyMXL1686sCBAyO9vb0vZWRkLG3PGv75z38Oeu21154pKysLOX369P11dXU+GzZsmNOeawCuRkbJ\nKPTNqBkln+gqtMhoZ/MpBBnVI4pmO5nN5gqbzRbsfGyz2YItFkv57c5raGjwmj59+vtz585dP3Xq\n1Gwhmv9WpKqqqp8QQlRWVgYFBgaeudn5e/fufSgnJycxNDS0NDk5eePOnTsfmzt37vo7vYbFYim3\nWCzlDz744JdCCDFjxv9v7+6joizzx49ft6D5AIpAzCBQmEkIKGCYqe2KGmpuEAriQymp7Z6Oq2W/\nfj60bbv23aNAbWfN/Hb2/HbNZm1TyVpX/aqr5OLW+pSBrkkuZqCozJgMKCKGDPfvD858QxdvmZn7\nZseQZJUAACAASURBVC7k/TrnOice5p4P43kfurjnnsncXFRUNNRsNlvbOsORI0eSRo4cuT8oKKjK\n19e3ccqUKZ8cOHBghCvHAIxGozQKuXXWRukTHYU3GvW0TyFoVEZsNF2UlJR05NSpUwPLy8sjGxoa\num3atGlaWlraVq3bqKqqzJs3b21MTEzJokWLVjk/n5aWttVisWQLIYTFYsl2RtmalStX/qKioiKi\nrKys/8aNG6ePHTt27/r162e19Rhms9kaERFRUVpaGiWEEAUFBY/HxsaeSE1N3dbWGaKjo08ePHjw\n0fr6+h6qqioFBQWPx8TElLhyDMBoNEqjkFtnbZQ+0VF4o1FP+xSCRqXk7YtEO+LasWPHE1FRUf8e\nMGDANytXrnzlTt//2WefPaYoSlN8fPzRhISE4oSEhOKdO3dOrKqqChw3blzBwIEDS1NSUnZXV1cH\ntOX+CwsLRztfjcuVYxw9ejQ+KSnpiyFDhhybPHnyJzU1NX1cnSEvL29JTEzMibi4uOOzZ8+2NDQ0\ndHX352CxjFo0SqMsuVdnbZQ+WR1lebNRd/tUVRqVbSmqytOMAQAAAAD64amzAAAAAABdsdEEAAAA\nAOiKjSYAAAAAQFdsNAEAAAAAumKjCQAAAADQFRtNAAAAAICu2GgCAAAAAHTFRhMAAAAAoCs2mgAA\nAAAAXbHRBAAAAADoio0mAAAAAEBXbDQBAAAAALpiowkAAAAA0BUbTQAAAACArthodkLnzp0LT01N\n3RYUFFQVGhpauXDhwnccDoePEEIcPHjw0ZSUlD1BQUFVISEhF7OysvKtVqvZ2zMDd7M1a9YsSEpK\nOtK9e/frc+bMWXfr1z/99NNx0dHRJ3v16lU3duzYvWfPnr3P+bXGxkbfhQsXvhMaGloZFBRUlZaW\ntvXChQv92vcnAO5uWo2WlJTEJCUlHQkMDLQHBATUjBo16p+ff/75Y86vL1++fHnXrl1v+Pv71/r7\n+9f27t37Snl5eWS7/xDAXUyr0fLy8sguXbo0ORv09/evXbFixavOr9fU1ARkZ2dbTCaTzWQy2V5/\n/fVft/9PcHdio9kJvfDCC6uDg4MvVVZWhh49ejRh3759o9999935QjTH9vzzz//+zJkz9585c+Z+\nf3//2tb+xxeAfsLCws6/9tprv5k7d+57t37t0qVLwRkZGR+vWLHi1erq6r5JSUlHpk2btsn59Xff\nfXf+Z5999qN//etfQy5cuNCvb9++1QsXLnynfX8C4O6m1WhYWNj5jz76aGpVVVVQdXV13+nTp2/M\nzMzc7Py6oijqjBkzNtTW1vrX1tb6X7lypXdkZGR5u/4AwF1Oq1GnK1eu9HZ2+Oqrr65wfv6ll176\n3fXr17ufOXPm/sOHDz+yfv36We+///6z7TL4XY6NpmQ2bdo0reVfXO65557vx4wZ83c97+PEiROx\n06ZN29StW7cGk8lkmzhx4q4TJ07ECiHExIkTd2VkZHzs5+d3tUePHvU///nP//uf//znKD3vH+hI\n2qPJyZMn/+Wpp576a1BQUNWtX/vkk0+mxMXFfZWRkfFxt27dGpYvX7782LFj8aWlpVFCNPc8YcKE\nv917773f3XPPPd9nZWXlO3sGOgNvN9qnT5/L/fv3L1MURXU4HD5dunRpCg0NrXR+XVVVRVVVRc95\ngI7E2406NTU1tbrv2b59+5OLFy9+s3v37tfvv//+M/PmzVv73nvvzdVzvs6KjaZkpk2btsn515YL\nFy70GzBgwOmZM2d+2Nr3zp8//92+fftWt7YSEhKO3u4+JkyY8LcPP/xwZn19fY/z58+H7dy584kn\nnnhiZ2vf+49//OPHcXFxX+n18wEdTXs06dTa/4yeOHEiNj4+/pjz4549e1578MEHv3FuJsePH797\n586dT1RWVoZeu3at55///OenJ02atMOTnxnoSLzdqFNAQEBNjx496t94440lmzdvznR+XlEUddu2\nbalBQUFVcXFxX/3+979/3r2fFOiYZGn0/vvvPxMREVExd+7c96qqqoJud7umpqYuX331VZwrPyNu\nQ1VVloTL4XB0+clPfrJ9/vz5/633sauqqgITExOLfH19byiK0jRnzpz3Wvu+Y8eODQkMDKz6/PPP\nR3n78WCxvL2MbNK5fvnLX/7m2WefXdfyc/PmzfvjsmXLclp+btSoUZ9bLJbZqqqKpqYmZfbs2RZF\nUZp8fX1vDB069Eu73d7X248Xi9Xey1uNtlx1dXU9lyxZkpeYmFjU1NSkqKoqSkpKBlVWVpqbmpqU\n/fv3jwgNDb2wYcOG6d5+vFis9l7eavTq1au9vvzyy6EOh6OLzWYLyczM/GjChAm7nF9/5pln1mdk\n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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_slices(earth, interpolation='nearest', cmap='jet')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## The final frontier" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The last tricky bit is the outer loop. It's only there to loop over the *x*-slices. The tricky part is that the wedge thickness calculation depends on the index of the slice. I think numpy.indices can provide this aspect and avoid the loop..." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "x values:\n", "[[[0 0]\n", " [1 1]\n", " [2 2]]\n", "\n", " [[0 0]\n", " [1 1]\n", " [2 2]]\n", "\n", " [[0 0]\n", " [1 1]\n", " [2 2]]\n", "\n", " [[0 0]\n", " [1 1]\n", " [2 2]]]\n", "\n", "y values:\n", "[[[0 1]\n", " [0 1]\n", " [0 1]]\n", "\n", " [[0 1]\n", " [0 1]\n", " [0 1]]\n", "\n", " [[0 1]\n", " [0 1]\n", " [0 1]]\n", "\n", " [[0 1]\n", " [0 1]\n", " [0 1]]]\n", "\n", "z values:\n", "[[[0 0]\n", " [0 0]\n", " [0 0]]\n", "\n", " [[1 1]\n", " [1 1]\n", " [1 1]]\n", "\n", " [[2 2]\n", " [2 2]\n", " [2 2]]\n", "\n", " [[3 3]\n", " [3 3]\n", " [3 3]]]\n" ] } ], "source": [ "zs, xs, ys = np.indices((4,3,2))\n", "print \"x values:\\n\", xs\n", "print \"\\ny values:\\n\", ys\n", "print \"\\nz values:\\n\", zs" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "def no_loop(depth, length, width, ai):\n", " \n", " # Make an earth full of ones\n", " earth = np.ones((depth,length,width))\n", " \n", " # Set up the gradient, which we'll then crop, so to speak\n", " mix = np.array([(ai[1]*x/length) + (ai[2]*(length-x)/length) for x in range(int(length))])\n", " earth *= mix[:, np.newaxis]\n", " \n", " # Now make the wedge\n", " d = depth/3\n", " thickness = [d*(1 + x/length) for x in range(int(length))]\n", " \n", " # Make a set of index arrays\n", " zs = np.indices(earth.shape)[0]\n", " \n", " # Make a boolean array map of stuff below the wedge\n", " below = zs > thickness\n", " \n", " # I don't know why I have to do this but I do\n", " below = np.swapaxes(below, axis1=1, axis2=2)\n", " \n", " # Set those values to the lowermost rock AI\n", " earth[below] = ai[0]\n", "\n", " # Put the top layer on\n", " earth[:d,:,:] = ai[3]\n", " \n", " return earth" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "ename": "TypeError", "evalue": "'float' object cannot be interpreted as an integer", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mTypeError\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[0mget_ipython\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrun_line_magic\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'timeit'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'earth = no_loop(depth, length, width, ai)'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[0;32m~/anaconda3/lib/python3.6/site-packages/IPython/core/interactiveshell.py\u001b[0m in \u001b[0;36mrun_line_magic\u001b[0;34m(self, magic_name, line, _stack_depth)\u001b[0m\n\u001b[1;32m 2093\u001b[0m \u001b[0mkwargs\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'local_ns'\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0msys\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_getframe\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mstack_depth\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mf_locals\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2094\u001b[0m \u001b[0;32mwith\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbuiltin_trap\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2095\u001b[0;31m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mfn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2096\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mresult\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2097\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m\u001b[0m in \u001b[0;36mtimeit\u001b[0;34m(self, line, cell, local_ns)\u001b[0m\n", "\u001b[0;32m~/anaconda3/lib/python3.6/site-packages/IPython/core/magic.py\u001b[0m in \u001b[0;36m\u001b[0;34m(f, *a, **k)\u001b[0m\n\u001b[1;32m 185\u001b[0m \u001b[0;31m# but it's overkill for just that one bit of state.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 186\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mmagic_deco\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 187\u001b[0;31m \u001b[0mcall\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mlambda\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mk\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mk\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 188\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 189\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mcallable\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0marg\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/anaconda3/lib/python3.6/site-packages/IPython/core/magics/execution.py\u001b[0m in \u001b[0;36mtimeit\u001b[0;34m(self, line, cell, local_ns)\u001b[0m\n\u001b[1;32m 1096\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mindex\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m10\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1097\u001b[0m \u001b[0mnumber\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;36m10\u001b[0m \u001b[0;34m**\u001b[0m \u001b[0mindex\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1098\u001b[0;31m \u001b[0mtime_number\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtimer\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtimeit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnumber\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1099\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mtime_number\u001b[0m \u001b[0;34m>=\u001b[0m \u001b[0;36m0.2\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1100\u001b[0m \u001b[0;32mbreak\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/anaconda3/lib/python3.6/site-packages/IPython/core/magics/execution.py\u001b[0m in \u001b[0;36mtimeit\u001b[0;34m(self, number)\u001b[0m\n\u001b[1;32m 158\u001b[0m \u001b[0mgc\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdisable\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 159\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 160\u001b[0;31m \u001b[0mtiming\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minner\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mit\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtimer\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 161\u001b[0m \u001b[0;32mfinally\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 162\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mgcold\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m\u001b[0m in \u001b[0;36minner\u001b[0;34m(_it, _timer)\u001b[0m\n", "\u001b[0;32m\u001b[0m in \u001b[0;36mno_loop\u001b[0;34m(depth, length, width, ai)\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;31m# Make an earth full of ones\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0mearth\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mones\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdepth\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mlength\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mwidth\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 5\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0;31m# Set up the gradient, which we'll then crop, so to speak\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m~/anaconda3/lib/python3.6/site-packages/numpy/core/numeric.py\u001b[0m in \u001b[0;36mones\u001b[0;34m(shape, dtype, order)\u001b[0m\n\u001b[1;32m 186\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 187\u001b[0m \"\"\"\n\u001b[0;32m--> 188\u001b[0;31m \u001b[0ma\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mempty\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mshape\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdtype\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0morder\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 189\u001b[0m \u001b[0mmultiarray\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcopyto\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0ma\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcasting\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'unsafe'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 190\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0ma\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mTypeError\u001b[0m: 'float' object cannot be interpreted as an integer" ] } ], "source": [ "%timeit earth = no_loop(depth, length, width, ai)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def no_loop(depth, length, width, ai):\n", " \n", " # Make an earth full of ones\n", " earth = np.ones((depth,length,width))\n", " \n", " # Set up the gradient, which we'll then crop, so to speak\n", " mix = np.array([(ai[1]*x/length) + (ai[2]*(length-x)/length) for x in range(int(length))])\n", " earth *= mix[:, np.newaxis]\n", " \n", " # Now make the wedge\n", " d = depth/3\n", " thickness = [d*(1 + x/length) for x in range(int(length))]\n", " \n", " # Make a set of index arrays\n", " zs = np.indices(earth.shape)[0]\n", " \n", " # Make a boolean array map of stuff below the wedge\n", " below = zs > thickness\n", " \n", " # I don't know why I have to do this but I do\n", " below = np.swapaxes(below, axis1=1, axis2=2)\n", " \n", " # Set those values to the lowermost rock AI\n", " earth[below] = ai[0]\n", "\n", " # Put the top layer on\n", " earth[:d,:,:] = ai[3]\n", " \n", " return earth" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(240.0, 100.0, 100.0, array([0.798, 0.798, 0.588, 0.588]))" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "depth, length, width, ai" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "earth = no_loop(depth, length, width, ai)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n52cWK8ho6Mhn25HRyJHR0JHRtiOjkSOjoSOjbdcRMupYo3nnnXdq7dq1evnll/X73/9eH3/8sVNT\nnVO3bt20YsUKVVRUaOPGjcrNzVUgENDq1avl9XpVVVWl/v37a82aNVGrcdWqVRoyZIg8Ho8kuaa2\nJUuWyOv1qry8XOXl5fL5fFGvraamRvn5+SouLlZZWZn27dunbdu2Rb2uWENGQ0c+24aM2kFGQ0dG\n24aM2kFGQ0dG26ajZNSRRvPYsWOSpLFjx2rAgAGaOHGi/H6/E1OF5KKLLtLw4cMlSYmJiRo6dKjK\nyspUWlqqnJwcxcXFKTs7O2o1Hjx4UFu2bNGtt96q09dmckttL7/8su677z51795dXbt2VUJCQtRr\n69Gjh4wxOnbsmOrq6nTy5En16tUr6nXFEjIaOvLZdmQ0cmQ0dGS07cho5Mho6Mho23WYjDpxuefi\n4mIzZ86c4PerV682ubm5TkzVZlVVVSYpKckEAgHj9XpNXV2dMcaYEydOGK/XG5Wavv/975u3337b\nlJSUmGnTphljjCtqq66uNikpKWb+/Plm1KhR5qGHHjInT550RW1btmwx3bp1M/Hx8ea+++4zxrjj\nZxYryGjoyGd4yGhkyGjoyGh4yGhkyGjoyGh4OkJGO9XFgAKBgGbPnq0VK1YoPj4++K5KNG3atEl9\n+/ZVamrqWfW4obb6+nrt27dPM2fOVElJiSoqKrR+/fqo13bkyBEtXLhQu3fv1oEDB/Tmm29q06ZN\nUa8LkXNbRslneMhox0VGQ0dGEQ1kNHRk1HmONJppaWnas2dP8PuKigplZGQ4MVXIvvjiC82cOVPz\n5s1TVlaWpKY6KysrJUmVlZVKS0tr97p27NihF154QUlJSZo7d65effVVzZs3zxW1DRw4UCkpKZo+\nfbp69OihuXPnauvWrVGvrbS0VBkZGRo4cKD69OmjWbNmafv27VGvK5aQ0dCQz/CQ0ciR0dCQ0fCQ\n0ciR0dCQ0fB0lIw60mgmJCRIaroa14EDB1RcXKz09HQnpgqJMUY5OTm64oorgldtkqT09HQVFBSo\nrq5OBQUFUfkfRH5+vqqrq7V//36tW7dO11xzjQoLC11RmyQNGjRIfr9fjY2N2rx5syZMmBD12saM\nGaNdu3appqZGn332mYqKijRx4sSo1xVLyGhoyGd4yGjkyGhoyGh4yGjkyGhoyGh4OkxGnTont6Sk\nxPh8PpOcnGxWrVrl1DQh2b59u/F4PGbYsGFm+PDhZvjw4aaoqMgcP37cXH/99ebSSy81WVlZJhAI\nRLXOkpISM336dGOMcU1te/fuNenp6WbYsGHmnnvuMbW1ta6o7emnnzZjx441I0eONLm5uaahocEV\ndcUSMto25LNtyGjkyGjbkNG2IaORI6NtQ0bbpiNk1GNMjJ3sCwAAAABwtU51MSAAAAAAgPNoNAEA\nAAAAVtFoAgAAAACsotEEAAAAAFhFowkAAAAAsIpGEwAAAABgFY0mAAAAAMAqGk0AAAAAgFX/H+86\nbMXDEbRUAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plot_slices(earth, interpolation='nearest', cmap='jet')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Amazing — the for loop is 3 times faster! And I think it's the indices part that is slowing it down, because without that section (the line with np.indices and the three lines after it), it only takes 9.5 ms to execute." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Conclusion" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Assuming I'm not doing something stupid in this code, it seems it's not always faster with indexing." ] } ], "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.8" } }, "nbformat": 4, "nbformat_minor": 1 }