diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 00000000..548e3b08 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,3 @@ +# These are supported funding model platforms + +github: rougier # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] diff --git a/.gitignore b/.gitignore index 87620ac7..28663f82 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,6 @@ .ipynb_checkpoints/ +__pycache__ +venv +.idea +.vscode +Untitled.ipynb diff --git a/100_Numpy_exercises.ipynb b/100_Numpy_exercises.ipynb index f0f3e27b..a0587e98 100644 --- a/100_Numpy_exercises.ipynb +++ b/100_Numpy_exercises.ipynb @@ -6,35 +6,44 @@ "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", + "This is a collection of exercises that have been collected in the numpy mailing list, on stack overflow\n", + "and in the numpy documentation. The goal of this collection is to offer a quick reference for both old\n", + "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 " + "If you find an error or think you've a better way to solve some of them, feel\n", + "free to open an issue at ." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "#### 1. Import the numpy package under the name `np` (★☆☆)" + "File automatically generated. See the documentation to update questions/answers/hints programmatically." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Run the `initialize.py` module, then for each question you can query the\n", + "answer or an hint with `hint(n)` or `answer(n)` for `n` question number." ] }, { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ - "import numpy as np" + "%run initialise.py" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "#### 2. Print the numpy version and the configuration (★☆☆)" + "#### 1. Import the numpy package under the name `np` (★☆☆)" ] }, { @@ -42,11 +51,22 @@ "execution_count": null, "metadata": {}, "outputs": [], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, "source": [ - "print(np.__version__)\n", - "np.show_config()" + "#### 2. Print the numpy version and the configuration (★☆☆)" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, { "cell_type": "markdown", "metadata": {}, @@ -59,16 +79,13 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [ - "Z = np.zeros(10)\n", - "print(Z)" - ] + "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "#### 4. How to find the memory size of any array (★☆☆)" + "#### 4. How to find the memory size of any array (★☆☆)" ] }, { @@ -76,34 +93,27 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [ - "Z = np.zeros((10,10))\n", - "print(\"%d bytes\" % (Z.size * Z.itemsize))" - ] + "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "#### 5. How to get the documentation of the numpy add function from the command line? (★☆☆)" + "#### 5. How to get the documentation of the numpy add function from the command line? (★☆☆)" ] }, { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], - "source": [ - "%run `python -c \"import numpy; numpy.info(numpy.add)\"`" - ] + "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "#### 6. Create a null vector of size 10 but the fifth value which is 1 (★☆☆)" + "#### 6. Create a null vector of size 10 but the fifth value which is 1 (★☆☆)" ] }, { @@ -111,17 +121,13 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [ - "Z = np.zeros(10)\n", - "Z[4] = 1\n", - "print(Z)" - ] + "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "#### 7. Create a vector with values ranging from 10 to 49 (★☆☆)" + "#### 7. Create a vector with values ranging from 10 to 49 (★☆☆)" ] }, { @@ -129,16 +135,13 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [ - "Z = np.arange(10,50)\n", - "print(Z)" - ] + "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "#### 8. Reverse a vector (first element becomes last) (★☆☆)" + "#### 8. Reverse a vector (first element becomes last) (★☆☆)" ] }, { @@ -146,17 +149,13 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [ - "Z = np.arange(50)\n", - "Z = Z[::-1]\n", - "print(Z)" - ] + "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "#### 9. Create a 3x3 matrix with values ranging from 0 to 8 (★☆☆)" + "#### 9. Create a 3x3 matrix with values ranging from 0 to 8 (★☆☆)" ] }, { @@ -164,16 +163,13 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [ - "Z = np.arange(9).reshape(3,3)\n", - "print(Z)" - ] + "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "#### 10. Find indices of non-zero elements from \\[1,2,0,0,4,0\\] (★☆☆)" + "#### 10. Find indices of non-zero elements from [1,2,0,0,4,0] (★☆☆)" ] }, { @@ -181,10 +177,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [ - "nz = np.nonzero([1,2,0,0,4,0])\n", - "print(nz)" - ] + "source": [] }, { "cell_type": "markdown", @@ -198,10 +191,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [ - "Z = np.eye(3)\n", - "print(Z)" - ] + "source": [] }, { "cell_type": "markdown", @@ -213,14 +203,9 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], - "source": [ - "Z = np.random.random((3,3,3))\n", - "print(Z)" - ] + "source": [] }, { "cell_type": "markdown", @@ -234,11 +219,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [ - "Z = np.random.random((10,10))\n", - "Zmin, Zmax = Z.min(), Z.max()\n", - "print(Zmin, Zmax)" - ] + "source": [] }, { "cell_type": "markdown", @@ -252,11 +233,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [ - "Z = np.random.random(30)\n", - "m = Z.mean()\n", - "print(m)" - ] + "source": [] }, { "cell_type": "markdown", @@ -270,11 +247,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [ - "Z = np.ones((10,10))\n", - "Z[1:-1,1:-1] = 0\n", - "print(Z)" - ] + "source": [] }, { "cell_type": "markdown", @@ -288,17 +261,21 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [ - "Z = np.ones((5,5))\n", - "Z = np.pad(Z, pad_width=1, mode='constant', constant_values=0)\n", - "print(Z)" - ] + "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "#### 17. What is the result of the following expression? (★☆☆)" + "#### 17. What is the result of the following expression? (★☆☆)\n", + "```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", + "```" ] }, { @@ -306,14 +283,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "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)" - ] + "source": [] }, { "cell_type": "markdown", @@ -327,10 +297,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [ - "Z = np.diag(1+np.arange(4),k=-1)\n", - "print(Z)" - ] + "source": [] }, { "cell_type": "markdown", @@ -344,12 +311,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [ - "Z = np.zeros((8,8),dtype=int)\n", - "Z[1::2,::2] = 1\n", - "Z[::2,1::2] = 1\n", - "print(Z)" - ] + "source": [] }, { "cell_type": "markdown", @@ -363,9 +325,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [ - "print(np.unravel_index(99,(6,7,8)))" - ] + "source": [] }, { "cell_type": "markdown", @@ -379,10 +339,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [ - "Z = np.tile( np.array([[0,1],[1,0]]), (4,4))\n", - "print(Z)" - ] + "source": [] }, { "cell_type": "markdown", @@ -396,11 +353,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [ - "Z = np.random.random((5,5))\n", - "Z = (Z - np.mean (Z)) / (np.std (Z))\n", - "print(Z)" - ] + "source": [] }, { "cell_type": "markdown", @@ -412,16 +365,9 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": true - }, + "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)])" - ] + "source": [] }, { "cell_type": "markdown", @@ -435,13 +381,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "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))" - ] + "source": [] }, { "cell_type": "markdown", @@ -455,19 +395,20 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [ - "# Author: Evgeni Burovski\n", - "\n", - "Z = np.arange(11)\n", - "Z[(3 < Z) & (Z <= 8)] *= -1\n", - "print(Z)" - ] + "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "#### 26. What is the output of the following script? (★☆☆)" + "#### 26. What is the output of the following script? (★☆☆)\n", + "```python\n", + "# Author: Jake VanderPlas\n", + "\n", + "print(sum(range(5),-1))\n", + "from numpy import *\n", + "print(sum(range(5),-1))\n", + "```" ] }, { @@ -475,19 +416,21 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [ - "# Author: Jake VanderPlas\n", - "\n", - "print(sum(range(5),-1))\n", - "from numpy import *\n", - "print(sum(range(5),-1))" - ] + "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "#### 27. Consider an integer vector Z, which of these expressions are legal? (★☆☆)" + "#### 27. Consider an integer vector Z, which of these expressions are legal? (★☆☆)\n", + "```python\n", + "Z**Z\n", + "2 << Z >> 2\n", + "Z <- Z\n", + "1j*Z\n", + "Z/1/1\n", + "ZZ\n", + "```" ] }, { @@ -495,20 +438,18 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [ - "Z**Z\n", - "2 << Z >> 2\n", - "Z <- Z\n", - "1j*Z\n", - "Z/1/1\n", - "ZZ" - ] + "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "#### 28. What are the result of the following expressions?" + "#### 28. What are the result of the following expressions?\n", + "```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", + "```" ] }, { @@ -516,11 +457,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "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))" - ] + "source": [] }, { "cell_type": "markdown", @@ -534,12 +471,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [ - "# Author: Charles R Harris\n", - "\n", - "Z = np.random.uniform(-10,+10,10)\n", - "print (np.copysign(np.ceil(np.abs(Z)), Z))" - ] + "source": [] }, { "cell_type": "markdown", @@ -553,11 +485,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [ - "Z1 = np.random.randint(0,10,10)\n", - "Z2 = np.random.randint(0,10,10)\n", - "print(np.intersect1d(Z1,Z2))" - ] + "source": [] }, { "cell_type": "markdown", @@ -571,25 +499,16 @@ "execution_count": null, "metadata": {}, "outputs": [], - "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" - ] + "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "#### 32. Is the following expressions true? (★☆☆)" + "#### 32. Is the following expressions true? (★☆☆)\n", + "```python\n", + "np.sqrt(-1) == np.emath.sqrt(-1)\n", + "```" ] }, { @@ -597,9 +516,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [ - "np.sqrt(-1) == np.emath.sqrt(-1)" - ] + "source": [] }, { "cell_type": "markdown", @@ -611,15 +528,9 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": true - }, + "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')" - ] + "source": [] }, { "cell_type": "markdown", @@ -633,16 +544,13 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [ - "Z = np.arange('2016-07', '2016-08', dtype='datetime64[D]')\n", - "print(Z)" - ] + "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "#### 35. How to compute ((A+B)\\*(-A/2)) in place (without copy)? (★★☆)" + "#### 35. How to compute ((A+B)*(-A/2)) in place (without copy)? (★★☆)" ] }, { @@ -650,21 +558,13 @@ "execution_count": null, "metadata": {}, "outputs": [], - "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)" - ] + "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "#### 36. Extract the integer part of a random array using 5 different methods (★★☆)" + "#### 36. Extract the integer part of a random array of positive numbers using 4 different methods (★★☆)" ] }, { @@ -672,15 +572,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "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))" - ] + "source": [] }, { "cell_type": "markdown", @@ -694,11 +586,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [ - "Z = np.zeros((5,5))\n", - "Z += np.arange(5)\n", - "print(Z)" - ] + "source": [] }, { "cell_type": "markdown", @@ -712,13 +600,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [ - "def generate():\n", - " for x in range(10):\n", - " yield x\n", - "Z = np.fromiter(generate(),dtype=float,count=-1)\n", - "print(Z)" - ] + "source": [] }, { "cell_type": "markdown", @@ -732,10 +614,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [ - "Z = np.linspace(0,1,11,endpoint=False)[1:]\n", - "print(Z)" - ] + "source": [] }, { "cell_type": "markdown", @@ -749,11 +628,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [ - "Z = np.random.random(10)\n", - "Z.sort()\n", - "print(Z)" - ] + "source": [] }, { "cell_type": "markdown", @@ -767,12 +642,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [ - "# Author: Evgeni Burovski\n", - "\n", - "Z = np.arange(10)\n", - "np.add.reduce(Z)" - ] + "source": [] }, { "cell_type": "markdown", @@ -786,18 +656,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "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)" - ] + "source": [] }, { "cell_type": "markdown", @@ -811,11 +670,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [ - "Z = np.zeros(10)\n", - "Z.flags.writeable = False\n", - "Z[0] = 1" - ] + "source": [] }, { "cell_type": "markdown", @@ -829,14 +684,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "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)" - ] + "source": [] }, { "cell_type": "markdown", @@ -850,17 +698,13 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [ - "Z = np.random.random(10)\n", - "Z[Z.argmax()] = 0\n", - "print(Z)" - ] + "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "#### 46. Create a structured array with `x` and `y` coordinates covering the \\[0,1\\]x\\[0,1\\] area (★★☆)" + "#### 46. Create a structured array with `x` and `y` coordinates covering the [0,1]x[0,1] area (★★☆)" ] }, { @@ -868,18 +712,13 @@ "execution_count": null, "metadata": {}, "outputs": [], - "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)" - ] + "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "#### 47. Given two arrays, X and Y, construct the Cauchy matrix C (Cij =1/(xi - yj))" + "#### 47. Given two arrays, X and Y, construct the Cauchy matrix C (Cij =1/(xi - yj))" ] }, { @@ -887,14 +726,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "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))" - ] + "source": [] }, { "cell_type": "markdown", @@ -908,15 +740,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "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)" - ] + "source": [] }, { "cell_type": "markdown", @@ -930,11 +754,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [ - "np.set_printoptions(threshold=np.nan)\n", - "Z = np.zeros((16,16))\n", - "print(Z)" - ] + "source": [] }, { "cell_type": "markdown", @@ -948,12 +768,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [ - "Z = np.arange(100)\n", - "v = np.random.uniform(0,100)\n", - "index = (np.abs(Z-v)).argmin()\n", - "print(Z[index])" - ] + "source": [] }, { "cell_type": "markdown", @@ -967,14 +782,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "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)" - ] + "source": [] }, { "cell_type": "markdown", @@ -988,21 +796,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "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)" - ] + "source": [] }, { "cell_type": "markdown", @@ -1016,17 +810,18 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [ - "Z = np.arange(10, dtype=np.float32)\n", - "Z = Z.astype(np.int32, copy=False)\n", - "print(Z)" - ] + "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "#### 54. How to read the following file? (★★☆)" + "#### 54. How to read the following file? (★★☆)\n", + "```\n", + "1, 2, 3, 4, 5\n", + "6, , , 7, 8\n", + " , , 9,10,11\n", + "```" ] }, { @@ -1034,16 +829,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "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)" - ] + "source": [] }, { "cell_type": "markdown", @@ -1057,13 +843,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "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])" - ] + "source": [] }, { "cell_type": "markdown", @@ -1077,13 +857,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "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)" - ] + "source": [] }, { "cell_type": "markdown", @@ -1097,15 +871,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "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)" - ] + "source": [] }, { "cell_type": "markdown", @@ -1119,19 +885,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "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)" - ] + "source": [] }, { "cell_type": "markdown", @@ -1145,13 +899,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [ - "# Author: Steve Tjoa\n", - "\n", - "Z = np.random.randint(0,10,(3,3))\n", - "print(Z)\n", - "print(Z[Z[:,1].argsort()])" - ] + "source": [] }, { "cell_type": "markdown", @@ -1165,12 +913,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [ - "# Author: Warren Weckesser\n", - "\n", - "Z = np.random.randint(0,3,(3,10))\n", - "print((~Z.any(axis=0)).any())" - ] + "source": [] }, { "cell_type": "markdown", @@ -1184,12 +927,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [ - "Z = np.random.uniform(0,1,10)\n", - "z = 0.5\n", - "m = Z.flat[np.abs(Z - z).argmin()]\n", - "print(m)" - ] + "source": [] }, { "cell_type": "markdown", @@ -1203,13 +941,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "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])" - ] + "source": [] }, { "cell_type": "markdown", @@ -1223,19 +955,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "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)" - ] + "source": [] }, { "cell_type": "markdown", @@ -1249,19 +969,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "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)" - ] + "source": [] }, { "cell_type": "markdown", @@ -1275,14 +983,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "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)" - ] + "source": [] }, { "cell_type": "markdown", @@ -1296,17 +997,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "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)" - ] + "source": [] }, { "cell_type": "markdown", @@ -1320,16 +1011,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "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)" - ] + "source": [] }, { "cell_type": "markdown", @@ -1343,20 +1025,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "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())" - ] + "source": [] }, { "cell_type": "markdown", @@ -1370,27 +1039,13 @@ "execution_count": null, "metadata": {}, "outputs": [], - "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)" - ] + "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? (★★★)" + "#### 70. Consider the vector [1, 2, 3, 4, 5], how to build a new vector with 3 consecutive zeros interleaved between each value? (★★★)" ] }, { @@ -1398,15 +1053,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "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)" - ] + "source": [] }, { "cell_type": "markdown", @@ -1418,15 +1065,9 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], - "source": [ - "A = np.ones((5,5,3))\n", - "B = 2*np.ones((5,5))\n", - "print(A * B[:,:,None])" - ] + "source": [] }, { "cell_type": "markdown", @@ -1440,13 +1081,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [ - "# Author: Eelco Hoogendoorn\n", - "\n", - "A = np.arange(25).reshape(5,5)\n", - "A[[0,1]] = A[[1,0]]\n", - "print(A)" - ] + "source": [] }, { "cell_type": "markdown", @@ -1460,17 +1095,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "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)" - ] + "source": [] }, { "cell_type": "markdown", @@ -1484,13 +1109,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "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)" - ] + "source": [] }, { "cell_type": "markdown", @@ -1504,22 +1123,13 @@ "execution_count": null, "metadata": {}, "outputs": [], - "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))" - ] + "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\\]) (★★★)" + "#### 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]) (★★★)" ] }, { @@ -1527,17 +1137,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "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)" - ] + "source": [] }, { "cell_type": "markdown", @@ -1551,21 +1151,13 @@ "execution_count": null, "metadata": {}, "outputs": [], - "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)" - ] + "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\\])? (★★★)" + "#### 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])? (★★★)" ] }, { @@ -1573,26 +1165,13 @@ "execution_count": null, "metadata": {}, "outputs": [], - "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))" - ] + "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\\])? (★★★)" + "#### 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])? (★★★)" ] }, { @@ -1600,15 +1179,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "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]))" - ] + "source": [] }, { "cell_type": "markdown", @@ -1622,41 +1193,13 @@ "execution_count": null, "metadata": {}, "outputs": [], - "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)" - ] + "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\\]\\]? (★★★)" + "#### 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]]? (★★★)" ] }, { @@ -1664,13 +1207,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "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)" - ] + "source": [] }, { "cell_type": "markdown", @@ -1684,14 +1221,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "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)" - ] + "source": [] }, { "cell_type": "markdown", @@ -1705,10 +1235,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [ - "Z = np.random.randint(0,10,50)\n", - "print(np.bincount(Z).argmax())" - ] + "source": [] }, { "cell_type": "markdown", @@ -1722,22 +1249,13 @@ "execution_count": null, "metadata": {}, "outputs": [], - "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)" - ] + "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "#### 85. Create a 2D array subclass such that Z\\[i,j\\] == Z\\[j,i\\] (★★★)" + "#### 85. Create a 2D array subclass such that Z[i,j] == Z[j,i] (★★★)" ] }, { @@ -1745,23 +1263,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "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)" - ] + "source": [] }, { "cell_type": "markdown", @@ -1775,21 +1277,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "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." - ] + "source": [] }, { "cell_type": "markdown", @@ -1803,15 +1291,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "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)" - ] + "source": [] }, { "cell_type": "markdown", @@ -1825,26 +1305,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "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)" - ] + "source": [] }, { "cell_type": "markdown", @@ -1858,17 +1319,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "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]])" - ] + "source": [] }, { "cell_type": "markdown", @@ -1880,27 +1331,9 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "scrolled": true - }, + "metadata": {}, "outputs": [], - "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])))" - ] + "source": [] }, { "cell_type": "markdown", @@ -1914,14 +1347,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "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)" - ] + "source": [] }, { "cell_type": "markdown", @@ -1935,15 +1361,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "source": [ - "# Author: Ryan G.\n", - "\n", - "x = np.random.rand(int(5e7))\n", - "\n", - "%timeit np.power(x,3)\n", - "%timeit x*x*x\n", - "%timeit np.einsum('i,i,i->i',x,x,x)" - ] + "source": [] }, { "cell_type": "markdown", @@ -1957,22 +1375,13 @@ "execution_count": null, "metadata": {}, "outputs": [], - "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)" - ] + "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "#### 94. Considering a 10x3 matrix, extract rows with unequal values (e.g. \\[2,2,3\\]) (★★★)" + "#### 94. Considering a 10x3 matrix, extract rows with unequal values (e.g. [2,2,3]) (★★★)" ] }, { @@ -1980,19 +1389,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "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)" - ] + "source": [] }, { "cell_type": "markdown", @@ -2006,18 +1403,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "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))" - ] + "source": [] }, { "cell_type": "markdown", @@ -2031,20 +1417,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "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)" - ] + "source": [] }, { "cell_type": "markdown", @@ -2058,18 +1431,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "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)" - ] + "source": [] }, { "cell_type": "markdown", @@ -2081,25 +1443,9 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": true - }, + "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)" - ] + "source": [] }, { "cell_type": "markdown", @@ -2113,17 +1459,7 @@ "execution_count": null, "metadata": {}, "outputs": [], - "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])" - ] + "source": [] }, { "cell_type": "markdown", @@ -2137,37 +1473,10 @@ "execution_count": null, "metadata": {}, "outputs": [], - "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)" - ] + "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" - } - }, + "metadata": {}, "nbformat": 4, - "nbformat_minor": 1 + "nbformat_minor": 4 } diff --git a/100_Numpy_exercises.md b/100_Numpy_exercises.md index edec3972..85c1eac4 100644 --- a/100_Numpy_exercises.md +++ b/100_Numpy_exercises.md @@ -1,233 +1,76 @@ -# 100 numpy exercises -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. +# 100 numpy exercises -If you find an error or think you've a better way to solve some of them, feel free to open an issue at +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. -#### 1. Import the numpy package under the name `np` (★☆☆) +If you find an error or think you've a better way to solve some of them, feel +free to open an issue at . +File automatically generated. See the documentation to update questions/answers/hints programmatically. -```python -import numpy as np -``` +#### 1. Import the numpy package under the name `np` (★☆☆) #### 2. Print the numpy version and the configuration (★☆☆) - -```python -print(np.__version__) -np.show_config() -``` - #### 3. Create a null vector of size 10 (★☆☆) +#### 4. How to find the memory size of any array (★☆☆) -```python -Z = np.zeros(10) -print(Z) -``` - -#### 4. How to find the memory size of any array (★☆☆) - - -```python -Z = np.zeros((10,10)) -print("%d bytes" % (Z.size * Z.itemsize)) -``` - -#### 5. How to get the documentation of the numpy add function from the command line? (★☆☆) - - -```python -%run `python -c "import numpy; numpy.info(numpy.add)"` -``` - -#### 6. Create a null vector of size 10 but the fifth value which is 1 (★☆☆) - - -```python -Z = np.zeros(10) -Z[4] = 1 -print(Z) -``` - -#### 7. Create a vector with values ranging from 10 to 49 (★☆☆) - - -```python -Z = np.arange(10,50) -print(Z) -``` - -#### 8. Reverse a vector (first element becomes last) (★☆☆) - - -```python -Z = np.arange(50) -Z = Z[::-1] -print(Z) -``` +#### 5. How to get the documentation of the numpy add function from the command line? (★☆☆) -#### 9. Create a 3x3 matrix with values ranging from 0 to 8 (★☆☆) +#### 6. Create a null vector of size 10 but the fifth value which is 1 (★☆☆) +#### 7. Create a vector with values ranging from 10 to 49 (★☆☆) -```python -Z = np.arange(9).reshape(3,3) -print(Z) -``` +#### 8. Reverse a vector (first element becomes last) (★☆☆) -#### 10. Find indices of non-zero elements from \[1,2,0,0,4,0\] (★☆☆) +#### 9. Create a 3x3 matrix with values ranging from 0 to 8 (★☆☆) - -```python -nz = np.nonzero([1,2,0,0,4,0]) -print(nz) -``` +#### 10. Find indices of non-zero elements from [1,2,0,0,4,0] (★☆☆) #### 11. Create a 3x3 identity matrix (★☆☆) - -```python -Z = np.eye(3) -print(Z) -``` - #### 12. Create a 3x3x3 array with random values (★☆☆) - -```python -Z = np.random.random((3,3,3)) -print(Z) -``` - #### 13. Create a 10x10 array with random values and find the minimum and maximum values (★☆☆) - -```python -Z = np.random.random((10,10)) -Zmin, Zmax = Z.min(), Z.max() -print(Zmin, Zmax) -``` - #### 14. Create a random vector of size 30 and find the mean value (★☆☆) - -```python -Z = np.random.random(30) -m = Z.mean() -print(m) -``` - #### 15. Create a 2d array with 1 on the border and 0 inside (★☆☆) - -```python -Z = np.ones((10,10)) -Z[1:-1,1:-1] = 0 -print(Z) -``` - #### 16. How to add a border (filled with 0's) around an existing array? (★☆☆) - -```python -Z = np.ones((5,5)) -Z = np.pad(Z, pad_width=1, mode='constant', constant_values=0) -print(Z) -``` - #### 17. What is the result of the following expression? (★☆☆) - - ```python -print(0 * np.nan) -print(np.nan == np.nan) -print(np.inf > np.nan) -print(np.nan - np.nan) -print(np.nan in set([np.nan])) -print(0.3 == 3 * 0.1) +0 * np.nan +np.nan == np.nan +np.inf > np.nan +np.nan - np.nan +np.nan in set([np.nan]) +0.3 == 3 * 0.1 ``` #### 18. Create a 5x5 matrix with values 1,2,3,4 just below the diagonal (★☆☆) - -```python -Z = np.diag(1+np.arange(4),k=-1) -print(Z) -``` - #### 19. Create a 8x8 matrix and fill it with a checkerboard pattern (★☆☆) - -```python -Z = np.zeros((8,8),dtype=int) -Z[1::2,::2] = 1 -Z[::2,1::2] = 1 -print(Z) -``` - #### 20. Consider a (6,7,8) shape array, what is the index (x,y,z) of the 100th element? - -```python -print(np.unravel_index(99,(6,7,8))) -``` - #### 21. Create a checkerboard 8x8 matrix using the tile function (★☆☆) - -```python -Z = np.tile( np.array([[0,1],[1,0]]), (4,4)) -print(Z) -``` - #### 22. Normalize a 5x5 random matrix (★☆☆) - -```python -Z = np.random.random((5,5)) -Z = (Z - np.mean (Z)) / (np.std (Z)) -print(Z) -``` - #### 23. Create a custom dtype that describes a color as four unsigned bytes (RGBA) (★☆☆) - -```python -color = np.dtype([("r", np.ubyte, 1), - ("g", np.ubyte, 1), - ("b", np.ubyte, 1), - ("a", np.ubyte, 1)]) -``` - #### 24. Multiply a 5x3 matrix by a 3x2 matrix (real matrix product) (★☆☆) - -```python -Z = np.dot(np.ones((5,3)), np.ones((3,2))) -print(Z) - -# Alternative solution, in Python 3.5 and above -Z = np.ones((5,3)) @ np.ones((3,2)) -print(Z) -``` - #### 25. Given a 1D array, negate all elements which are between 3 and 8, in place. (★☆☆) - -```python -# Author: Evgeni Burovski - -Z = np.arange(11) -Z[(3 < Z) & (Z <= 8)] *= -1 -print(Z) -``` - #### 26. What is the output of the following script? (★☆☆) - - ```python # Author: Jake VanderPlas @@ -237,8 +80,6 @@ print(sum(range(5),-1)) ``` #### 27. Consider an integer vector Z, which of these expressions are legal? (★☆☆) - - ```python Z**Z 2 << Z >> 2 @@ -249,980 +90,160 @@ ZZ ``` #### 28. What are the result of the following expressions? - - ```python -print(np.array(0) / np.array(0)) -print(np.array(0) // np.array(0)) -print(np.array([np.nan]).astype(int).astype(float)) +np.array(0) / np.array(0) +np.array(0) // np.array(0) +np.array([np.nan]).astype(int).astype(float) ``` #### 29. How to round away from zero a float array ? (★☆☆) - -```python -# Author: Charles R Harris - -Z = np.random.uniform(-10,+10,10) -print (np.copysign(np.ceil(np.abs(Z)), Z)) -``` - #### 30. How to find common values between two arrays? (★☆☆) - -```python -Z1 = np.random.randint(0,10,10) -Z2 = np.random.randint(0,10,10) -print(np.intersect1d(Z1,Z2)) -``` - #### 31. How to ignore all numpy warnings (not recommended)? (★☆☆) - -```python -# Suicide mode on -defaults = np.seterr(all="ignore") -Z = np.ones(1) / 0 - -# Back to sanity -_ = np.seterr(**defaults) -``` - -An equivalent way, with a context manager: - -```python -with np.errstate(divide='ignore'): - Z = np.ones(1) / 0 -``` - #### 32. Is the following expressions true? (★☆☆) - - ```python np.sqrt(-1) == np.emath.sqrt(-1) ``` #### 33. How to get the dates of yesterday, today and tomorrow? (★☆☆) - -```python -yesterday = np.datetime64('today', 'D') - np.timedelta64(1, 'D') -today = np.datetime64('today', 'D') -tomorrow = np.datetime64('today', 'D') + np.timedelta64(1, 'D') -``` - #### 34. How to get all the dates corresponding to the month of July 2016? (★★☆) +#### 35. How to compute ((A+B)*(-A/2)) in place (without copy)? (★★☆) -```python -Z = np.arange('2016-07', '2016-08', dtype='datetime64[D]') -print(Z) -``` - -#### 35. How to compute ((A+B)\*(-A/2)) in place (without copy)? (★★☆) - - -```python -A = np.ones(3)*1 -B = np.ones(3)*2 -C = np.ones(3)*3 -np.add(A,B,out=B) -np.divide(A,2,out=A) -np.negative(A,out=A) -np.multiply(A,B,out=A) -``` - -#### 36. Extract the integer part of a random array using 5 different methods (★★☆) - - -```python -Z = np.random.uniform(0,10,10) - -print (Z - Z%1) -print (np.floor(Z)) -print (np.ceil(Z)-1) -print (Z.astype(int)) -print (np.trunc(Z)) -``` +#### 36. Extract the integer part of a random array of positive numbers using 4 different methods (★★☆) #### 37. Create a 5x5 matrix with row values ranging from 0 to 4 (★★☆) - -```python -Z = np.zeros((5,5)) -Z += np.arange(5) -print(Z) -``` - #### 38. Consider a generator function that generates 10 integers and use it to build an array (★☆☆) - -```python -def generate(): - for x in range(10): - yield x -Z = np.fromiter(generate(),dtype=float,count=-1) -print(Z) -``` - #### 39. Create a vector of size 10 with values ranging from 0 to 1, both excluded (★★☆) - -```python -Z = np.linspace(0,1,11,endpoint=False)[1:] -print(Z) -``` - #### 40. Create a random vector of size 10 and sort it (★★☆) - -```python -Z = np.random.random(10) -Z.sort() -print(Z) -``` - #### 41. How to sum a small array faster than np.sum? (★★☆) - -```python -# Author: Evgeni Burovski - -Z = np.arange(10) -np.add.reduce(Z) -``` - #### 42. Consider two random array A and B, check if they are equal (★★☆) - -```python -A = np.random.randint(0,2,5) -B = np.random.randint(0,2,5) - -# Assuming identical shape of the arrays and a tolerance for the comparison of values -equal = np.allclose(A,B) -print(equal) - -# Checking both the shape and the element values, no tolerance (values have to be exactly equal) -equal = np.array_equal(A,B) -print(equal) -``` - #### 43. Make an array immutable (read-only) (★★☆) - -```python -Z = np.zeros(10) -Z.flags.writeable = False -Z[0] = 1 -``` - #### 44. Consider a random 10x2 matrix representing cartesian coordinates, convert them to polar coordinates (★★☆) - -```python -Z = np.random.random((10,2)) -X,Y = Z[:,0], Z[:,1] -R = np.sqrt(X**2+Y**2) -T = np.arctan2(Y,X) -print(R) -print(T) -``` - #### 45. Create random vector of size 10 and replace the maximum value by 0 (★★☆) +#### 46. Create a structured array with `x` and `y` coordinates covering the [0,1]x[0,1] area (★★☆) -```python -Z = np.random.random(10) -Z[Z.argmax()] = 0 -print(Z) -``` - -#### 46. Create a structured array with `x` and `y` coordinates covering the \[0,1\]x\[0,1\] area (★★☆) - - -```python -Z = np.zeros((5,5), [('x',float),('y',float)]) -Z['x'], Z['y'] = np.meshgrid(np.linspace(0,1,5), - np.linspace(0,1,5)) -print(Z) -``` - -#### 47. Given two arrays, X and Y, construct the Cauchy matrix C (Cij =1/(xi - yj)) - - -```python -# Author: Evgeni Burovski - -X = np.arange(8) -Y = X + 0.5 -C = 1.0 / np.subtract.outer(X, Y) -print(np.linalg.det(C)) -``` +#### 47. Given two arrays, X and Y, construct the Cauchy matrix C (Cij =1/(xi - yj)) #### 48. Print the minimum and maximum representable value for each numpy scalar type (★★☆) - -```python -for dtype in [np.int8, np.int32, np.int64]: - print(np.iinfo(dtype).min) - print(np.iinfo(dtype).max) -for dtype in [np.float32, np.float64]: - print(np.finfo(dtype).min) - print(np.finfo(dtype).max) - print(np.finfo(dtype).eps) -``` - #### 49. How to print all the values of an array? (★★☆) - -```python -np.set_printoptions(threshold=np.nan) -Z = np.zeros((16,16)) -print(Z) -``` - #### 50. How to find the closest value (to a given scalar) in a vector? (★★☆) - -```python -Z = np.arange(100) -v = np.random.uniform(0,100) -index = (np.abs(Z-v)).argmin() -print(Z[index]) -``` - #### 51. Create a structured array representing a position (x,y) and a color (r,g,b) (★★☆) - -```python -Z = np.zeros(10, [ ('position', [ ('x', float, 1), - ('y', float, 1)]), - ('color', [ ('r', float, 1), - ('g', float, 1), - ('b', float, 1)])]) -print(Z) -``` - #### 52. Consider a random vector with shape (100,2) representing coordinates, find point by point distances (★★☆) - -```python -Z = np.random.random((10,2)) -X,Y = np.atleast_2d(Z[:,0], Z[:,1]) -D = np.sqrt( (X-X.T)**2 + (Y-Y.T)**2) -print(D) - -# Much faster with scipy -import scipy -# Thanks Gavin Heverly-Coulson (#issue 1) -import scipy.spatial - -Z = np.random.random((10,2)) -D = scipy.spatial.distance.cdist(Z,Z) -print(D) -``` - #### 53. How to convert a float (32 bits) array into an integer (32 bits) in place? - -```python -Z = np.arange(10, dtype=np.float32) -Z = Z.astype(np.int32, copy=False) -print(Z) -``` - #### 54. How to read the following file? (★★☆) - - -```python -from io import StringIO - -# Fake file -s = StringIO("""1, 2, 3, 4, 5\n - 6, , , 7, 8\n - , , 9,10,11\n""") -Z = np.genfromtxt(s, delimiter=",", dtype=np.int) -print(Z) +``` +1, 2, 3, 4, 5 +6, , , 7, 8 + , , 9,10,11 ``` #### 55. What is the equivalent of enumerate for numpy arrays? (★★☆) - -```python -Z = np.arange(9).reshape(3,3) -for index, value in np.ndenumerate(Z): - print(index, value) -for index in np.ndindex(Z.shape): - print(index, Z[index]) -``` - #### 56. Generate a generic 2D Gaussian-like array (★★☆) - -```python -X, Y = np.meshgrid(np.linspace(-1,1,10), np.linspace(-1,1,10)) -D = np.sqrt(X*X+Y*Y) -sigma, mu = 1.0, 0.0 -G = np.exp(-( (D-mu)**2 / ( 2.0 * sigma**2 ) ) ) -print(G) -``` - #### 57. How to randomly place p elements in a 2D array? (★★☆) - -```python -# Author: Divakar - -n = 10 -p = 3 -Z = np.zeros((n,n)) -np.put(Z, np.random.choice(range(n*n), p, replace=False),1) -print(Z) -``` - #### 58. Subtract the mean of each row of a matrix (★★☆) - -```python -# Author: Warren Weckesser - -X = np.random.rand(5, 10) - -# Recent versions of numpy -Y = X - X.mean(axis=1, keepdims=True) - -# Older versions of numpy -Y = X - X.mean(axis=1).reshape(-1, 1) - -print(Y) -``` - -#### 59. How to I sort an array by the nth column? (★★☆) - - -```python -# Author: Steve Tjoa - -Z = np.random.randint(0,10,(3,3)) -print(Z) -print(Z[Z[:,1].argsort()]) -``` +#### 59. How to sort an array by the nth column? (★★☆) #### 60. How to tell if a given 2D array has null columns? (★★☆) - -```python -# Author: Warren Weckesser - -Z = np.random.randint(0,3,(3,10)) -print((~Z.any(axis=0)).any()) -``` - #### 61. Find the nearest value from a given value in an array (★★☆) - -```python -Z = np.random.uniform(0,1,10) -z = 0.5 -m = Z.flat[np.abs(Z - z).argmin()] -print(m) -``` - #### 62. Considering two arrays with shape (1,3) and (3,1), how to compute their sum using an iterator? (★★☆) - -```python -A = np.arange(3).reshape(3,1) -B = np.arange(3).reshape(1,3) -it = np.nditer([A,B,None]) -for x,y,z in it: z[...] = x + y -print(it.operands[2]) -``` - #### 63. Create an array class that has a name attribute (★★☆) - -```python -class NamedArray(np.ndarray): - def __new__(cls, array, name="no name"): - obj = np.asarray(array).view(cls) - obj.name = name - return obj - def __array_finalize__(self, obj): - if obj is None: return - self.info = getattr(obj, 'name', "no name") - -Z = NamedArray(np.arange(10), "range_10") -print (Z.name) -``` - #### 64. Consider a given vector, how to add 1 to each element indexed by a second vector (be careful with repeated indices)? (★★★) - -```python -# Author: Brett Olsen - -Z = np.ones(10) -I = np.random.randint(0,len(Z),20) -Z += np.bincount(I, minlength=len(Z)) -print(Z) - -# Another solution -# Author: Bartosz Telenczuk -np.add.at(Z, I, 1) -print(Z) -``` - #### 65. How to accumulate elements of a vector (X) to an array (F) based on an index list (I)? (★★★) - -```python -# Author: Alan G Isaac - -X = [1,2,3,4,5,6] -I = [1,3,9,3,4,1] -F = np.bincount(I,X) -print(F) -``` - #### 66. Considering a (w,h,3) image of (dtype=ubyte), compute the number of unique colors (★★★) - -```python -# Author: Nadav Horesh - -w,h = 16,16 -I = np.random.randint(0,2,(h,w,3)).astype(np.ubyte) -F = I[...,0]*256*256 + I[...,1]*256 +I[...,2] -n = len(np.unique(F)) -print(np.unique(I)) -``` - #### 67. Considering a four dimensions array, how to get sum over the last two axis at once? (★★★) - -```python -A = np.random.randint(0,10,(3,4,3,4)) -# solution by passing a tuple of axes (introduced in numpy 1.7.0) -sum = A.sum(axis=(-2,-1)) -print(sum) -# solution by flattening the last two dimensions into one -# (useful for functions that don't accept tuples for axis argument) -sum = A.reshape(A.shape[:-2] + (-1,)).sum(axis=-1) -print(sum) -``` - #### 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? (★★★) - -```python -# Author: Jaime Fernández del Río - -D = np.random.uniform(0,1,100) -S = np.random.randint(0,10,100) -D_sums = np.bincount(S, weights=D) -D_counts = np.bincount(S) -D_means = D_sums / D_counts -print(D_means) - -# Pandas solution as a reference due to more intuitive code -import pandas as pd -print(pd.Series(D).groupby(S).mean()) -``` - #### 69. How to get the diagonal of a dot product? (★★★) - -```python -# Author: Mathieu Blondel - -A = np.random.uniform(0,1,(5,5)) -B = np.random.uniform(0,1,(5,5)) - -# Slow version -np.diag(np.dot(A, B)) - -# Fast version -np.sum(A * B.T, axis=1) - -# Faster version -np.einsum("ij,ji->i", A, B) -``` - -#### 70. Consider the vector \[1, 2, 3, 4, 5\], how to build a new vector with 3 consecutive zeros interleaved between each value? (★★★) - - -```python -# Author: Warren Weckesser - -Z = np.array([1,2,3,4,5]) -nz = 3 -Z0 = np.zeros(len(Z) + (len(Z)-1)*(nz)) -Z0[::nz+1] = Z -print(Z0) -``` +#### 70. Consider the vector [1, 2, 3, 4, 5], how to build a new vector with 3 consecutive zeros interleaved between each value? (★★★) #### 71. Consider an array of dimension (5,5,3), how to mulitply it by an array with dimensions (5,5)? (★★★) - -```python -A = np.ones((5,5,3)) -B = 2*np.ones((5,5)) -print(A * B[:,:,None]) -``` - #### 72. How to swap two rows of an array? (★★★) - -```python -# Author: Eelco Hoogendoorn - -A = np.arange(25).reshape(5,5) -A[[0,1]] = A[[1,0]] -print(A) -``` - #### 73. Consider a set of 10 triplets describing 10 triangles (with shared vertices), find the set of unique line segments composing all the triangles (★★★) - -```python -# Author: Nicolas P. Rougier - -faces = np.random.randint(0,100,(10,3)) -F = np.roll(faces.repeat(2,axis=1),-1,axis=1) -F = F.reshape(len(F)*3,2) -F = np.sort(F,axis=1) -G = F.view( dtype=[('p0',F.dtype),('p1',F.dtype)] ) -G = np.unique(G) -print(G) -``` - #### 74. Given an array C that is a bincount, how to produce an array A such that np.bincount(A) == C? (★★★) - -```python -# Author: Jaime Fernández del Río - -C = np.bincount([1,1,2,3,4,4,6]) -A = np.repeat(np.arange(len(C)), C) -print(A) -``` - #### 75. How to compute averages using a sliding window over an array? (★★★) - -```python -# Author: Jaime Fernández del Río - -def moving_average(a, n=3) : - ret = np.cumsum(a, dtype=float) - ret[n:] = ret[n:] - ret[:-n] - return ret[n - 1:] / n -Z = np.arange(20) -print(moving_average(Z, n=3)) -``` - -#### 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\]) (★★★) - - -```python -# Author: Joe Kington / Erik Rigtorp -from numpy.lib import stride_tricks - -def rolling(a, window): - shape = (a.size - window + 1, window) - strides = (a.itemsize, a.itemsize) - return stride_tricks.as_strided(a, shape=shape, strides=strides) -Z = rolling(np.arange(10), 3) -print(Z) -``` +#### 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]) (★★★) #### 77. How to negate a boolean, or to change the sign of a float inplace? (★★★) +#### 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])? (★★★) -```python -# Author: Nathaniel J. Smith - -Z = np.random.randint(0,2,100) -np.logical_not(Z, out=Z) - -Z = np.random.uniform(-1.0,1.0,100) -np.negative(Z, out=Z) -``` - -#### 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\])? (★★★) - - -```python -def distance(P0, P1, p): - T = P1 - P0 - L = (T**2).sum(axis=1) - U = -((P0[:,0]-p[...,0])*T[:,0] + (P0[:,1]-p[...,1])*T[:,1]) / L - U = U.reshape(len(U),1) - D = P0 + U*T - p - return np.sqrt((D**2).sum(axis=1)) - -P0 = np.random.uniform(-10,10,(10,2)) -P1 = np.random.uniform(-10,10,(10,2)) -p = np.random.uniform(-10,10,( 1,2)) -print(distance(P0, P1, p)) -``` - -#### 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\])? (★★★) - - -```python -# Author: Italmassov Kuanysh - -# based on distance function from previous question -P0 = np.random.uniform(-10, 10, (10,2)) -P1 = np.random.uniform(-10,10,(10,2)) -p = np.random.uniform(-10, 10, (10,2)) -print(np.array([distance(P0,P1,p_i) for p_i in p])) -``` +#### 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])? (★★★) #### 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) (★★★) - -```python -# Author: Nicolas Rougier - -Z = np.random.randint(0,10,(10,10)) -shape = (5,5) -fill = 0 -position = (1,1) - -R = np.ones(shape, dtype=Z.dtype)*fill -P = np.array(list(position)).astype(int) -Rs = np.array(list(R.shape)).astype(int) -Zs = np.array(list(Z.shape)).astype(int) - -R_start = np.zeros((len(shape),)).astype(int) -R_stop = np.array(list(shape)).astype(int) -Z_start = (P-Rs//2) -Z_stop = (P+Rs//2)+Rs%2 - -R_start = (R_start - np.minimum(Z_start,0)).tolist() -Z_start = (np.maximum(Z_start,0)).tolist() -R_stop = np.maximum(R_start, (R_stop - np.maximum(Z_stop-Zs,0))).tolist() -Z_stop = (np.minimum(Z_stop,Zs)).tolist() - -r = [slice(start,stop) for start,stop in zip(R_start,R_stop)] -z = [slice(start,stop) for start,stop in zip(Z_start,Z_stop)] -R[r] = Z[z] -print(Z) -print(R) -``` - -#### 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\]\]? (★★★) - - -```python -# Author: Stefan van der Walt - -Z = np.arange(1,15,dtype=np.uint32) -R = stride_tricks.as_strided(Z,(11,4),(4,4)) -print(R) -``` +#### 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]]? (★★★) #### 82. Compute a matrix rank (★★★) - -```python -# Author: Stefan van der Walt - -Z = np.random.uniform(0,1,(10,10)) -U, S, V = np.linalg.svd(Z) # Singular Value Decomposition -rank = np.sum(S > 1e-10) -print(rank) -``` - #### 83. How to find the most frequent value in an array? - -```python -Z = np.random.randint(0,10,50) -print(np.bincount(Z).argmax()) -``` - #### 84. Extract all the contiguous 3x3 blocks from a random 10x10 matrix (★★★) - -```python -# Author: Chris Barker - -Z = np.random.randint(0,5,(10,10)) -n = 3 -i = 1 + (Z.shape[0]-3) -j = 1 + (Z.shape[1]-3) -C = stride_tricks.as_strided(Z, shape=(i, j, n, n), strides=Z.strides + Z.strides) -print(C) -``` - -#### 85. Create a 2D array subclass such that Z\[i,j\] == Z\[j,i\] (★★★) - - -```python -# Author: Eric O. Lebigot -# Note: only works for 2d array and value setting using indices - -class Symetric(np.ndarray): - def __setitem__(self, index, value): - i,j = index - super(Symetric, self).__setitem__((i,j), value) - super(Symetric, self).__setitem__((j,i), value) - -def symetric(Z): - return np.asarray(Z + Z.T - np.diag(Z.diagonal())).view(Symetric) - -S = symetric(np.random.randint(0,10,(5,5))) -S[2,3] = 42 -print(S) -``` +#### 85. Create a 2D array subclass such that Z[i,j] == Z[j,i] (★★★) #### 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)) (★★★) - -```python -# Author: Stefan van der Walt - -p, n = 10, 20 -M = np.ones((p,n,n)) -V = np.ones((p,n,1)) -S = np.tensordot(M, V, axes=[[0, 2], [0, 1]]) -print(S) - -# It works, because: -# M is (p,n,n) -# V is (p,n,1) -# Thus, summing over the paired axes 0 and 0 (of M and V independently), -# and 2 and 1, to remain with a (n,1) vector. -``` - #### 87. Consider a 16x16 array, how to get the block-sum (block size is 4x4)? (★★★) - -```python -# Author: Robert Kern - -Z = np.ones((16,16)) -k = 4 -S = np.add.reduceat(np.add.reduceat(Z, np.arange(0, Z.shape[0], k), axis=0), - np.arange(0, Z.shape[1], k), axis=1) -print(S) -``` - #### 88. How to implement the Game of Life using numpy arrays? (★★★) - -```python -# Author: Nicolas Rougier - -def iterate(Z): - # Count neighbours - N = (Z[0:-2,0:-2] + Z[0:-2,1:-1] + Z[0:-2,2:] + - Z[1:-1,0:-2] + Z[1:-1,2:] + - Z[2: ,0:-2] + Z[2: ,1:-1] + Z[2: ,2:]) - - # Apply rules - birth = (N==3) & (Z[1:-1,1:-1]==0) - survive = ((N==2) | (N==3)) & (Z[1:-1,1:-1]==1) - Z[...] = 0 - Z[1:-1,1:-1][birth | survive] = 1 - return Z - -Z = np.random.randint(0,2,(50,50)) -for i in range(100): Z = iterate(Z) -print(Z) -``` - #### 89. How to get the n largest values of an array (★★★) - -```python -Z = np.arange(10000) -np.random.shuffle(Z) -n = 5 - -# Slow -print (Z[np.argsort(Z)[-n:]]) - -# Fast -print (Z[np.argpartition(-Z,n)[:n]]) -``` - #### 90. Given an arbitrary number of vectors, build the cartesian product (every combinations of every item) (★★★) - -```python -# Author: Stefan Van der Walt - -def cartesian(arrays): - arrays = [np.asarray(a) for a in arrays] - shape = (len(x) for x in arrays) - - ix = np.indices(shape, dtype=int) - ix = ix.reshape(len(arrays), -1).T - - for n, arr in enumerate(arrays): - ix[:, n] = arrays[n][ix[:, n]] - - return ix - -print (cartesian(([1, 2, 3], [4, 5], [6, 7]))) -``` - #### 91. How to create a record array from a regular array? (★★★) - -```python -Z = np.array([("Hello", 2.5, 3), - ("World", 3.6, 2)]) -R = np.core.records.fromarrays(Z.T, - names='col1, col2, col3', - formats = 'S8, f8, i8') -print(R) -``` - #### 92. Consider a large vector Z, compute Z to the power of 3 using 3 different methods (★★★) - -```python -# Author: Ryan G. - -x = np.random.rand(int(5e7)) - -%timeit np.power(x,3) -%timeit x*x*x -%timeit np.einsum('i,i,i->i',x,x,x) -``` - #### 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? (★★★) - -```python -# Author: Gabe Schwartz - -A = np.random.randint(0,5,(8,3)) -B = np.random.randint(0,5,(2,2)) - -C = (A[..., np.newaxis, np.newaxis] == B) -rows = np.where(C.any((3,1)).all(1))[0] -print(rows) -``` - -#### 94. Considering a 10x3 matrix, extract rows with unequal values (e.g. \[2,2,3\]) (★★★) - - -```python -# Author: Robert Kern - -Z = np.random.randint(0,5,(10,3)) -print(Z) -# solution for arrays of all dtypes (including string arrays and record arrays) -E = np.all(Z[:,1:] == Z[:,:-1], axis=1) -U = Z[~E] -print(U) -# soluiton for numerical arrays only, will work for any number of columns in Z -U = Z[Z.max(axis=1) != Z.min(axis=1),:] -print(U) -``` +#### 94. Considering a 10x3 matrix, extract rows with unequal values (e.g. [2,2,3]) (★★★) #### 95. Convert a vector of ints into a matrix binary representation (★★★) - -```python -# Author: Warren Weckesser - -I = np.array([0, 1, 2, 3, 15, 16, 32, 64, 128]) -B = ((I.reshape(-1,1) & (2**np.arange(8))) != 0).astype(int) -print(B[:,::-1]) - -# Author: Daniel T. McDonald - -I = np.array([0, 1, 2, 3, 15, 16, 32, 64, 128], dtype=np.uint8) -print(np.unpackbits(I[:, np.newaxis], axis=1)) -``` - #### 96. Given a two dimensional array, how to extract unique rows? (★★★) - -```python -# Author: Jaime Fernández del Río - -Z = np.random.randint(0,2,(6,3)) -T = np.ascontiguousarray(Z).view(np.dtype((np.void, Z.dtype.itemsize * Z.shape[1]))) -_, idx = np.unique(T, return_index=True) -uZ = Z[idx] -print(uZ) - -# Author: Andreas Kouzelis -# NumPy >= 1.13 -uZ = np.unique(Z, axis=0) -print(uZ) -``` - #### 97. Considering 2 vectors A & B, write the einsum equivalent of inner, outer, sum, and mul function (★★★) - -```python -# Author: Alex Riley -# Make sure to read: http://ajcr.net/Basic-guide-to-einsum/ - -A = np.random.uniform(0,1,10) -B = np.random.uniform(0,1,10) - -np.einsum('i->', A) # np.sum(A) -np.einsum('i,i->i', A, B) # A * B -np.einsum('i,i', A, B) # np.inner(A, B) -np.einsum('i,j->ij', A, B) # np.outer(A, B) -``` - #### 98. Considering a path described by two vectors (X,Y), how to sample it using equidistant samples (★★★)? - -```python -# Author: Bas Swinckels - -phi = np.arange(0, 10*np.pi, 0.1) -a = 1 -x = a*phi*np.cos(phi) -y = a*phi*np.sin(phi) - -dr = (np.diff(x)**2 + np.diff(y)**2)**.5 # segment lengths -r = np.zeros_like(x) -r[1:] = np.cumsum(dr) # integrate path -r_int = np.linspace(0, r.max(), 200) # regular spaced path -x_int = np.interp(r_int, r, x) # integrate path -y_int = np.interp(r_int, r, y) -``` - #### 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. (★★★) - -```python -# Author: Evgeni Burovski - -X = np.asarray([[1.0, 0.0, 3.0, 8.0], - [2.0, 0.0, 1.0, 1.0], - [1.5, 2.5, 1.0, 0.0]]) -n = 4 -M = np.logical_and.reduce(np.mod(X, 1) == 0, axis=-1) -M &= (X.sum(axis=-1) == n) -print(X[M]) -``` - #### 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). (★★★) - - -```python -# Author: Jessica B. Hamrick - -X = np.random.randn(100) # random 1D array -N = 1000 # number of bootstrap samples -idx = np.random.randint(0, X.size, (N, X.size)) -means = X[idx].mean(axis=1) -confint = np.percentile(means, [2.5, 97.5]) -print(confint) -``` diff --git a/100_Numpy_exercises_no_solution.ipynb b/100_Numpy_exercises_no_solution.ipynb deleted file mode 100644 index 13fccbe7..00000000 --- a/100_Numpy_exercises_no_solution.ipynb +++ /dev/null @@ -1,1710 +0,0 @@ -{ - "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 -} diff --git a/100_Numpy_exercises_with_hint.ipynb b/100_Numpy_exercises_with_hint.ipynb deleted file mode 100644 index 034be603..00000000 --- a/100_Numpy_exercises_with_hint.ipynb +++ /dev/null @@ -1,1619 +0,0 @@ -{ - "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 -} diff --git a/100_Numpy_exercises_with_hint.md b/100_Numpy_exercises_with_hint.md deleted file mode 100644 index e926efac..00000000 --- a/100_Numpy_exercises_with_hint.md +++ /dev/null @@ -1,634 +0,0 @@ - -# 100 numpy exercises with hint - -This is a collection of exercises that have been collected in the numpy mailing -list, on stack overflow and in the numpy documentation. I've also created some -to reach the 100 limit. 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. - -If you find an error or think you've a better way to solve some of them, feel -free to open an issue at - -#### 1. Import the numpy package under the name `np` (★☆☆) - -(**hint**: import … as …) - - - -#### 2. Print the numpy version and the configuration (★☆☆) - -(**hint**: np.\_\_version\_\_, np.show\_config) - - - -#### 3. Create a null vector of size 10 (★☆☆) - -(**hint**: np.zeros) - - - -#### 4. How to find the memory size of any array (★☆☆) - -(**hint**: size, itemsize) - - - -#### 5. How to get the documentation of the numpy add function from the command line? (★☆☆) - -(**hint**: np.info) - - - -#### 6. Create a null vector of size 10 but the fifth value which is 1 (★☆☆) - -(**hint**: array\[4\]) - - - -#### 7. Create a vector with values ranging from 10 to 49 (★☆☆) - -(**hint**: np.arange) - - - -#### 8. Reverse a vector (first element becomes last) (★☆☆) - -(**hint**: array\[::-1\]) - - - -#### 9. Create a 3x3 matrix with values ranging from 0 to 8 (★☆☆) - -(**hint**: reshape) - - - -#### 10. Find indices of non-zero elements from \[1,2,0,0,4,0\] (★☆☆) - -(**hint**: np.nonzero) - - - -#### 11. Create a 3x3 identity matrix (★☆☆) - -(**hint**: np.eye) - - - -#### 12. Create a 3x3x3 array with random values (★☆☆) - -(**hint**: np.random.random) - - - -#### 13. Create a 10x10 array with random values and find the minimum and maximum values (★☆☆) - -(**hint**: min, max) - - - -#### 14. Create a random vector of size 30 and find the mean value (★☆☆) - -(**hint**: mean) - - - -#### 15. Create a 2d array with 1 on the border and 0 inside (★☆☆) - -(**hint**: array\[1:-1, 1:-1\]) - - - -#### 16. How to add a border (filled with 0's) around an existing array? (★☆☆) - -(**hint**: np.pad) - - - -#### 17. What is the result of the following expression? (★☆☆) - -(**hint**: NaN = not a number, inf = infinity) - - -```python -0 * np.nan -np.nan == np.nan -np.inf > np.nan -np.nan - np.nan -np.nan in set([np.nan]) -0.3 == 3 * 0.1 -``` - -#### 18. Create a 5x5 matrix with values 1,2,3,4 just below the diagonal (★☆☆) - -(**hint**: np.diag) - - - -#### 19. Create a 8x8 matrix and fill it with a checkerboard pattern (★☆☆) - -(**hint**: array\[::2\]) - - - -#### 20. Consider a (6,7,8) shape array, what is the index (x,y,z) of the 100th element? - -(**hint**: np.unravel\_index) - - - -#### 21. Create a checkerboard 8x8 matrix using the tile function (★☆☆) - -(**hint**: np.tile) - - - -#### 22. Normalize a 5x5 random matrix (★☆☆) - -(**hint**: (x - mean) / std) - - - -#### 23. Create a custom dtype that describes a color as four unsigned bytes (RGBA) (★☆☆) - -(**hint**: np.dtype) - - - -#### 24. Multiply a 5x3 matrix by a 3x2 matrix (real matrix product) (★☆☆) - -(**hint**: np.dot | @) - - - -#### 25. Given a 1D array, negate all elements which are between 3 and 8, in place. (★☆☆) - -(**hint**: >, <=) - - - -#### 26. What is the output of the following script? (★☆☆) - -(**hint**: np.sum) - - -```python -# Author: Jake VanderPlas - -print(sum(range(5),-1)) -from numpy import * -print(sum(range(5),-1)) -``` - -#### 27. Consider an integer vector Z, which of these expressions are legal? (★☆☆) - - -```python -Z**Z -2 << Z >> 2 -Z <- Z -1j*Z -Z/1/1 -ZZ -``` - -#### 28. What are the result of the following expressions? - - -```python -np.array(0) / np.array(0) -np.array(0) // np.array(0) -np.array([np.nan]).astype(int).astype(float) -``` - -#### 29. How to round away from zero a float array ? (★☆☆) - -(**hint**: np.uniform, np.copysign, np.ceil, np.abs) - - - -#### 30. How to find common values between two arrays? (★☆☆) - -(**hint**: np.intersect1d) - - - -#### 31. How to ignore all numpy warnings (not recommended)? (★☆☆) - -(**hint**: np.seterr, np.errstate) - - - -#### 32. Is the following expressions true? (★☆☆) - -(**hint**: imaginary number) - - -```python -np.sqrt(-1) == np.emath.sqrt(-1) -``` - -#### 33. How to get the dates of yesterday, today and tomorrow? (★☆☆) - -(**hint**: np.datetime64, np.timedelta64) - - - -#### 34. How to get all the dates corresponding to the month of July 2016? (★★☆) - -(**hint**: np.arange(dtype=datetime64\['D'\])) - - - -#### 35. How to compute ((A+B)\*(-A/2)) in place (without copy)? (★★☆) - -(**hint**: np.add(out=), np.negative(out=), np.multiply(out=), np.divide(out=)) - - - -#### 36. Extract the integer part of a random array using 5 different methods (★★☆) - -(**hint**: %, np.floor, np.ceil, astype, np.trunc) - - - -#### 37. Create a 5x5 matrix with row values ranging from 0 to 4 (★★☆) - -(**hint**: np.arange) - - - -#### 38. Consider a generator function that generates 10 integers and use it to build an array (★☆☆) - -(**hint**: np.fromiter) - - - -#### 39. Create a vector of size 10 with values ranging from 0 to 1, both excluded (★★☆) - -(**hint**: np.linspace) - - - -#### 40. Create a random vector of size 10 and sort it (★★☆) - -(**hint**: sort) - - - -#### 41. How to sum a small array faster than np.sum? (★★☆) - -(**hint**: np.add.reduce) - - - -#### 42. Consider two random array A and B, check if they are equal (★★☆) - -(**hint**: np.allclose, np.array\_equal) - - - -#### 43. Make an array immutable (read-only) (★★☆) - -(**hint**: flags.writeable) - - - -#### 44. Consider a random 10x2 matrix representing cartesian coordinates, convert them to polar coordinates (★★☆) - -(**hint**: np.sqrt, np.arctan2) - - - -#### 45. Create random vector of size 10 and replace the maximum value by 0 (★★☆) - -(**hint**: argmax) - - - -#### 46. Create a structured array with `x` and `y` coordinates covering the \[0,1\]x\[0,1\] area (★★☆) - -(**hint**: np.meshgrid) - - - -#### 47. Given two arrays, X and Y, construct the Cauchy matrix C (Cij =1/(xi - yj)) - -##### (hint: np.subtract.outer) - - - -#### 48. Print the minimum and maximum representable value for each numpy scalar type (★★☆) - -(**hint**: np.iinfo, np.finfo, eps) - - - -#### 49. How to print all the values of an array? (★★☆) - -(**hint**: np.set\_printoptions) - - - -#### 50. How to find the closest value (to a given scalar) in a vector? (★★☆) - -(**hint**: argmin) - - - -#### 51. Create a structured array representing a position (x,y) and a color (r,g,b) (★★☆) - -(**hint**: dtype) - - - -#### 52. Consider a random vector with shape (100,2) representing coordinates, find point by point distances (★★☆) - -(**hint**: np.atleast\_2d, T, np.sqrt) - - - -#### 53. How to convert a float (32 bits) array into an integer (32 bits) in place? - -(**hint**: astype(copy=False)) - - - -#### 54. How to read the following file? (★★☆) - -(**hint**: np.genfromtxt) - - -``` -1, 2, 3, 4, 5 -6, , , 7, 8 - , , 9,10,11 -``` - -#### 55. What is the equivalent of enumerate for numpy arrays? (★★☆) - -(**hint**: np.ndenumerate, np.ndindex) - - - -#### 56. Generate a generic 2D Gaussian-like array (★★☆) - -(**hint**: np.meshgrid, np.exp) - - - -#### 57. How to randomly place p elements in a 2D array? (★★☆) - -(**hint**: np.put, np.random.choice) - - - -#### 58. Subtract the mean of each row of a matrix (★★☆) - -(**hint**: mean(axis=,keepdims=)) - - - -#### 59. How to sort an array by the nth column? (★★☆) - -(**hint**: argsort) - - - -#### 60. How to tell if a given 2D array has null columns? (★★☆) - -(**hint**: any, ~) - - - -#### 61. Find the nearest value from a given value in an array (★★☆) - -(**hint**: np.abs, argmin, flat) - - - -#### 62. Considering two arrays with shape (1,3) and (3,1), how to compute their sum using an iterator? (★★☆) - -(**hint**: np.nditer) - - - -#### 63. Create an array class that has a name attribute (★★☆) - -(**hint**: class method) - - - -#### 64. Consider a given vector, how to add 1 to each element indexed by a second vector (be careful with repeated indices)? (★★★) - -(**hint**: np.bincount | np.add.at) - - - -#### 65. How to accumulate elements of a vector (X) to an array (F) based on an index list (I)? (★★★) - -(**hint**: np.bincount) - - - -#### 66. Considering a (w,h,3) image of (dtype=ubyte), compute the number of unique colors (★★★) - -(**hint**: np.unique) - - - -#### 67. Considering a four dimensions array, how to get sum over the last two axis at once? (★★★) - -(**hint**: sum(axis=(-2,-1))) - - - -#### 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? (★★★) - -(**hint**: np.bincount) - - - -#### 69. How to get the diagonal of a dot product? (★★★) - -(**hint**: np.diag) - - - -#### 70. Consider the vector \[1, 2, 3, 4, 5\], how to build a new vector with 3 consecutive zeros interleaved between each value? (★★★) - -(**hint**: array\[::4\]) - - - -#### 71. Consider an array of dimension (5,5,3), how to mulitply it by an array with dimensions (5,5)? (★★★) - -(**hint**: array\[:, :, None\]) - - - -#### 72. How to swap two rows of an array? (★★★) - -(**hint**: array\[\[\]\] = array\[\[\]\]) - - - -#### 73. Consider a set of 10 triplets describing 10 triangles (with shared vertices), find the set of unique line segments composing all the triangles (★★★) - -(**hint**: repeat, np.roll, np.sort, view, np.unique) - - - -#### 74. Given an array C that is a bincount, how to produce an array A such that np.bincount(A) == C? (★★★) - -(**hint**: np.repeat) - - - -#### 75. How to compute averages using a sliding window over an array? (★★★) - -(**hint**: np.cumsum) - - - -#### 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\]) (★★★) - -(**hint**: from numpy.lib import stride\_tricks) - - - -#### 77. How to negate a boolean, or to change the sign of a float inplace? (★★★) - -(**hint**: np.logical_not, np.negative) - - - -#### 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\])? (★★★) - - - -#### 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\])? (★★★) - - - -#### 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) (★★★) - -(**hint**: minimum, maximum) - - - -#### 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\]\]? (★★★) - -(**hint**: stride\_tricks.as\_strided) - - - -#### 82. Compute a matrix rank (★★★) - -(**hint**: np.linalg.svd) - - - -#### 83. How to find the most frequent value in an array? - -(**hint**: np.bincount, argmax) - - - -#### 84. Extract all the contiguous 3x3 blocks from a random 10x10 matrix (★★★) - -(**hint**: stride\_tricks.as\_strided) - - - -#### 85. Create a 2D array subclass such that Z\[i,j\] == Z\[j,i\] (★★★) - -(**hint**: class method) - - - -#### 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)) (★★★) - -(**hint**: np.tensordot) - - - -#### 87. Consider a 16x16 array, how to get the block-sum (block size is 4x4)? (★★★) - -(**hint**: np.add.reduceat) - - - -#### 88. How to implement the Game of Life using numpy arrays? (★★★) - - - -#### 89. How to get the n largest values of an array (★★★) - -(**hint**: np.argsort | np.argpartition) - - - -#### 90. Given an arbitrary number of vectors, build the cartesian product (every combinations of every item) (★★★) - -(**hint**: np.indices) - - - -#### 91. How to create a record array from a regular array? (★★★) - -(**hint**: np.core.records.fromarrays) - - - -#### 92. Consider a large vector Z, compute Z to the power of 3 using 3 different methods (★★★) - -(**hint**: np.power, \*, np.einsum) - - - -#### 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? (★★★) - -(**hint**: np.where) - - - -#### 94. Considering a 10x3 matrix, extract rows with unequal values (e.g. \[2,2,3\]) (★★★) - - - -#### 95. Convert a vector of ints into a matrix binary representation (★★★) - -(**hint**: np.unpackbits) - - - -#### 96. Given a two dimensional array, how to extract unique rows? (★★★) - -(**hint**: np.ascontiguousarray | np.unique) - - - -#### 97. Considering 2 vectors A & B, write the einsum equivalent of inner, outer, sum, and mul function (★★★) - -(**hint**: np.einsum) - - - -#### 98. Considering a path described by two vectors (X,Y), how to sample it using equidistant samples (★★★)? - -(**hint**: np.cumsum, np.interp) - - - -#### 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. (★★★) - -(**hint**: np.logical\_and.reduce, np.mod) - - - -#### 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). (★★★) - -(**hint**: np.percentile) - diff --git a/100_Numpy_exercises_no_solution.md b/100_Numpy_exercises_with_hints.md similarity index 65% rename from 100_Numpy_exercises_no_solution.md rename to 100_Numpy_exercises_with_hints.md index 44b3fbe5..c6b2a43a 100644 --- a/100_Numpy_exercises_no_solution.md +++ b/100_Numpy_exercises_with_hints.md @@ -1,82 +1,50 @@ -# 100 numpy exercises -This is a collection of exercises that have been collected in the numpy mailing -list, on stack overflow and in the numpy documentation. I've also created some -to reach the 100 limit. 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. -If you find an error or think you've a better way to solve some of them, feel -free to open an issue at +# 100 numpy exercises -#### 1. Import the numpy package under the name `np` (★☆☆) +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. +If you find an error or think you've a better way to solve some of them, feel +free to open an issue at . +File automatically generated. See the documentation to update questions/answers/hints programmatically. +#### 1. Import the numpy package under the name `np` (★☆☆) +`hint: import … as` #### 2. Print the numpy version and the configuration (★☆☆) - - - +`hint: np.__version__, np.show_config)` #### 3. Create a null vector of size 10 (★☆☆) - - - -#### 4. How to find the memory size of any array (★☆☆) - - - -#### 5. How to get the documentation of the numpy add function from the command line? (★☆☆) - - - -#### 6. Create a null vector of size 10 but the fifth value which is 1 (★☆☆) - - - -#### 7. Create a vector with values ranging from 10 to 49 (★☆☆) - - - -#### 8. Reverse a vector (first element becomes last) (★☆☆) - - - -#### 9. Create a 3x3 matrix with values ranging from 0 to 8 (★☆☆) - - - -#### 10. Find indices of non-zero elements from \[1,2,0,0,4,0\] (★☆☆) - - - +`hint: np.zeros` +#### 4. How to find the memory size of any array (★☆☆) +`hint: size, itemsize` +#### 5. How to get the documentation of the numpy add function from the command line? (★☆☆) +`hint: np.info` +#### 6. Create a null vector of size 10 but the fifth value which is 1 (★☆☆) +`hint: array[4]` +#### 7. Create a vector with values ranging from 10 to 49 (★☆☆) +`hint: arange` +#### 8. Reverse a vector (first element becomes last) (★☆☆) +`hint: array[::-1]` +#### 9. Create a 3x3 matrix with values ranging from 0 to 8 (★☆☆) +`hint: reshape` +#### 10. Find indices of non-zero elements from [1,2,0,0,4,0] (★☆☆) +`hint: np.nonzero` #### 11. Create a 3x3 identity matrix (★☆☆) - - - +`hint: np.eye` #### 12. Create a 3x3x3 array with random values (★☆☆) - - - +`hint: np.random.random` #### 13. Create a 10x10 array with random values and find the minimum and maximum values (★☆☆) - - - +`hint: min, max` #### 14. Create a random vector of size 30 and find the mean value (★☆☆) - - - +`hint: mean` #### 15. Create a 2d array with 1 on the border and 0 inside (★☆☆) - - - +`hint: array[1:-1, 1:-1]` #### 16. How to add a border (filled with 0's) around an existing array? (★☆☆) - - - +`hint: np.pad` #### 17. What is the result of the following expression? (★☆☆) - - ```python 0 * np.nan np.nan == np.nan @@ -85,42 +53,24 @@ np.nan - np.nan np.nan in set([np.nan]) 0.3 == 3 * 0.1 ``` - +`hint: NaN = not a number, inf = infinity` #### 18. Create a 5x5 matrix with values 1,2,3,4 just below the diagonal (★☆☆) - - - +`hint: np.diag` #### 19. Create a 8x8 matrix and fill it with a checkerboard pattern (★☆☆) - - - +`hint: array[::2]` #### 20. Consider a (6,7,8) shape array, what is the index (x,y,z) of the 100th element? - - - +`hint: np.unravel_index` #### 21. Create a checkerboard 8x8 matrix using the tile function (★☆☆) - - - +`hint: np.tile` #### 22. Normalize a 5x5 random matrix (★☆☆) - - - +`hint: (x -mean)/std` #### 23. Create a custom dtype that describes a color as four unsigned bytes (RGBA) (★☆☆) - - - +`hint: np.dtype` #### 24. Multiply a 5x3 matrix by a 3x2 matrix (real matrix product) (★☆☆) - - - +`hint:` #### 25. Given a 1D array, negate all elements which are between 3 and 8, in place. (★☆☆) - - - +`hint: >, <` #### 26. What is the output of the following script? (★☆☆) - - ```python # Author: Jake VanderPlas @@ -128,10 +78,8 @@ print(sum(range(5),-1)) from numpy import * print(sum(range(5),-1)) ``` - +`hint: np.sum` #### 27. Consider an integer vector Z, which of these expressions are legal? (★☆☆) - - ```python Z**Z 2 << Z >> 2 @@ -140,307 +88,163 @@ Z <- Z Z/1/1 ZZ ``` - +`No hints provided...` #### 28. What are the result of the following expressions? - - ```python np.array(0) / np.array(0) np.array(0) // np.array(0) np.array([np.nan]).astype(int).astype(float) ``` - +`No hints provided...` #### 29. How to round away from zero a float array ? (★☆☆) - - - +`hint: np.uniform, np.copysign, np.ceil, np.abs` #### 30. How to find common values between two arrays? (★☆☆) - - - +`hint: np.intersect1d` #### 31. How to ignore all numpy warnings (not recommended)? (★☆☆) - - - +`hint: np.seterr, np.errstate` #### 32. Is the following expressions true? (★☆☆) - - ```python np.sqrt(-1) == np.emath.sqrt(-1) ``` - +`hint: imaginary number` #### 33. How to get the dates of yesterday, today and tomorrow? (★☆☆) - - - +`hint: np.datetime64, np.timedelta64` #### 34. How to get all the dates corresponding to the month of July 2016? (★★☆) - - - -#### 35. How to compute ((A+B)\*(-A/2)) in place (without copy)? (★★☆) - - - -#### 36. Extract the integer part of a random array using 5 different methods (★★☆) - - - +`hint: np.arange(dtype=datetime64['D'])` +#### 35. How to compute ((A+B)*(-A/2)) in place (without copy)? (★★☆) +`hint: np.add(out=), np.negative(out=), np.multiply(out=), np.divide(out=)` +#### 36. Extract the integer part of a random array of positive numbers using 4 different methods (★★☆) +`hint: %, np.floor, astype, np.trunc` #### 37. Create a 5x5 matrix with row values ranging from 0 to 4 (★★☆) - - - +`hint: np.arange` #### 38. Consider a generator function that generates 10 integers and use it to build an array (★☆☆) - - - +`hint: np.fromiter` #### 39. Create a vector of size 10 with values ranging from 0 to 1, both excluded (★★☆) - - - +`hint: np.linspace` #### 40. Create a random vector of size 10 and sort it (★★☆) - - - +`hint: sort` #### 41. How to sum a small array faster than np.sum? (★★☆) - - - +`hint: np.add.reduce` #### 42. Consider two random array A and B, check if they are equal (★★☆) - - - +`hint: np.allclose, np.array_equal` #### 43. Make an array immutable (read-only) (★★☆) - - - +`hint: flags.writeable` #### 44. Consider a random 10x2 matrix representing cartesian coordinates, convert them to polar coordinates (★★☆) - - - -#### 45. Create a random vector of size 10 and replace the maximum value by 0 (★★☆) - - - -#### 46. Create a structured array with `x` and `y` coordinates covering the \[0,1\]x\[0,1\] area (★★☆) - - - -#### 47. Given two arrays, X and Y, construct the Cauchy matrix C (Cij =1/(xi - yj)) - - - +`hint: np.sqrt, np.arctan2` +#### 45. Create random vector of size 10 and replace the maximum value by 0 (★★☆) +`hint: argmax` +#### 46. Create a structured array with `x` and `y` coordinates covering the [0,1]x[0,1] area (★★☆) +`hint: np.meshgrid` +#### 47. Given two arrays, X and Y, construct the Cauchy matrix C (Cij =1/(xi - yj)) +`hint: np.subtract.outer` #### 48. Print the minimum and maximum representable value for each numpy scalar type (★★☆) - - - +`hint: np.iinfo, np.finfo, eps` #### 49. How to print all the values of an array? (★★☆) - - - +`hint: np.set_printoptions` #### 50. How to find the closest value (to a given scalar) in a vector? (★★☆) - - - +`hint: argmin` #### 51. Create a structured array representing a position (x,y) and a color (r,g,b) (★★☆) - - - +`hint: dtype` #### 52. Consider a random vector with shape (100,2) representing coordinates, find point by point distances (★★☆) - - - +`hint: np.atleast_2d, T, np.sqrt` #### 53. How to convert a float (32 bits) array into an integer (32 bits) in place? - - - +`hint: astype(copy=False)` #### 54. How to read the following file? (★★☆) - - ``` 1, 2, 3, 4, 5 6, , , 7, 8 , , 9,10,11 ``` - +`hint: np.genfromtxt` #### 55. What is the equivalent of enumerate for numpy arrays? (★★☆) - - - +`hint: np.ndenumerate, np.ndindex` #### 56. Generate a generic 2D Gaussian-like array (★★☆) - - - +`hint: np.meshgrid, np.exp` #### 57. How to randomly place p elements in a 2D array? (★★☆) - - - +`hint: np.put, np.random.choice` #### 58. Subtract the mean of each row of a matrix (★★☆) - - - +`hint: mean(axis=,keepdims=)` #### 59. How to sort an array by the nth column? (★★☆) - - - +`hint: argsort` #### 60. How to tell if a given 2D array has null columns? (★★☆) - - - +`hint: any, ~` #### 61. Find the nearest value from a given value in an array (★★☆) - - - +`hint: np.abs, argmin, flat` #### 62. Considering two arrays with shape (1,3) and (3,1), how to compute their sum using an iterator? (★★☆) - - - +`hint: np.nditer` #### 63. Create an array class that has a name attribute (★★☆) - - - +`hint: class method` #### 64. Consider a given vector, how to add 1 to each element indexed by a second vector (be careful with repeated indices)? (★★★) - - - +`hint: np.bincount | np.add.at` #### 65. How to accumulate elements of a vector (X) to an array (F) based on an index list (I)? (★★★) - - - +`hint: np.bincount` #### 66. Considering a (w,h,3) image of (dtype=ubyte), compute the number of unique colors (★★★) - - - +`hint: np.unique` #### 67. Considering a four dimensions array, how to get sum over the last two axis at once? (★★★) - - - +`hint: sum(axis=(-2,-1))` #### 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? (★★★) - - - +`hint: np.bincount` #### 69. How to get the diagonal of a dot product? (★★★) - - - -#### 70. Consider the vector \[1, 2, 3, 4, 5\], how to build a new vector with 3 consecutive zeros interleaved between each value? (★★★) - - - +`hint: np.diag` +#### 70. Consider the vector [1, 2, 3, 4, 5], how to build a new vector with 3 consecutive zeros interleaved between each value? (★★★) +`hint: array[::4]` #### 71. Consider an array of dimension (5,5,3), how to mulitply it by an array with dimensions (5,5)? (★★★) - - - +`hint: array[:, :, None]` #### 72. How to swap two rows of an array? (★★★) - - - +`hint: array[[]] = array[[]]` #### 73. Consider a set of 10 triplets describing 10 triangles (with shared vertices), find the set of unique line segments composing all the triangles (★★★) - - - +`hint: repeat, np.roll, np.sort, view, np.unique` #### 74. Given an array C that is a bincount, how to produce an array A such that np.bincount(A) == C? (★★★) - - - +`hint: np.repeat` #### 75. How to compute averages using a sliding window over an array? (★★★) - - - -#### 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\]) (★★★) - - - +`hint: np.cumsum` +#### 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]) (★★★) +`hint: from numpy.lib import stride_tricks` #### 77. How to negate a boolean, or to change the sign of a float inplace? (★★★) - - - -#### 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\])? (★★★) - - - -#### 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\])? (★★★) - - - +`hint: np.logical_not, np.negative` +#### 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])? (★★★) +`No hints provided...` +#### 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])? (★★★) +`No hints provided...` #### 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) (★★★) - - - -#### 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\]\]? (★★★) - - - +`hint: minimum maximum` +#### 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]]? (★★★) +`hint: stride_tricks.as_strided` #### 82. Compute a matrix rank (★★★) - - - +`hint: np.linalg.svd` #### 83. How to find the most frequent value in an array? - - - +`hint: np.bincount, argmax` #### 84. Extract all the contiguous 3x3 blocks from a random 10x10 matrix (★★★) - - - -#### 85. Create a 2D array subclass such that Z\[i,j\] == Z\[j,i\] (★★★) - - - +`hint: stride_tricks.as_strided` +#### 85. Create a 2D array subclass such that Z[i,j] == Z[j,i] (★★★) +`hint: class method` #### 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)) (★★★) - - - +`hint: np.tensordot` #### 87. Consider a 16x16 array, how to get the block-sum (block size is 4x4)? (★★★) - - - +`hint: np.add.reduceat` #### 88. How to implement the Game of Life using numpy arrays? (★★★) - - - +`No hints provided...` #### 89. How to get the n largest values of an array (★★★) - - - +`hint: np.argsort | np.argpartition` #### 90. Given an arbitrary number of vectors, build the cartesian product (every combinations of every item) (★★★) - - - +`hint: np.indices` #### 91. How to create a record array from a regular array? (★★★) - - - +`hint: np.core.records.fromarrays` #### 92. Consider a large vector Z, compute Z to the power of 3 using 3 different methods (★★★) - - - +`hint: np.power, *, np.einsum` #### 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? (★★★) - - - -#### 94. Considering a 10x3 matrix, extract rows with unequal values (e.g. \[2,2,3\]) (★★★) - - - +`hint: np.where` +#### 94. Considering a 10x3 matrix, extract rows with unequal values (e.g. [2,2,3]) (★★★) +`No hints provided...` #### 95. Convert a vector of ints into a matrix binary representation (★★★) - - - +`hint: np.unpackbits` #### 96. Given a two dimensional array, how to extract unique rows? (★★★) - - - +`hint: np.ascontiguousarray | np.unique` #### 97. Considering 2 vectors A & B, write the einsum equivalent of inner, outer, sum, and mul function (★★★) - - - +`hint: np.einsum` #### 98. Considering a path described by two vectors (X,Y), how to sample it using equidistant samples (★★★)? - - - +`hint: np.cumsum, np.interp` #### 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. (★★★) - - - +`hint: np.logical_and.reduce, np.mod` #### 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). (★★★) - +`hint: np.percentile` \ No newline at end of file diff --git a/100_Numpy_exercises_with_hints_with_solutions.md b/100_Numpy_exercises_with_hints_with_solutions.md new file mode 100644 index 00000000..ea7f96d6 --- /dev/null +++ b/100_Numpy_exercises_with_hints_with_solutions.md @@ -0,0 +1,1171 @@ + + + +# 100 numpy exercises + +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. + + +If you find an error or think you've a better way to solve some of them, feel +free to open an issue at . +File automatically generated. See the documentation to update questions/answers/hints programmatically. + +#### 1. Import the numpy package under the name `np` (★☆☆) +`hint: import … as` + +```python +import numpy as np +``` +#### 2. Print the numpy version and the configuration (★☆☆) +`hint: np.__version__, np.show_config)` + +```python +print(np.__version__) +np.show_config() +``` +#### 3. Create a null vector of size 10 (★☆☆) +`hint: np.zeros` + +```python +Z = np.zeros(10) +print(Z) +``` +#### 4. How to find the memory size of any array (★☆☆) +`hint: size, itemsize` + +```python +Z = np.zeros((10,10)) +print("%d bytes" % (Z.size * Z.itemsize)) +``` +#### 5. How to get the documentation of the numpy add function from the command line? (★☆☆) +`hint: np.info` + +```python +%run `python -c "import numpy; numpy.info(numpy.add)"` +``` +#### 6. Create a null vector of size 10 but the fifth value which is 1 (★☆☆) +`hint: array[4]` + +```python +Z = np.zeros(10) +Z[4] = 1 +print(Z) +``` +#### 7. Create a vector with values ranging from 10 to 49 (★☆☆) +`hint: arange` + +```python +Z = np.arange(10,50) +print(Z) +``` +#### 8. Reverse a vector (first element becomes last) (★☆☆) +`hint: array[::-1]` + +```python +Z = np.arange(50) +Z = Z[::-1] +print(Z) +``` +#### 9. Create a 3x3 matrix with values ranging from 0 to 8 (★☆☆) +`hint: reshape` + +```python +nz = np.nonzero([1,2,0,0,4,0]) +print(nz) +``` +#### 10. Find indices of non-zero elements from [1,2,0,0,4,0] (★☆☆) +`hint: np.nonzero` + +```python +nz = np.nonzero([1,2,0,0,4,0]) +print(nz) +``` +#### 11. Create a 3x3 identity matrix (★☆☆) +`hint: np.eye` + +```python +Z = np.eye(3) +print(Z) +``` +#### 12. Create a 3x3x3 array with random values (★☆☆) +`hint: np.random.random` + +```python +Z = np.random.random((3,3,3)) +print(Z) +``` +#### 13. Create a 10x10 array with random values and find the minimum and maximum values (★☆☆) +`hint: min, max` + +```python +Z = np.random.random((10,10)) +Zmin, Zmax = Z.min(), Z.max() +print(Zmin, Zmax) +``` +#### 14. Create a random vector of size 30 and find the mean value (★☆☆) +`hint: mean` + +```python +Z = np.random.random(30) +m = Z.mean() +print(m) +``` +#### 15. Create a 2d array with 1 on the border and 0 inside (★☆☆) +`hint: array[1:-1, 1:-1]` + +```python +Z = np.ones((10,10)) +Z[1:-1,1:-1] = 0 +print(Z) +``` +#### 16. How to add a border (filled with 0's) around an existing array? (★☆☆) +`hint: np.pad` + +```python +Z = np.ones((5,5)) +Z = np.pad(Z, pad_width=1, mode='constant', constant_values=0) +print(Z) +``` +#### 17. What is the result of the following expression? (★☆☆) +```python +0 * np.nan +np.nan == np.nan +np.inf > np.nan +np.nan - np.nan +np.nan in set([np.nan]) +0.3 == 3 * 0.1 +``` +`hint: NaN = not a number, inf = infinity` + +```python +print(0 * np.nan) +print(np.nan == np.nan) +print(np.inf > np.nan) +print(np.nan - np.nan) +print(np.nan in set([np.nan])) +print(0.3 == 3 * 0.1) +``` +#### 18. Create a 5x5 matrix with values 1,2,3,4 just below the diagonal (★☆☆) +`hint: np.diag` + +```python +Z = np.diag(1+np.arange(4),k=-1) +print(Z) +``` +#### 19. Create a 8x8 matrix and fill it with a checkerboard pattern (★☆☆) +`hint: array[::2]` + +```python +Z = np.zeros((8,8),dtype=int) +Z[1::2,::2] = 1 +Z[::2,1::2] = 1 +print(Z) +``` +#### 20. Consider a (6,7,8) shape array, what is the index (x,y,z) of the 100th element? +`hint: np.unravel_index` + +```python +print(np.unravel_index(99,(6,7,8))) +``` +#### 21. Create a checkerboard 8x8 matrix using the tile function (★☆☆) +`hint: np.tile` + +```python +Z = np.tile( np.array([[0,1],[1,0]]), (4,4)) +print(Z) +``` +#### 22. Normalize a 5x5 random matrix (★☆☆) +`hint: (x -mean)/std` + +```python +Z = np.random.random((5,5)) +Z = (Z - np.mean (Z)) / (np.std (Z)) +print(Z) +``` +#### 23. Create a custom dtype that describes a color as four unsigned bytes (RGBA) (★☆☆) +`hint: np.dtype` + +```python +color = np.dtype([("r", np.ubyte, 1), + ("g", np.ubyte, 1), + ("b", np.ubyte, 1), + ("a", np.ubyte, 1)]) +``` +#### 24. Multiply a 5x3 matrix by a 3x2 matrix (real matrix product) (★☆☆) +`hint:` + +```python +Z = np.dot(np.ones((5,3)), np.ones((3,2))) +print(Z) + +# Alternative solution, in Python 3.5 and above +Z = np.ones((5,3)) @ np.ones((3,2)) +print(Z) +``` +#### 25. Given a 1D array, negate all elements which are between 3 and 8, in place. (★☆☆) +`hint: >, <` + +```python +# Author: Evgeni Burovski + +Z = np.arange(11) +Z[(3 < Z) & (Z <= 8)] *= -1 +print(Z) +``` +#### 26. What is the output of the following script? (★☆☆) +```python +# Author: Jake VanderPlas + +print(sum(range(5),-1)) +from numpy import * +print(sum(range(5),-1)) +``` +`hint: np.sum` + +```python +# Author: Jake VanderPlas + +print(sum(range(5),-1)) +from numpy import * +print(sum(range(5),-1)) +``` +#### 27. Consider an integer vector Z, which of these expressions are legal? (★☆☆) +```python +Z**Z +2 << Z >> 2 +Z <- Z +1j*Z +Z/1/1 +ZZ +``` +`No hints provided...` + +```python +Z**Z +2 << Z >> 2 +Z <- Z +1j*Z +Z/1/1 +ZZ +``` +#### 28. What are the result of the following expressions? +```python +np.array(0) / np.array(0) +np.array(0) // np.array(0) +np.array([np.nan]).astype(int).astype(float) +``` +`No hints provided...` + +```python +print(np.array(0) / np.array(0)) +print(np.array(0) // np.array(0)) +print(np.array([np.nan]).astype(int).astype(float)) +``` +#### 29. How to round away from zero a float array ? (★☆☆) +`hint: np.uniform, np.copysign, np.ceil, np.abs` + +```python +# Author: Charles R Harris + +Z = np.random.uniform(-10,+10,10) +print (np.copysign(np.ceil(np.abs(Z)), Z)) +``` +#### 30. How to find common values between two arrays? (★☆☆) +`hint: np.intersect1d` + +```python +Z1 = np.random.randint(0,10,10) +Z2 = np.random.randint(0,10,10) +print(np.intersect1d(Z1,Z2)) +``` +#### 31. How to ignore all numpy warnings (not recommended)? (★☆☆) +`hint: np.seterr, np.errstate` + +```python +# Suicide mode on +defaults = np.seterr(all="ignore") +Z = np.ones(1) / 0 + +# Back to sanity +_ = np.seterr(**defaults) + +# Equivalently with a context manager +nz = np.nonzero([1,2,0,0,4,0]) +print(nz) +``` +#### 32. Is the following expressions true? (★☆☆) +```python +np.sqrt(-1) == np.emath.sqrt(-1) +``` +`hint: imaginary number` + +```python +np.sqrt(-1) == np.emath.sqrt(-1) +``` +#### 33. How to get the dates of yesterday, today and tomorrow? (★☆☆) +`hint: np.datetime64, np.timedelta64` + +```python +yesterday = np.datetime64('today', 'D') - np.timedelta64(1, 'D') +today = np.datetime64('today', 'D') +tomorrow = np.datetime64('today', 'D') + np.timedelta64(1, 'D') +``` +#### 34. How to get all the dates corresponding to the month of July 2016? (★★☆) +`hint: np.arange(dtype=datetime64['D'])` + +```python +Z = np.arange('2016-07', '2016-08', dtype='datetime64[D]') +print(Z) +``` +#### 35. How to compute ((A+B)*(-A/2)) in place (without copy)? (★★☆) +`hint: np.add(out=), np.negative(out=), np.multiply(out=), np.divide(out=)` + +```python +A = np.ones(3)*1 +B = np.ones(3)*2 +C = np.ones(3)*3 +np.add(A,B,out=B) +np.divide(A,2,out=A) +np.negative(A,out=A) +np.multiply(A,B,out=A) +``` +#### 36. Extract the integer part of a random array of positive numbers using 4 different methods (★★☆) +`hint: %, np.floor, astype, np.trunc` + +```python +Z = np.random.uniform(0,10,10) + +print (Z - Z%1) +print (np.floor(Z)) +print (Z.astype(int)) +print (np.trunc(Z)) +``` +#### 37. Create a 5x5 matrix with row values ranging from 0 to 4 (★★☆) +`hint: np.arange` + +```python +Z = np.zeros((5,5)) +Z += np.arange(5) +print(Z) +``` +#### 38. Consider a generator function that generates 10 integers and use it to build an array (★☆☆) +`hint: np.fromiter` + +```python +def generate(): + for x in range(10): + yield x +Z = np.fromiter(generate(),dtype=float,count=-1) +print(Z) +``` +#### 39. Create a vector of size 10 with values ranging from 0 to 1, both excluded (★★☆) +`hint: np.linspace` + +```python +Z = np.linspace(0,1,11,endpoint=False)[1:] +print(Z) +``` +#### 40. Create a random vector of size 10 and sort it (★★☆) +`hint: sort` + +```python +Z = np.random.random(10) +Z.sort() +print(Z) +``` +#### 41. How to sum a small array faster than np.sum? (★★☆) +`hint: np.add.reduce` + +```python +# Author: Evgeni Burovski + +Z = np.arange(10) +np.add.reduce(Z) +``` +#### 42. Consider two random array A and B, check if they are equal (★★☆) +`hint: np.allclose, np.array_equal` + +```python +A = np.random.randint(0,2,5) +B = np.random.randint(0,2,5) + +# Assuming identical shape of the arrays and a tolerance for the comparison of values +equal = np.allclose(A,B) +print(equal) + +# Checking both the shape and the element values, no tolerance (values have to be exactly equal) +equal = np.array_equal(A,B) +print(equal) +``` +#### 43. Make an array immutable (read-only) (★★☆) +`hint: flags.writeable` + +```python +Z = np.zeros(10) +Z.flags.writeable = False +Z[0] = 1 +``` +#### 44. Consider a random 10x2 matrix representing cartesian coordinates, convert them to polar coordinates (★★☆) +`hint: np.sqrt, np.arctan2` + +```python +Z = np.random.random((10,2)) +X,Y = Z[:,0], Z[:,1] +R = np.sqrt(X**2+Y**2) +T = np.arctan2(Y,X) +print(R) +print(T) +``` +#### 45. Create random vector of size 10 and replace the maximum value by 0 (★★☆) +`hint: argmax` + +```python +Z = np.random.random(10) +Z[Z.argmax()] = 0 +print(Z) +``` +#### 46. Create a structured array with `x` and `y` coordinates covering the [0,1]x[0,1] area (★★☆) +`hint: np.meshgrid` + +```python +Z = np.zeros((5,5), [('x',float),('y',float)]) +Z['x'], Z['y'] = np.meshgrid(np.linspace(0,1,5), + np.linspace(0,1,5)) +print(Z) +``` +#### 47. Given two arrays, X and Y, construct the Cauchy matrix C (Cij =1/(xi - yj)) +`hint: np.subtract.outer` + +```python +# Author: Evgeni Burovski + +X = np.arange(8) +Y = X + 0.5 +C = 1.0 / np.subtract.outer(X, Y) +print(np.linalg.det(C)) +``` +#### 48. Print the minimum and maximum representable value for each numpy scalar type (★★☆) +`hint: np.iinfo, np.finfo, eps` + +```python +for dtype in [np.int8, np.int32, np.int64]: + print(np.iinfo(dtype).min) + print(np.iinfo(dtype).max) +for dtype in [np.float32, np.float64]: + print(np.finfo(dtype).min) + print(np.finfo(dtype).max) + print(np.finfo(dtype).eps) +``` +#### 49. How to print all the values of an array? (★★☆) +`hint: np.set_printoptions` + +```python +import sys +np.set_printoptions(threshold=sys.maxsize) +Z = np.zeros((16,16)) +print(Z) +``` +#### 50. How to find the closest value (to a given scalar) in a vector? (★★☆) +`hint: argmin` + +```python +Z = np.arange(100) +v = np.random.uniform(0,100) +index = (np.abs(Z-v)).argmin() +print(Z[index]) +``` +#### 51. Create a structured array representing a position (x,y) and a color (r,g,b) (★★☆) +`hint: dtype` + +```python +Z = np.zeros(10, [ ('position', [ ('x', float, 1), + ('y', float, 1)]), + ('color', [ ('r', float, 1), + ('g', float, 1), + ('b', float, 1)])]) +print(Z) +``` +#### 52. Consider a random vector with shape (100,2) representing coordinates, find point by point distances (★★☆) +`hint: np.atleast_2d, T, np.sqrt` + +```python +Z = np.random.random((10,2)) +X,Y = np.atleast_2d(Z[:,0], Z[:,1]) +D = np.sqrt( (X-X.T)**2 + (Y-Y.T)**2) +print(D) + +# Much faster with scipy +import scipy +# Thanks Gavin Heverly-Coulson (#issue 1) +import scipy.spatial + +Z = np.random.random((10,2)) +D = scipy.spatial.distance.cdist(Z,Z) +print(D) +``` +#### 53. How to convert a float (32 bits) array into an integer (32 bits) in place? +`hint: astype(copy=False)` + +```python +Z = np.arange(10, dtype=np.float32) +Z = Z.astype(np.int32, copy=False) +print(Z) +``` +#### 54. How to read the following file? (★★☆) +``` +1, 2, 3, 4, 5 +6, , , 7, 8 + , , 9,10,11 +``` +`hint: np.genfromtxt` + +```python +from io import StringIO + +# Fake file +s = StringIO('''1, 2, 3, 4, 5 + + 6, , , 7, 8 + + , , 9,10,11 +''') +Z = np.genfromtxt(s, delimiter=",", dtype=np.int) +print(Z) +``` +#### 55. What is the equivalent of enumerate for numpy arrays? (★★☆) +`hint: np.ndenumerate, np.ndindex` + +```python +Z = np.arange(9).reshape(3,3) +for index, value in np.ndenumerate(Z): + print(index, value) +for index in np.ndindex(Z.shape): + print(index, Z[index]) +``` +#### 56. Generate a generic 2D Gaussian-like array (★★☆) +`hint: np.meshgrid, np.exp` + +```python +X, Y = np.meshgrid(np.linspace(-1,1,10), np.linspace(-1,1,10)) +D = np.sqrt(X*X+Y*Y) +sigma, mu = 1.0, 0.0 +G = np.exp(-( (D-mu)**2 / ( 2.0 * sigma**2 ) ) ) +print(G) +``` +#### 57. How to randomly place p elements in a 2D array? (★★☆) +`hint: np.put, np.random.choice` + +```python +# Author: Divakar + +n = 10 +p = 3 +Z = np.zeros((n,n)) +np.put(Z, np.random.choice(range(n*n), p, replace=False),1) +print(Z) +``` +#### 58. Subtract the mean of each row of a matrix (★★☆) +`hint: mean(axis=,keepdims=)` + +```python +# Author: Warren Weckesser + +X = np.random.rand(5, 10) + +# Recent versions of numpy +Y = X - X.mean(axis=1, keepdims=True) + +# Older versions of numpy +Y = X - X.mean(axis=1).reshape(-1, 1) + +print(Y) +``` +#### 59. How to sort an array by the nth column? (★★☆) +`hint: argsort` + +```python +# Author: Steve Tjoa + +Z = np.random.randint(0,10,(3,3)) +print(Z) +print(Z[Z[:,1].argsort()]) +``` +#### 60. How to tell if a given 2D array has null columns? (★★☆) +`hint: any, ~` + +```python +# Author: Warren Weckesser + +Z = np.random.randint(0,3,(3,10)) +print((~Z.any(axis=0)).any()) +``` +#### 61. Find the nearest value from a given value in an array (★★☆) +`hint: np.abs, argmin, flat` + +```python +Z = np.random.uniform(0,1,10) +z = 0.5 +m = Z.flat[np.abs(Z - z).argmin()] +print(m) +``` +#### 62. Considering two arrays with shape (1,3) and (3,1), how to compute their sum using an iterator? (★★☆) +`hint: np.nditer` + +```python +A = np.arange(3).reshape(3,1) +B = np.arange(3).reshape(1,3) +it = np.nditer([A,B,None]) +for x,y,z in it: z[...] = x + y +print(it.operands[2]) +``` +#### 63. Create an array class that has a name attribute (★★☆) +`hint: class method` + +```python +class NamedArray(np.ndarray): + def __new__(cls, array, name="no name"): + obj = np.asarray(array).view(cls) + obj.name = name + return obj + def __array_finalize__(self, obj): + if obj is None: return + self.info = getattr(obj, 'name', "no name") + +Z = NamedArray(np.arange(10), "range_10") +print (Z.name) +``` +#### 64. Consider a given vector, how to add 1 to each element indexed by a second vector (be careful with repeated indices)? (★★★) +`hint: np.bincount | np.add.at` + +```python +# Author: Brett Olsen + +Z = np.ones(10) +I = np.random.randint(0,len(Z),20) +Z += np.bincount(I, minlength=len(Z)) +print(Z) + +# Another solution +# Author: Bartosz Telenczuk +np.add.at(Z, I, 1) +print(Z) +``` +#### 65. How to accumulate elements of a vector (X) to an array (F) based on an index list (I)? (★★★) +`hint: np.bincount` + +```python +# Author: Alan G Isaac + +X = [1,2,3,4,5,6] +I = [1,3,9,3,4,1] +F = np.bincount(I,X) +print(F) +``` +#### 66. Considering a (w,h,3) image of (dtype=ubyte), compute the number of unique colors (★★★) +`hint: np.unique` + +```python +# Author: Nadav Horesh + +w,h = 16,16 +I = np.random.randint(0,2,(h,w,3)).astype(np.ubyte) +F = I[...,0]*256*256 + I[...,1]*256 +I[...,2] +n = len(np.unique(F)) +print(np.unique(I)) +``` +#### 67. Considering a four dimensions array, how to get sum over the last two axis at once? (★★★) +`hint: sum(axis=(-2,-1))` + +```python +A = np.random.randint(0,10,(3,4,3,4)) +# solution by passing a tuple of axes (introduced in numpy 1.7.0) +sum = A.sum(axis=(-2,-1)) +print(sum) +# solution by flattening the last two dimensions into one +# (useful for functions that don't accept tuples for axis argument) +sum = A.reshape(A.shape[:-2] + (-1,)).sum(axis=-1) +print(sum) +``` +#### 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? (★★★) +`hint: np.bincount` + +```python +# Author: Jaime Fernández del Río + +D = np.random.uniform(0,1,100) +S = np.random.randint(0,10,100) +D_sums = np.bincount(S, weights=D) +D_counts = np.bincount(S) +D_means = D_sums / D_counts +print(D_means) + +# Pandas solution as a reference due to more intuitive code +import pandas as pd +print(pd.Series(D).groupby(S).mean()) +``` +#### 69. How to get the diagonal of a dot product? (★★★) +`hint: np.diag` + +```python +# Author: Mathieu Blondel + +A = np.random.uniform(0,1,(5,5)) +B = np.random.uniform(0,1,(5,5)) + +# Slow version +np.diag(np.dot(A, B)) + +# Fast version +np.sum(A * B.T, axis=1) + +# Faster version +np.einsum("ij,ji->i", A, B) +``` +#### 70. Consider the vector [1, 2, 3, 4, 5], how to build a new vector with 3 consecutive zeros interleaved between each value? (★★★) +`hint: array[::4]` + +```python +# Author: Warren Weckesser + +Z = np.array([1,2,3,4,5]) +nz = 3 +Z0 = np.zeros(len(Z) + (len(Z)-1)*(nz)) +Z0[::nz+1] = Z +print(Z0) +``` +#### 71. Consider an array of dimension (5,5,3), how to mulitply it by an array with dimensions (5,5)? (★★★) +`hint: array[:, :, None]` + +```python +A = np.ones((5,5,3)) +B = 2*np.ones((5,5)) +print(A * B[:,:,None]) +``` +#### 72. How to swap two rows of an array? (★★★) +`hint: array[[]] = array[[]]` + +```python +# Author: Eelco Hoogendoorn + +A = np.arange(25).reshape(5,5) +A[[0,1]] = A[[1,0]] +print(A) +``` +#### 73. Consider a set of 10 triplets describing 10 triangles (with shared vertices), find the set of unique line segments composing all the triangles (★★★) +`hint: repeat, np.roll, np.sort, view, np.unique` + +```python +# Author: Nicolas P. Rougier + +faces = np.random.randint(0,100,(10,3)) +F = np.roll(faces.repeat(2,axis=1),-1,axis=1) +F = F.reshape(len(F)*3,2) +F = np.sort(F,axis=1) +G = F.view( dtype=[('p0',F.dtype),('p1',F.dtype)] ) +G = np.unique(G) +print(G) +``` +#### 74. Given an array C that is a bincount, how to produce an array A such that np.bincount(A) == C? (★★★) +`hint: np.repeat` + +```python +# Author: Jaime Fernández del Río + +C = np.bincount([1,1,2,3,4,4,6]) +A = np.repeat(np.arange(len(C)), C) +print(A) +``` +#### 75. How to compute averages using a sliding window over an array? (★★★) +`hint: np.cumsum` + +```python +# Author: Jaime Fernández del Río + +def moving_average(a, n=3) : + ret = np.cumsum(a, dtype=float) + ret[n:] = ret[n:] - ret[:-n] + return ret[n - 1:] / n +Z = np.arange(20) +print(moving_average(Z, n=3)) +``` +#### 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]) (★★★) +`hint: from numpy.lib import stride_tricks` + +```python +# Author: Joe Kington / Erik Rigtorp +from numpy.lib import stride_tricks + +def rolling(a, window): + shape = (a.size - window + 1, window) + strides = (a.itemsize, a.itemsize) + return stride_tricks.as_strided(a, shape=shape, strides=strides) +Z = rolling(np.arange(10), 3) +print(Z) +``` +#### 77. How to negate a boolean, or to change the sign of a float inplace? (★★★) +`hint: np.logical_not, np.negative` + +```python +# Author: Nathaniel J. Smith + +Z = np.random.randint(0,2,100) +np.logical_not(Z, out=Z) + +Z = np.random.uniform(-1.0,1.0,100) +np.negative(Z, out=Z) +``` +#### 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])? (★★★) +`No hints provided...` + +```python +def distance(P0, P1, p): + T = P1 - P0 + L = (T**2).sum(axis=1) + U = -((P0[:,0]-p[...,0])*T[:,0] + (P0[:,1]-p[...,1])*T[:,1]) / L + U = U.reshape(len(U),1) + D = P0 + U*T - p + return np.sqrt((D**2).sum(axis=1)) + +P0 = np.random.uniform(-10,10,(10,2)) +P1 = np.random.uniform(-10,10,(10,2)) +p = np.random.uniform(-10,10,( 1,2)) +print(distance(P0, P1, p)) +``` +#### 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])? (★★★) +`No hints provided...` + +```python +# Author: Italmassov Kuanysh + +# based on distance function from previous question +P0 = np.random.uniform(-10, 10, (10,2)) +P1 = np.random.uniform(-10,10,(10,2)) +p = np.random.uniform(-10, 10, (10,2)) +print(np.array([distance(P0,P1,p_i) for p_i in p])) +``` +#### 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) (★★★) +`hint: minimum maximum` + +```python +# Author: Nicolas Rougier + +Z = np.random.randint(0,10,(10,10)) +shape = (5,5) +fill = 0 +position = (1,1) + +R = np.ones(shape, dtype=Z.dtype)*fill +P = np.array(list(position)).astype(int) +Rs = np.array(list(R.shape)).astype(int) +Zs = np.array(list(Z.shape)).astype(int) + +R_start = np.zeros((len(shape),)).astype(int) +R_stop = np.array(list(shape)).astype(int) +Z_start = (P-Rs//2) +Z_stop = (P+Rs//2)+Rs%2 + +R_start = (R_start - np.minimum(Z_start,0)).tolist() +Z_start = (np.maximum(Z_start,0)).tolist() +R_stop = np.maximum(R_start, (R_stop - np.maximum(Z_stop-Zs,0))).tolist() +Z_stop = (np.minimum(Z_stop,Zs)).tolist() + +r = [slice(start,stop) for start,stop in zip(R_start,R_stop)] +z = [slice(start,stop) for start,stop in zip(Z_start,Z_stop)] +R[r] = Z[z] +print(Z) +print(R) +``` +#### 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]]? (★★★) +`hint: stride_tricks.as_strided` + +```python +# Author: Stefan van der Walt + +Z = np.arange(1,15,dtype=np.uint32) +R = stride_tricks.as_strided(Z,(11,4),(4,4)) +print(R) +``` +#### 82. Compute a matrix rank (★★★) +`hint: np.linalg.svd` + +```python +# Author: Stefan van der Walt + +Z = np.random.uniform(0,1,(10,10)) +U, S, V = np.linalg.svd(Z) # Singular Value Decomposition +rank = np.sum(S > 1e-10) +print(rank) +``` +#### 83. How to find the most frequent value in an array? +`hint: np.bincount, argmax` + +```python +Z = np.random.randint(0,10,50) +print(np.bincount(Z).argmax()) +``` +#### 84. Extract all the contiguous 3x3 blocks from a random 10x10 matrix (★★★) +`hint: stride_tricks.as_strided` + +```python +# Author: Chris Barker + +Z = np.random.randint(0,5,(10,10)) +n = 3 +i = 1 + (Z.shape[0]-3) +j = 1 + (Z.shape[1]-3) +C = stride_tricks.as_strided(Z, shape=(i, j, n, n), strides=Z.strides + Z.strides) +print(C) +``` +#### 85. Create a 2D array subclass such that Z[i,j] == Z[j,i] (★★★) +`hint: class method` + +```python +# Author: Eric O. Lebigot +# Note: only works for 2d array and value setting using indices + +class Symetric(np.ndarray): + def __setitem__(self, index, value): + i,j = index + super(Symetric, self).__setitem__((i,j), value) + super(Symetric, self).__setitem__((j,i), value) + +def symetric(Z): + return np.asarray(Z + Z.T - np.diag(Z.diagonal())).view(Symetric) + +S = symetric(np.random.randint(0,10,(5,5))) +S[2,3] = 42 +print(S) +``` +#### 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)) (★★★) +`hint: np.tensordot` + +```python +# Author: Stefan van der Walt + +p, n = 10, 20 +M = np.ones((p,n,n)) +V = np.ones((p,n,1)) +S = np.tensordot(M, V, axes=[[0, 2], [0, 1]]) +print(S) + +# It works, because: +# M is (p,n,n) +# V is (p,n,1) +# Thus, summing over the paired axes 0 and 0 (of M and V independently), +# and 2 and 1, to remain with a (n,1) vector. +``` +#### 87. Consider a 16x16 array, how to get the block-sum (block size is 4x4)? (★★★) +`hint: np.add.reduceat` + +```python +# Author: Robert Kern + +Z = np.ones((16,16)) +k = 4 +S = np.add.reduceat(np.add.reduceat(Z, np.arange(0, Z.shape[0], k), axis=0), + np.arange(0, Z.shape[1], k), axis=1) +print(S) +``` +#### 88. How to implement the Game of Life using numpy arrays? (★★★) +`No hints provided...` + +```python +# Author: Nicolas Rougier + +def iterate(Z): + # Count neighbours + N = (Z[0:-2,0:-2] + Z[0:-2,1:-1] + Z[0:-2,2:] + + Z[1:-1,0:-2] + Z[1:-1,2:] + + Z[2: ,0:-2] + Z[2: ,1:-1] + Z[2: ,2:]) + + # Apply rules + birth = (N==3) & (Z[1:-1,1:-1]==0) + survive = ((N==2) | (N==3)) & (Z[1:-1,1:-1]==1) + Z[...] = 0 + Z[1:-1,1:-1][birth | survive] = 1 + return Z + +Z = np.random.randint(0,2,(50,50)) +for i in range(100): Z = iterate(Z) +print(Z) +``` +#### 89. How to get the n largest values of an array (★★★) +`hint: np.argsort | np.argpartition` + +```python +Z = np.arange(10000) +np.random.shuffle(Z) +n = 5 + +# Slow +print (Z[np.argsort(Z)[-n:]]) + +# Fast +print (Z[np.argpartition(-Z,n)[:n]]) +``` +#### 90. Given an arbitrary number of vectors, build the cartesian product (every combinations of every item) (★★★) +`hint: np.indices` + +```python +# Author: Stefan Van der Walt + +def cartesian(arrays): + arrays = [np.asarray(a) for a in arrays] + shape = (len(x) for x in arrays) + + ix = np.indices(shape, dtype=int) + ix = ix.reshape(len(arrays), -1).T + + for n, arr in enumerate(arrays): + ix[:, n] = arrays[n][ix[:, n]] + + return ix + +print (cartesian(([1, 2, 3], [4, 5], [6, 7]))) +``` +#### 91. How to create a record array from a regular array? (★★★) +`hint: np.core.records.fromarrays` + +```python +Z = np.array([("Hello", 2.5, 3), + ("World", 3.6, 2)]) +R = np.core.records.fromarrays(Z.T, + names='col1, col2, col3', + formats = 'S8, f8, i8') +print(R) +``` +#### 92. Consider a large vector Z, compute Z to the power of 3 using 3 different methods (★★★) +`hint: np.power, *, np.einsum` + +```python +# Author: Ryan G. + +x = np.random.rand(int(5e7)) + +%timeit np.power(x,3) +%timeit x*x*x +%timeit np.einsum('i,i,i->i',x,x,x) +``` +#### 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? (★★★) +`hint: np.where` + +```python +# Author: Gabe Schwartz + +A = np.random.randint(0,5,(8,3)) +B = np.random.randint(0,5,(2,2)) + +C = (A[..., np.newaxis, np.newaxis] == B) +rows = np.where(C.any((3,1)).all(1))[0] +print(rows) +``` +#### 94. Considering a 10x3 matrix, extract rows with unequal values (e.g. [2,2,3]) (★★★) +`No hints provided...` + +```python +# Author: Robert Kern + +Z = np.random.randint(0,5,(10,3)) +print(Z) +# solution for arrays of all dtypes (including string arrays and record arrays) +E = np.all(Z[:,1:] == Z[:,:-1], axis=1) +U = Z[~E] +print(U) +# soluiton for numerical arrays only, will work for any number of columns in Z +U = Z[Z.max(axis=1) != Z.min(axis=1),:] +print(U) +``` +#### 95. Convert a vector of ints into a matrix binary representation (★★★) +`hint: np.unpackbits` + +```python +# Author: Warren Weckesser + +I = np.array([0, 1, 2, 3, 15, 16, 32, 64, 128]) +B = ((I.reshape(-1,1) & (2**np.arange(8))) != 0).astype(int) +print(B[:,::-1]) + +# Author: Daniel T. McDonald + +I = np.array([0, 1, 2, 3, 15, 16, 32, 64, 128], dtype=np.uint8) +print(np.unpackbits(I[:, np.newaxis], axis=1)) +``` +#### 96. Given a two dimensional array, how to extract unique rows? (★★★) +`hint: np.ascontiguousarray | np.unique` + +```python +# Author: Jaime Fernández del Río + +Z = np.random.randint(0,2,(6,3)) +T = np.ascontiguousarray(Z).view(np.dtype((np.void, Z.dtype.itemsize * Z.shape[1]))) +_, idx = np.unique(T, return_index=True) +uZ = Z[idx] +print(uZ) + +# Author: Andreas Kouzelis +# NumPy >= 1.13 +uZ = np.unique(Z, axis=0) +print(uZ) +``` +#### 97. Considering 2 vectors A & B, write the einsum equivalent of inner, outer, sum, and mul function (★★★) +`hint: np.einsum` + +```python +# Author: Alex Riley +# Make sure to read: http://ajcr.net/Basic-guide-to-einsum/ + +A = np.random.uniform(0,1,10) +B = np.random.uniform(0,1,10) + +np.einsum('i->', A) # np.sum(A) +np.einsum('i,i->i', A, B) # A * B +np.einsum('i,i', A, B) # np.inner(A, B) +np.einsum('i,j->ij', A, B) # np.outer(A, B) +``` +#### 98. Considering a path described by two vectors (X,Y), how to sample it using equidistant samples (★★★)? +`hint: np.cumsum, np.interp` + +```python +# Author: Bas Swinckels + +phi = np.arange(0, 10*np.pi, 0.1) +a = 1 +x = a*phi*np.cos(phi) +y = a*phi*np.sin(phi) + +dr = (np.diff(x)**2 + np.diff(y)**2)**.5 # segment lengths +r = np.zeros_like(x) +r[1:] = np.cumsum(dr) # integrate path +r_int = np.linspace(0, r.max(), 200) # regular spaced path +x_int = np.interp(r_int, r, x) # integrate path +y_int = np.interp(r_int, r, y) +``` +#### 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. (★★★) +`hint: np.logical_and.reduce, np.mod` + +```python +# Author: Evgeni Burovski + +X = np.asarray([[1.0, 0.0, 3.0, 8.0], + [2.0, 0.0, 1.0, 1.0], + [1.5, 2.5, 1.0, 0.0]]) +n = 4 +M = np.logical_and.reduce(np.mod(X, 1) == 0, axis=-1) +M &= (X.sum(axis=-1) == n) +print(X[M]) +``` +#### 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). (★★★) +`hint: np.percentile` + +```python +# Author: Jessica B. Hamrick + +X = np.random.randn(100) # random 1D array +N = 1000 # number of bootstrap samples +idx = np.random.randint(0, X.size, (N, X.size)) +means = X[idx].mean(axis=1) +confint = np.percentile(means, [2.5, 97.5]) +print(confint) +``` \ No newline at end of file diff --git a/100_Numpy_exercises_with_solutions.md b/100_Numpy_exercises_with_solutions.md new file mode 100644 index 00000000..4d742558 --- /dev/null +++ b/100_Numpy_exercises_with_solutions.md @@ -0,0 +1,1171 @@ + + + +# 100 numpy exercises + +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. + + +If you find an error or think you've a better way to solve some of them, feel +free to open an issue at . +File automatically generated. See the documentation to update questions/answers/hints programmatically. + +#### 1. Import the numpy package under the name `np` (★☆☆) + + +```python +import numpy as np +``` +#### 2. Print the numpy version and the configuration (★☆☆) + + +```python +print(np.__version__) +np.show_config() +``` +#### 3. Create a null vector of size 10 (★☆☆) + + +```python +Z = np.zeros(10) +print(Z) +``` +#### 4. How to find the memory size of any array (★☆☆) + + +```python +Z = np.zeros((10,10)) +print("%d bytes" % (Z.size * Z.itemsize)) +``` +#### 5. How to get the documentation of the numpy add function from the command line? (★☆☆) + + +```python +%run `python -c "import numpy; numpy.info(numpy.add)"` +``` +#### 6. Create a null vector of size 10 but the fifth value which is 1 (★☆☆) + + +```python +Z = np.zeros(10) +Z[4] = 1 +print(Z) +``` +#### 7. Create a vector with values ranging from 10 to 49 (★☆☆) + + +```python +Z = np.arange(10,50) +print(Z) +``` +#### 8. Reverse a vector (first element becomes last) (★☆☆) + + +```python +Z = np.arange(50) +Z = Z[::-1] +print(Z) +``` +#### 9. Create a 3x3 matrix with values ranging from 0 to 8 (★☆☆) + + +```python +nz = np.nonzero([1,2,0,0,4,0]) +print(nz) +``` +#### 10. Find indices of non-zero elements from [1,2,0,0,4,0] (★☆☆) + + +```python +nz = np.nonzero([1,2,0,0,4,0]) +print(nz) +``` +#### 11. Create a 3x3 identity matrix (★☆☆) + + +```python +Z = np.eye(3) +print(Z) +``` +#### 12. Create a 3x3x3 array with random values (★☆☆) + + +```python +Z = np.random.random((3,3,3)) +print(Z) +``` +#### 13. Create a 10x10 array with random values and find the minimum and maximum values (★☆☆) + + +```python +Z = np.random.random((10,10)) +Zmin, Zmax = Z.min(), Z.max() +print(Zmin, Zmax) +``` +#### 14. Create a random vector of size 30 and find the mean value (★☆☆) + + +```python +Z = np.random.random(30) +m = Z.mean() +print(m) +``` +#### 15. Create a 2d array with 1 on the border and 0 inside (★☆☆) + + +```python +Z = np.ones((10,10)) +Z[1:-1,1:-1] = 0 +print(Z) +``` +#### 16. How to add a border (filled with 0's) around an existing array? (★☆☆) + + +```python +Z = np.ones((5,5)) +Z = np.pad(Z, pad_width=1, mode='constant', constant_values=0) +print(Z) +``` +#### 17. What is the result of the following expression? (★☆☆) +```python +0 * np.nan +np.nan == np.nan +np.inf > np.nan +np.nan - np.nan +np.nan in set([np.nan]) +0.3 == 3 * 0.1 +``` + + +```python +print(0 * np.nan) +print(np.nan == np.nan) +print(np.inf > np.nan) +print(np.nan - np.nan) +print(np.nan in set([np.nan])) +print(0.3 == 3 * 0.1) +``` +#### 18. Create a 5x5 matrix with values 1,2,3,4 just below the diagonal (★☆☆) + + +```python +Z = np.diag(1+np.arange(4),k=-1) +print(Z) +``` +#### 19. Create a 8x8 matrix and fill it with a checkerboard pattern (★☆☆) + + +```python +Z = np.zeros((8,8),dtype=int) +Z[1::2,::2] = 1 +Z[::2,1::2] = 1 +print(Z) +``` +#### 20. Consider a (6,7,8) shape array, what is the index (x,y,z) of the 100th element? + + +```python +print(np.unravel_index(99,(6,7,8))) +``` +#### 21. Create a checkerboard 8x8 matrix using the tile function (★☆☆) + + +```python +Z = np.tile( np.array([[0,1],[1,0]]), (4,4)) +print(Z) +``` +#### 22. Normalize a 5x5 random matrix (★☆☆) + + +```python +Z = np.random.random((5,5)) +Z = (Z - np.mean (Z)) / (np.std (Z)) +print(Z) +``` +#### 23. Create a custom dtype that describes a color as four unsigned bytes (RGBA) (★☆☆) + + +```python +color = np.dtype([("r", np.ubyte, 1), + ("g", np.ubyte, 1), + ("b", np.ubyte, 1), + ("a", np.ubyte, 1)]) +``` +#### 24. Multiply a 5x3 matrix by a 3x2 matrix (real matrix product) (★☆☆) + + +```python +Z = np.dot(np.ones((5,3)), np.ones((3,2))) +print(Z) + +# Alternative solution, in Python 3.5 and above +Z = np.ones((5,3)) @ np.ones((3,2)) +print(Z) +``` +#### 25. Given a 1D array, negate all elements which are between 3 and 8, in place. (★☆☆) + + +```python +# Author: Evgeni Burovski + +Z = np.arange(11) +Z[(3 < Z) & (Z <= 8)] *= -1 +print(Z) +``` +#### 26. What is the output of the following script? (★☆☆) +```python +# Author: Jake VanderPlas + +print(sum(range(5),-1)) +from numpy import * +print(sum(range(5),-1)) +``` + + +```python +# Author: Jake VanderPlas + +print(sum(range(5),-1)) +from numpy import * +print(sum(range(5),-1)) +``` +#### 27. Consider an integer vector Z, which of these expressions are legal? (★☆☆) +```python +Z**Z +2 << Z >> 2 +Z <- Z +1j*Z +Z/1/1 +ZZ +``` + + +```python +Z**Z +2 << Z >> 2 +Z <- Z +1j*Z +Z/1/1 +ZZ +``` +#### 28. What are the result of the following expressions? +```python +np.array(0) / np.array(0) +np.array(0) // np.array(0) +np.array([np.nan]).astype(int).astype(float) +``` + + +```python +print(np.array(0) / np.array(0)) +print(np.array(0) // np.array(0)) +print(np.array([np.nan]).astype(int).astype(float)) +``` +#### 29. How to round away from zero a float array ? (★☆☆) + + +```python +# Author: Charles R Harris + +Z = np.random.uniform(-10,+10,10) +print (np.copysign(np.ceil(np.abs(Z)), Z)) +``` +#### 30. How to find common values between two arrays? (★☆☆) + + +```python +Z1 = np.random.randint(0,10,10) +Z2 = np.random.randint(0,10,10) +print(np.intersect1d(Z1,Z2)) +``` +#### 31. How to ignore all numpy warnings (not recommended)? (★☆☆) + + +```python +# Suicide mode on +defaults = np.seterr(all="ignore") +Z = np.ones(1) / 0 + +# Back to sanity +_ = np.seterr(**defaults) + +# Equivalently with a context manager +nz = np.nonzero([1,2,0,0,4,0]) +print(nz) +``` +#### 32. Is the following expressions true? (★☆☆) +```python +np.sqrt(-1) == np.emath.sqrt(-1) +``` + + +```python +np.sqrt(-1) == np.emath.sqrt(-1) +``` +#### 33. How to get the dates of yesterday, today and tomorrow? (★☆☆) + + +```python +yesterday = np.datetime64('today', 'D') - np.timedelta64(1, 'D') +today = np.datetime64('today', 'D') +tomorrow = np.datetime64('today', 'D') + np.timedelta64(1, 'D') +``` +#### 34. How to get all the dates corresponding to the month of July 2016? (★★☆) + + +```python +Z = np.arange('2016-07', '2016-08', dtype='datetime64[D]') +print(Z) +``` +#### 35. How to compute ((A+B)*(-A/2)) in place (without copy)? (★★☆) + + +```python +A = np.ones(3)*1 +B = np.ones(3)*2 +C = np.ones(3)*3 +np.add(A,B,out=B) +np.divide(A,2,out=A) +np.negative(A,out=A) +np.multiply(A,B,out=A) +``` +#### 36. Extract the integer part of a random array of positive numbers using 4 different methods (★★☆) + + +```python +Z = np.random.uniform(0,10,10) + +print (Z - Z%1) +print (np.floor(Z)) +print (Z.astype(int)) +print (np.trunc(Z)) +``` +#### 37. Create a 5x5 matrix with row values ranging from 0 to 4 (★★☆) + + +```python +Z = np.zeros((5,5)) +Z += np.arange(5) +print(Z) +``` +#### 38. Consider a generator function that generates 10 integers and use it to build an array (★☆☆) + + +```python +def generate(): + for x in range(10): + yield x +Z = np.fromiter(generate(),dtype=float,count=-1) +print(Z) +``` +#### 39. Create a vector of size 10 with values ranging from 0 to 1, both excluded (★★☆) + + +```python +Z = np.linspace(0,1,11,endpoint=False)[1:] +print(Z) +``` +#### 40. Create a random vector of size 10 and sort it (★★☆) + + +```python +Z = np.random.random(10) +Z.sort() +print(Z) +``` +#### 41. How to sum a small array faster than np.sum? (★★☆) + + +```python +# Author: Evgeni Burovski + +Z = np.arange(10) +np.add.reduce(Z) +``` +#### 42. Consider two random array A and B, check if they are equal (★★☆) + + +```python +A = np.random.randint(0,2,5) +B = np.random.randint(0,2,5) + +# Assuming identical shape of the arrays and a tolerance for the comparison of values +equal = np.allclose(A,B) +print(equal) + +# Checking both the shape and the element values, no tolerance (values have to be exactly equal) +equal = np.array_equal(A,B) +print(equal) +``` +#### 43. Make an array immutable (read-only) (★★☆) + + +```python +Z = np.zeros(10) +Z.flags.writeable = False +Z[0] = 1 +``` +#### 44. Consider a random 10x2 matrix representing cartesian coordinates, convert them to polar coordinates (★★☆) + + +```python +Z = np.random.random((10,2)) +X,Y = Z[:,0], Z[:,1] +R = np.sqrt(X**2+Y**2) +T = np.arctan2(Y,X) +print(R) +print(T) +``` +#### 45. Create random vector of size 10 and replace the maximum value by 0 (★★☆) + + +```python +Z = np.random.random(10) +Z[Z.argmax()] = 0 +print(Z) +``` +#### 46. Create a structured array with `x` and `y` coordinates covering the [0,1]x[0,1] area (★★☆) + + +```python +Z = np.zeros((5,5), [('x',float),('y',float)]) +Z['x'], Z['y'] = np.meshgrid(np.linspace(0,1,5), + np.linspace(0,1,5)) +print(Z) +``` +#### 47. Given two arrays, X and Y, construct the Cauchy matrix C (Cij =1/(xi - yj)) + + +```python +# Author: Evgeni Burovski + +X = np.arange(8) +Y = X + 0.5 +C = 1.0 / np.subtract.outer(X, Y) +print(np.linalg.det(C)) +``` +#### 48. Print the minimum and maximum representable value for each numpy scalar type (★★☆) + + +```python +for dtype in [np.int8, np.int32, np.int64]: + print(np.iinfo(dtype).min) + print(np.iinfo(dtype).max) +for dtype in [np.float32, np.float64]: + print(np.finfo(dtype).min) + print(np.finfo(dtype).max) + print(np.finfo(dtype).eps) +``` +#### 49. How to print all the values of an array? (★★☆) + + +```python +import sys +np.set_printoptions(threshold=sys.maxsize) +Z = np.zeros((16,16)) +print(Z) +``` +#### 50. How to find the closest value (to a given scalar) in a vector? (★★☆) + + +```python +Z = np.arange(100) +v = np.random.uniform(0,100) +index = (np.abs(Z-v)).argmin() +print(Z[index]) +``` +#### 51. Create a structured array representing a position (x,y) and a color (r,g,b) (★★☆) + + +```python +Z = np.zeros(10, [ ('position', [ ('x', float, 1), + ('y', float, 1)]), + ('color', [ ('r', float, 1), + ('g', float, 1), + ('b', float, 1)])]) +print(Z) +``` +#### 52. Consider a random vector with shape (100,2) representing coordinates, find point by point distances (★★☆) + + +```python +Z = np.random.random((10,2)) +X,Y = np.atleast_2d(Z[:,0], Z[:,1]) +D = np.sqrt( (X-X.T)**2 + (Y-Y.T)**2) +print(D) + +# Much faster with scipy +import scipy +# Thanks Gavin Heverly-Coulson (#issue 1) +import scipy.spatial + +Z = np.random.random((10,2)) +D = scipy.spatial.distance.cdist(Z,Z) +print(D) +``` +#### 53. How to convert a float (32 bits) array into an integer (32 bits) in place? + + +```python +Z = np.arange(10, dtype=np.float32) +Z = Z.astype(np.int32, copy=False) +print(Z) +``` +#### 54. How to read the following file? (★★☆) +``` +1, 2, 3, 4, 5 +6, , , 7, 8 + , , 9,10,11 +``` + + +```python +from io import StringIO + +# Fake file +s = StringIO('''1, 2, 3, 4, 5 + + 6, , , 7, 8 + + , , 9,10,11 +''') +Z = np.genfromtxt(s, delimiter=",", dtype=np.int) +print(Z) +``` +#### 55. What is the equivalent of enumerate for numpy arrays? (★★☆) + + +```python +Z = np.arange(9).reshape(3,3) +for index, value in np.ndenumerate(Z): + print(index, value) +for index in np.ndindex(Z.shape): + print(index, Z[index]) +``` +#### 56. Generate a generic 2D Gaussian-like array (★★☆) + + +```python +X, Y = np.meshgrid(np.linspace(-1,1,10), np.linspace(-1,1,10)) +D = np.sqrt(X*X+Y*Y) +sigma, mu = 1.0, 0.0 +G = np.exp(-( (D-mu)**2 / ( 2.0 * sigma**2 ) ) ) +print(G) +``` +#### 57. How to randomly place p elements in a 2D array? (★★☆) + + +```python +# Author: Divakar + +n = 10 +p = 3 +Z = np.zeros((n,n)) +np.put(Z, np.random.choice(range(n*n), p, replace=False),1) +print(Z) +``` +#### 58. Subtract the mean of each row of a matrix (★★☆) + + +```python +# Author: Warren Weckesser + +X = np.random.rand(5, 10) + +# Recent versions of numpy +Y = X - X.mean(axis=1, keepdims=True) + +# Older versions of numpy +Y = X - X.mean(axis=1).reshape(-1, 1) + +print(Y) +``` +#### 59. How to sort an array by the nth column? (★★☆) + + +```python +# Author: Steve Tjoa + +Z = np.random.randint(0,10,(3,3)) +print(Z) +print(Z[Z[:,1].argsort()]) +``` +#### 60. How to tell if a given 2D array has null columns? (★★☆) + + +```python +# Author: Warren Weckesser + +Z = np.random.randint(0,3,(3,10)) +print((~Z.any(axis=0)).any()) +``` +#### 61. Find the nearest value from a given value in an array (★★☆) + + +```python +Z = np.random.uniform(0,1,10) +z = 0.5 +m = Z.flat[np.abs(Z - z).argmin()] +print(m) +``` +#### 62. Considering two arrays with shape (1,3) and (3,1), how to compute their sum using an iterator? (★★☆) + + +```python +A = np.arange(3).reshape(3,1) +B = np.arange(3).reshape(1,3) +it = np.nditer([A,B,None]) +for x,y,z in it: z[...] = x + y +print(it.operands[2]) +``` +#### 63. Create an array class that has a name attribute (★★☆) + + +```python +class NamedArray(np.ndarray): + def __new__(cls, array, name="no name"): + obj = np.asarray(array).view(cls) + obj.name = name + return obj + def __array_finalize__(self, obj): + if obj is None: return + self.info = getattr(obj, 'name', "no name") + +Z = NamedArray(np.arange(10), "range_10") +print (Z.name) +``` +#### 64. Consider a given vector, how to add 1 to each element indexed by a second vector (be careful with repeated indices)? (★★★) + + +```python +# Author: Brett Olsen + +Z = np.ones(10) +I = np.random.randint(0,len(Z),20) +Z += np.bincount(I, minlength=len(Z)) +print(Z) + +# Another solution +# Author: Bartosz Telenczuk +np.add.at(Z, I, 1) +print(Z) +``` +#### 65. How to accumulate elements of a vector (X) to an array (F) based on an index list (I)? (★★★) + + +```python +# Author: Alan G Isaac + +X = [1,2,3,4,5,6] +I = [1,3,9,3,4,1] +F = np.bincount(I,X) +print(F) +``` +#### 66. Considering a (w,h,3) image of (dtype=ubyte), compute the number of unique colors (★★★) + + +```python +# Author: Nadav Horesh + +w,h = 16,16 +I = np.random.randint(0,2,(h,w,3)).astype(np.ubyte) +F = I[...,0]*256*256 + I[...,1]*256 +I[...,2] +n = len(np.unique(F)) +print(np.unique(I)) +``` +#### 67. Considering a four dimensions array, how to get sum over the last two axis at once? (★★★) + + +```python +A = np.random.randint(0,10,(3,4,3,4)) +# solution by passing a tuple of axes (introduced in numpy 1.7.0) +sum = A.sum(axis=(-2,-1)) +print(sum) +# solution by flattening the last two dimensions into one +# (useful for functions that don't accept tuples for axis argument) +sum = A.reshape(A.shape[:-2] + (-1,)).sum(axis=-1) +print(sum) +``` +#### 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? (★★★) + + +```python +# Author: Jaime Fernández del Río + +D = np.random.uniform(0,1,100) +S = np.random.randint(0,10,100) +D_sums = np.bincount(S, weights=D) +D_counts = np.bincount(S) +D_means = D_sums / D_counts +print(D_means) + +# Pandas solution as a reference due to more intuitive code +import pandas as pd +print(pd.Series(D).groupby(S).mean()) +``` +#### 69. How to get the diagonal of a dot product? (★★★) + + +```python +# Author: Mathieu Blondel + +A = np.random.uniform(0,1,(5,5)) +B = np.random.uniform(0,1,(5,5)) + +# Slow version +np.diag(np.dot(A, B)) + +# Fast version +np.sum(A * B.T, axis=1) + +# Faster version +np.einsum("ij,ji->i", A, B) +``` +#### 70. Consider the vector [1, 2, 3, 4, 5], how to build a new vector with 3 consecutive zeros interleaved between each value? (★★★) + + +```python +# Author: Warren Weckesser + +Z = np.array([1,2,3,4,5]) +nz = 3 +Z0 = np.zeros(len(Z) + (len(Z)-1)*(nz)) +Z0[::nz+1] = Z +print(Z0) +``` +#### 71. Consider an array of dimension (5,5,3), how to mulitply it by an array with dimensions (5,5)? (★★★) + + +```python +A = np.ones((5,5,3)) +B = 2*np.ones((5,5)) +print(A * B[:,:,None]) +``` +#### 72. How to swap two rows of an array? (★★★) + + +```python +# Author: Eelco Hoogendoorn + +A = np.arange(25).reshape(5,5) +A[[0,1]] = A[[1,0]] +print(A) +``` +#### 73. Consider a set of 10 triplets describing 10 triangles (with shared vertices), find the set of unique line segments composing all the triangles (★★★) + + +```python +# Author: Nicolas P. Rougier + +faces = np.random.randint(0,100,(10,3)) +F = np.roll(faces.repeat(2,axis=1),-1,axis=1) +F = F.reshape(len(F)*3,2) +F = np.sort(F,axis=1) +G = F.view( dtype=[('p0',F.dtype),('p1',F.dtype)] ) +G = np.unique(G) +print(G) +``` +#### 74. Given an array C that is a bincount, how to produce an array A such that np.bincount(A) == C? (★★★) + + +```python +# Author: Jaime Fernández del Río + +C = np.bincount([1,1,2,3,4,4,6]) +A = np.repeat(np.arange(len(C)), C) +print(A) +``` +#### 75. How to compute averages using a sliding window over an array? (★★★) + + +```python +# Author: Jaime Fernández del Río + +def moving_average(a, n=3) : + ret = np.cumsum(a, dtype=float) + ret[n:] = ret[n:] - ret[:-n] + return ret[n - 1:] / n +Z = np.arange(20) +print(moving_average(Z, n=3)) +``` +#### 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]) (★★★) + + +```python +# Author: Joe Kington / Erik Rigtorp +from numpy.lib import stride_tricks + +def rolling(a, window): + shape = (a.size - window + 1, window) + strides = (a.itemsize, a.itemsize) + return stride_tricks.as_strided(a, shape=shape, strides=strides) +Z = rolling(np.arange(10), 3) +print(Z) +``` +#### 77. How to negate a boolean, or to change the sign of a float inplace? (★★★) + + +```python +# Author: Nathaniel J. Smith + +Z = np.random.randint(0,2,100) +np.logical_not(Z, out=Z) + +Z = np.random.uniform(-1.0,1.0,100) +np.negative(Z, out=Z) +``` +#### 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])? (★★★) + + +```python +def distance(P0, P1, p): + T = P1 - P0 + L = (T**2).sum(axis=1) + U = -((P0[:,0]-p[...,0])*T[:,0] + (P0[:,1]-p[...,1])*T[:,1]) / L + U = U.reshape(len(U),1) + D = P0 + U*T - p + return np.sqrt((D**2).sum(axis=1)) + +P0 = np.random.uniform(-10,10,(10,2)) +P1 = np.random.uniform(-10,10,(10,2)) +p = np.random.uniform(-10,10,( 1,2)) +print(distance(P0, P1, p)) +``` +#### 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])? (★★★) + + +```python +# Author: Italmassov Kuanysh + +# based on distance function from previous question +P0 = np.random.uniform(-10, 10, (10,2)) +P1 = np.random.uniform(-10,10,(10,2)) +p = np.random.uniform(-10, 10, (10,2)) +print(np.array([distance(P0,P1,p_i) for p_i in p])) +``` +#### 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) (★★★) + + +```python +# Author: Nicolas Rougier + +Z = np.random.randint(0,10,(10,10)) +shape = (5,5) +fill = 0 +position = (1,1) + +R = np.ones(shape, dtype=Z.dtype)*fill +P = np.array(list(position)).astype(int) +Rs = np.array(list(R.shape)).astype(int) +Zs = np.array(list(Z.shape)).astype(int) + +R_start = np.zeros((len(shape),)).astype(int) +R_stop = np.array(list(shape)).astype(int) +Z_start = (P-Rs//2) +Z_stop = (P+Rs//2)+Rs%2 + +R_start = (R_start - np.minimum(Z_start,0)).tolist() +Z_start = (np.maximum(Z_start,0)).tolist() +R_stop = np.maximum(R_start, (R_stop - np.maximum(Z_stop-Zs,0))).tolist() +Z_stop = (np.minimum(Z_stop,Zs)).tolist() + +r = [slice(start,stop) for start,stop in zip(R_start,R_stop)] +z = [slice(start,stop) for start,stop in zip(Z_start,Z_stop)] +R[r] = Z[z] +print(Z) +print(R) +``` +#### 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]]? (★★★) + + +```python +# Author: Stefan van der Walt + +Z = np.arange(1,15,dtype=np.uint32) +R = stride_tricks.as_strided(Z,(11,4),(4,4)) +print(R) +``` +#### 82. Compute a matrix rank (★★★) + + +```python +# Author: Stefan van der Walt + +Z = np.random.uniform(0,1,(10,10)) +U, S, V = np.linalg.svd(Z) # Singular Value Decomposition +rank = np.sum(S > 1e-10) +print(rank) +``` +#### 83. How to find the most frequent value in an array? + + +```python +Z = np.random.randint(0,10,50) +print(np.bincount(Z).argmax()) +``` +#### 84. Extract all the contiguous 3x3 blocks from a random 10x10 matrix (★★★) + + +```python +# Author: Chris Barker + +Z = np.random.randint(0,5,(10,10)) +n = 3 +i = 1 + (Z.shape[0]-3) +j = 1 + (Z.shape[1]-3) +C = stride_tricks.as_strided(Z, shape=(i, j, n, n), strides=Z.strides + Z.strides) +print(C) +``` +#### 85. Create a 2D array subclass such that Z[i,j] == Z[j,i] (★★★) + + +```python +# Author: Eric O. Lebigot +# Note: only works for 2d array and value setting using indices + +class Symetric(np.ndarray): + def __setitem__(self, index, value): + i,j = index + super(Symetric, self).__setitem__((i,j), value) + super(Symetric, self).__setitem__((j,i), value) + +def symetric(Z): + return np.asarray(Z + Z.T - np.diag(Z.diagonal())).view(Symetric) + +S = symetric(np.random.randint(0,10,(5,5))) +S[2,3] = 42 +print(S) +``` +#### 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)) (★★★) + + +```python +# Author: Stefan van der Walt + +p, n = 10, 20 +M = np.ones((p,n,n)) +V = np.ones((p,n,1)) +S = np.tensordot(M, V, axes=[[0, 2], [0, 1]]) +print(S) + +# It works, because: +# M is (p,n,n) +# V is (p,n,1) +# Thus, summing over the paired axes 0 and 0 (of M and V independently), +# and 2 and 1, to remain with a (n,1) vector. +``` +#### 87. Consider a 16x16 array, how to get the block-sum (block size is 4x4)? (★★★) + + +```python +# Author: Robert Kern + +Z = np.ones((16,16)) +k = 4 +S = np.add.reduceat(np.add.reduceat(Z, np.arange(0, Z.shape[0], k), axis=0), + np.arange(0, Z.shape[1], k), axis=1) +print(S) +``` +#### 88. How to implement the Game of Life using numpy arrays? (★★★) + + +```python +# Author: Nicolas Rougier + +def iterate(Z): + # Count neighbours + N = (Z[0:-2,0:-2] + Z[0:-2,1:-1] + Z[0:-2,2:] + + Z[1:-1,0:-2] + Z[1:-1,2:] + + Z[2: ,0:-2] + Z[2: ,1:-1] + Z[2: ,2:]) + + # Apply rules + birth = (N==3) & (Z[1:-1,1:-1]==0) + survive = ((N==2) | (N==3)) & (Z[1:-1,1:-1]==1) + Z[...] = 0 + Z[1:-1,1:-1][birth | survive] = 1 + return Z + +Z = np.random.randint(0,2,(50,50)) +for i in range(100): Z = iterate(Z) +print(Z) +``` +#### 89. How to get the n largest values of an array (★★★) + + +```python +Z = np.arange(10000) +np.random.shuffle(Z) +n = 5 + +# Slow +print (Z[np.argsort(Z)[-n:]]) + +# Fast +print (Z[np.argpartition(-Z,n)[:n]]) +``` +#### 90. Given an arbitrary number of vectors, build the cartesian product (every combinations of every item) (★★★) + + +```python +# Author: Stefan Van der Walt + +def cartesian(arrays): + arrays = [np.asarray(a) for a in arrays] + shape = (len(x) for x in arrays) + + ix = np.indices(shape, dtype=int) + ix = ix.reshape(len(arrays), -1).T + + for n, arr in enumerate(arrays): + ix[:, n] = arrays[n][ix[:, n]] + + return ix + +print (cartesian(([1, 2, 3], [4, 5], [6, 7]))) +``` +#### 91. How to create a record array from a regular array? (★★★) + + +```python +Z = np.array([("Hello", 2.5, 3), + ("World", 3.6, 2)]) +R = np.core.records.fromarrays(Z.T, + names='col1, col2, col3', + formats = 'S8, f8, i8') +print(R) +``` +#### 92. Consider a large vector Z, compute Z to the power of 3 using 3 different methods (★★★) + + +```python +# Author: Ryan G. + +x = np.random.rand(int(5e7)) + +%timeit np.power(x,3) +%timeit x*x*x +%timeit np.einsum('i,i,i->i',x,x,x) +``` +#### 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? (★★★) + + +```python +# Author: Gabe Schwartz + +A = np.random.randint(0,5,(8,3)) +B = np.random.randint(0,5,(2,2)) + +C = (A[..., np.newaxis, np.newaxis] == B) +rows = np.where(C.any((3,1)).all(1))[0] +print(rows) +``` +#### 94. Considering a 10x3 matrix, extract rows with unequal values (e.g. [2,2,3]) (★★★) + + +```python +# Author: Robert Kern + +Z = np.random.randint(0,5,(10,3)) +print(Z) +# solution for arrays of all dtypes (including string arrays and record arrays) +E = np.all(Z[:,1:] == Z[:,:-1], axis=1) +U = Z[~E] +print(U) +# soluiton for numerical arrays only, will work for any number of columns in Z +U = Z[Z.max(axis=1) != Z.min(axis=1),:] +print(U) +``` +#### 95. Convert a vector of ints into a matrix binary representation (★★★) + + +```python +# Author: Warren Weckesser + +I = np.array([0, 1, 2, 3, 15, 16, 32, 64, 128]) +B = ((I.reshape(-1,1) & (2**np.arange(8))) != 0).astype(int) +print(B[:,::-1]) + +# Author: Daniel T. McDonald + +I = np.array([0, 1, 2, 3, 15, 16, 32, 64, 128], dtype=np.uint8) +print(np.unpackbits(I[:, np.newaxis], axis=1)) +``` +#### 96. Given a two dimensional array, how to extract unique rows? (★★★) + + +```python +# Author: Jaime Fernández del Río + +Z = np.random.randint(0,2,(6,3)) +T = np.ascontiguousarray(Z).view(np.dtype((np.void, Z.dtype.itemsize * Z.shape[1]))) +_, idx = np.unique(T, return_index=True) +uZ = Z[idx] +print(uZ) + +# Author: Andreas Kouzelis +# NumPy >= 1.13 +uZ = np.unique(Z, axis=0) +print(uZ) +``` +#### 97. Considering 2 vectors A & B, write the einsum equivalent of inner, outer, sum, and mul function (★★★) + + +```python +# Author: Alex Riley +# Make sure to read: http://ajcr.net/Basic-guide-to-einsum/ + +A = np.random.uniform(0,1,10) +B = np.random.uniform(0,1,10) + +np.einsum('i->', A) # np.sum(A) +np.einsum('i,i->i', A, B) # A * B +np.einsum('i,i', A, B) # np.inner(A, B) +np.einsum('i,j->ij', A, B) # np.outer(A, B) +``` +#### 98. Considering a path described by two vectors (X,Y), how to sample it using equidistant samples (★★★)? + + +```python +# Author: Bas Swinckels + +phi = np.arange(0, 10*np.pi, 0.1) +a = 1 +x = a*phi*np.cos(phi) +y = a*phi*np.sin(phi) + +dr = (np.diff(x)**2 + np.diff(y)**2)**.5 # segment lengths +r = np.zeros_like(x) +r[1:] = np.cumsum(dr) # integrate path +r_int = np.linspace(0, r.max(), 200) # regular spaced path +x_int = np.interp(r_int, r, x) # integrate path +y_int = np.interp(r_int, r, y) +``` +#### 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. (★★★) + + +```python +# Author: Evgeni Burovski + +X = np.asarray([[1.0, 0.0, 3.0, 8.0], + [2.0, 0.0, 1.0, 1.0], + [1.5, 2.5, 1.0, 0.0]]) +n = 4 +M = np.logical_and.reduce(np.mod(X, 1) == 0, axis=-1) +M &= (X.sum(axis=-1) == n) +print(X[M]) +``` +#### 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). (★★★) + + +```python +# Author: Jessica B. Hamrick + +X = np.random.randn(100) # random 1D array +N = 1000 # number of bootstrap samples +idx = np.random.randint(0, X.size, (N, X.size)) +means = X[idx].mean(axis=1) +confint = np.percentile(means, [2.5, 97.5]) +print(confint) +``` \ No newline at end of file diff --git a/100_Numpy_random.ipynb b/100_Numpy_random.ipynb new file mode 100644 index 00000000..37dd57da --- /dev/null +++ b/100_Numpy_random.ipynb @@ -0,0 +1,55 @@ +{ + "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\n", + "and in the numpy documentation. The goal of this collection is to offer a quick reference for both old\n", + "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\n", + "free to open an issue at ." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "File automatically generated. See the documentation to update questions/answers/hints programmatically." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Run the `initialize.py` module, then call a random question with `pick()` an hint towards its solution with\n", + "`hint(n)` and the answer with `answer(n)`, where n is the number of the picked question." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "%run initialise.py" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "pick()" + ] + } + ], + "metadata": {}, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/README.md b/README.md index 28d33118..fb0f5407 100644 --- a/README.md +++ b/README.md @@ -7,5 +7,11 @@ This is a collection of numpy exercises from numpy mailing list, stack overflow, → [Test them on Binder](http://mybinder.org:/repo/rougier/numpy-100/notebooks/100_Numpy_exercises.ipynb) → [Read them on GitHub](100_Numpy_exercises.md) +Note: markdown and ipython notebook are created programmatically from the source data in `source/exercises.ktx`. +To modify the content of these files, please change the text in the source and run the `generators.py` module with a python +interpreter with the libraries under `requirements.txt` installed. + +The keyed text format (`ktx`) is a minimal human readable key-values to store text (markdown or others) indexed by keys. + This work is licensed under the MIT license. [![DOI](https://zenodo.org/badge/10173/rougier/numpy-100.svg)](https://zenodo.org/badge/latestdoi/10173/rougier/numpy-100) diff --git a/generators.py b/generators.py new file mode 100644 index 00000000..3553a741 --- /dev/null +++ b/generators.py @@ -0,0 +1,137 @@ +import os +import nbformat as nbf +import mdutils + + +def ktx_to_dict(input_file, keystarter='<'): + """ parsing keyed text to a python dictionary. """ + answer = dict() + + with open(input_file, 'r+', encoding='utf-8') as f: + lines = f.readlines() + + k, val = '', '' + for line in lines: + if line.startswith(keystarter): + k = line.replace(keystarter, '').strip() + val = '' + else: + val += line + + if k: + answer.update({k: val.strip()}) + + return answer + + +def dict_to_ktx(input_dict, output_file, keystarter='<'): + """ Store a python dictionary to a keyed text""" + with open(output_file, 'w+') as f: + for k, val in input_dict.items(): + f.write(f'{keystarter} {k}\n') + f.write(f'{val}\n\n') + + +HEADERS = ktx_to_dict(os.path.join('source', 'headers.ktx')) +QHA = ktx_to_dict(os.path.join('source', 'exercises100.ktx')) + + +def create_jupyter_notebook(destination_filename='100_Numpy_exercises.ipynb'): + """ Programmatically create jupyter notebook with the questions (and hints and solutions if required) + saved under source files """ + + # Create cells sequence + nb = nbf.v4.new_notebook() + + nb['cells'] = [] + + # - Add header: + nb['cells'].append(nbf.v4.new_markdown_cell(HEADERS["header"])) + nb['cells'].append(nbf.v4.new_markdown_cell(HEADERS["sub_header"])) + nb['cells'].append(nbf.v4.new_markdown_cell(HEADERS["jupyter_instruction"])) + + # - Add initialisation + nb['cells'].append(nbf.v4.new_code_cell('%run initialise.py')) + + # - Add questions and empty spaces for answers + for n in range(1, 101): + nb['cells'].append(nbf.v4.new_markdown_cell(f'#### {n}. ' + QHA[f'q{n}'])) + nb['cells'].append(nbf.v4.new_code_cell("")) + + # Delete file if one with the same name is found + if os.path.exists(destination_filename): + os.remove(destination_filename) + + # Write sequence to file + nbf.write(nb, destination_filename) + + +def create_jupyter_notebook_random_question(destination_filename='100_Numpy_random.ipynb'): + """ Programmatically create jupyter notebook with the questions (and hints and solutions if required) + saved under source files """ + + # Create cells sequence + nb = nbf.v4.new_notebook() + + nb['cells'] = [] + + # - Add header: + nb['cells'].append(nbf.v4.new_markdown_cell(HEADERS["header"])) + nb['cells'].append(nbf.v4.new_markdown_cell(HEADERS["sub_header"])) + nb['cells'].append(nbf.v4.new_markdown_cell(HEADERS["jupyter_instruction_rand"])) + + # - Add initialisation + nb['cells'].append(nbf.v4.new_code_cell('%run initialise.py')) + nb['cells'].append(nbf.v4.new_code_cell("pick()")) + + # Delete file if one with the same name is found + if os.path.exists(destination_filename): + os.remove(destination_filename) + + # Write sequence to file + nbf.write(nb, destination_filename) + + +def create_markdown(destination_filename='100_Numpy_exercises', with_hints=False, with_solutions=False): + # Create file name + if with_hints: + destination_filename += '_with_hints' + if with_solutions: + destination_filename += '_with_solutions' + + # Initialise file + mdfile = mdutils.MdUtils(file_name=destination_filename) + + # Add headers + mdfile.write(HEADERS["header"] + '\n') + mdfile.write(HEADERS["sub_header"] + '\n') + + # Add questions (and hint or answers if required) + for n in range(1, 101): + mdfile.new_header(title=f"{n}. {QHA[f'q{n}']}", level=4) + if with_hints: + mdfile.write(f"`{QHA[f'h{n}']}`") + if with_solutions: + mdfile.insert_code(QHA[f'a{n}'], language='python') + + # Delete file if one with the same name is found + if os.path.exists(destination_filename): + os.remove(destination_filename) + + # Write sequence to file + mdfile.create_md_file() + + +def create_rst(destination_filename, with_ints=False, with_answers=False): + # TODO: use rstdoc python library. + # also see possible integrations with https://github.com/rougier/numpy-100/pull/38 + pass + + +if __name__ == '__main__': + create_jupyter_notebook() + create_jupyter_notebook_random_question() + create_markdown() + create_markdown(with_hints=False, with_solutions=True) + create_markdown(with_hints=True, with_solutions=False) + create_markdown(with_hints=True, with_solutions=True) diff --git a/initialise.py b/initialise.py new file mode 100644 index 00000000..01ec48a7 --- /dev/null +++ b/initialise.py @@ -0,0 +1,20 @@ +import numpy as np + +import generators as ge + + +def question(n): + print(f'{n}. ' + ge.QHA[f'q{n}']) + + +def hint(n): + print(ge.QHA[f'h{n}']) + + +def answer(n): + print(ge.QHA[f'a{n}']) + + +def pick(): + n = np.random.randint(1, 100) + question(n) diff --git a/requirements.txt b/requirements.txt index 5da331cf..488a34ae 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,5 @@ -numpy -pandas +numpy==1.17.4 +pandas==0.25.3 +jupyter==1.0.0 +jupyterthemes==0.20.0 +mdutils==1.0.0 diff --git a/source/exercises100.ktx b/source/exercises100.ktx new file mode 100644 index 00000000..29c14510 --- /dev/null +++ b/source/exercises100.ktx @@ -0,0 +1,1457 @@ +< q1 +Import the numpy package under the name `np` (★☆☆) + +< h1 +hint: import … as + +< a1 +import numpy as np + +< q2 +Print the numpy version and the configuration (★☆☆) + +< h2 +hint: np.__version__, np.show_config) + +< a2 +print(np.__version__) +np.show_config() + +< q3 +Create a null vector of size 10 (★☆☆) + +< h3 +hint: np.zeros + +< a3 +Z = np.zeros(10) +print(Z) + +< q4 +How to find the memory size of any array (★☆☆) + +< h4 +hint: size, itemsize + +< a4 +Z = np.zeros((10,10)) +print("%d bytes" % (Z.size * Z.itemsize)) + +< q5 +How to get the documentation of the numpy add function from the command line? (★☆☆) + +< h5 +hint: np.info + +< a5 +%run `python -c "import numpy; numpy.info(numpy.add)"` + +< q6 +Create a null vector of size 10 but the fifth value which is 1 (★☆☆) + +< h6 +hint: array[4] + +< a6 +Z = np.zeros(10) +Z[4] = 1 +print(Z) + +< q7 +Create a vector with values ranging from 10 to 49 (★☆☆) + +< h7 +hint: arange + +< a7 +Z = np.arange(10,50) +print(Z) + +< q8 +Reverse a vector (first element becomes last) (★☆☆) + +< h8 +hint: array[::-1] + +< a8 +Z = np.arange(50) +Z = Z[::-1] +print(Z) + +< q9 +Create a 3x3 matrix with values ranging from 0 to 8 (★☆☆) + +< h9 +hint: reshape + +< a9 +nz = np.nonzero([1,2,0,0,4,0]) +print(nz) + +< q10 +Find indices of non-zero elements from [1,2,0,0,4,0] (★☆☆) + +< h10 +hint: np.nonzero + +< a10 +nz = np.nonzero([1,2,0,0,4,0]) +print(nz) + +< q11 +Create a 3x3 identity matrix (★☆☆) + +< h11 +hint: np.eye + +< a11 +Z = np.eye(3) +print(Z) + +< q12 +Create a 3x3x3 array with random values (★☆☆) + +< h12 +hint: np.random.random + +< a12 +Z = np.random.random((3,3,3)) +print(Z) + +< q13 +Create a 10x10 array with random values and find the minimum and maximum values (★☆☆) + +< h13 +hint: min, max + +< a13 +Z = np.random.random((10,10)) +Zmin, Zmax = Z.min(), Z.max() +print(Zmin, Zmax) + +< q14 +Create a random vector of size 30 and find the mean value (★☆☆) + +< h14 +hint: mean + +< a14 +Z = np.random.random(30) +m = Z.mean() +print(m) + +< q15 +Create a 2d array with 1 on the border and 0 inside (★☆☆) + +< h15 +hint: array[1:-1, 1:-1] + +< a15 +Z = np.ones((10,10)) +Z[1:-1,1:-1] = 0 +print(Z) + +< q16 +How to add a border (filled with 0's) around an existing array? (★☆☆) + +< h16 +hint: np.pad + +< a16 +Z = np.ones((5,5)) +Z = np.pad(Z, pad_width=1, mode='constant', constant_values=0) +print(Z) + +< q17 +What is the result of the following expression? (★☆☆) +```python +0 * np.nan +np.nan == np.nan +np.inf > np.nan +np.nan - np.nan +np.nan in set([np.nan]) +0.3 == 3 * 0.1 +``` + +< h17 +hint: NaN = not a number, inf = infinity + +< a17 +print(0 * np.nan) +print(np.nan == np.nan) +print(np.inf > np.nan) +print(np.nan - np.nan) +print(np.nan in set([np.nan])) +print(0.3 == 3 * 0.1) + +< q18 +Create a 5x5 matrix with values 1,2,3,4 just below the diagonal (★☆☆) + +< h18 +hint: np.diag + +< a18 +Z = np.diag(1+np.arange(4),k=-1) +print(Z) + +< q19 +Create a 8x8 matrix and fill it with a checkerboard pattern (★☆☆) + +< h19 +hint: array[::2] + +< a19 +Z = np.zeros((8,8),dtype=int) +Z[1::2,::2] = 1 +Z[::2,1::2] = 1 +print(Z) + +< q20 +Consider a (6,7,8) shape array, what is the index (x,y,z) of the 100th element? + +< h20 +hint: np.unravel_index + +< a20 +print(np.unravel_index(99,(6,7,8))) + +< q21 +Create a checkerboard 8x8 matrix using the tile function (★☆☆) + +< h21 +hint: np.tile + +< a21 +Z = np.tile( np.array([[0,1],[1,0]]), (4,4)) +print(Z) + +< q22 +Normalize a 5x5 random matrix (★☆☆) + +< h22 +hint: (x -mean)/std + +< a22 +Z = np.random.random((5,5)) +Z = (Z - np.mean (Z)) / (np.std (Z)) +print(Z) + +< q23 +Create a custom dtype that describes a color as four unsigned bytes (RGBA) (★☆☆) + +< h23 +hint: np.dtype + +< a23 +color = np.dtype([("r", np.ubyte, 1), + ("g", np.ubyte, 1), + ("b", np.ubyte, 1), + ("a", np.ubyte, 1)]) + +< q24 +Multiply a 5x3 matrix by a 3x2 matrix (real matrix product) (★☆☆) + +< h24 +hint: + +< a24 +Z = np.dot(np.ones((5,3)), np.ones((3,2))) +print(Z) + +# Alternative solution, in Python 3.5 and above +Z = np.ones((5,3)) @ np.ones((3,2)) +print(Z) + +< q25 +Given a 1D array, negate all elements which are between 3 and 8, in place. (★☆☆) + +< h25 +hint: >, < + +< a25 +# Author: Evgeni Burovski + +Z = np.arange(11) +Z[(3 < Z) & (Z <= 8)] *= -1 +print(Z) + +< q26 +What is the output of the following script? (★☆☆) +```python +# Author: Jake VanderPlas + +print(sum(range(5),-1)) +from numpy import * +print(sum(range(5),-1)) +``` + +< h26 +hint: np.sum + +< a26 +# Author: Jake VanderPlas + +print(sum(range(5),-1)) +from numpy import * +print(sum(range(5),-1)) + +< q27 +Consider an integer vector Z, which of these expressions are legal? (★☆☆) +```python +Z**Z +2 << Z >> 2 +Z <- Z +1j*Z +Z/1/1 +ZZ +``` + +< h27 +No hints provided... + +< a27 +Z**Z +2 << Z >> 2 +Z <- Z +1j*Z +Z/1/1 +ZZ + +< q28 +What are the result of the following expressions? +```python +np.array(0) / np.array(0) +np.array(0) // np.array(0) +np.array([np.nan]).astype(int).astype(float) +``` + +< h28 +No hints provided... + +< a28 +print(np.array(0) / np.array(0)) +print(np.array(0) // np.array(0)) +print(np.array([np.nan]).astype(int).astype(float)) + +< q29 +How to round away from zero a float array ? (★☆☆) + +< h29 +hint: np.uniform, np.copysign, np.ceil, np.abs + +< a29 +# Author: Charles R Harris + +Z = np.random.uniform(-10,+10,10) +print (np.copysign(np.ceil(np.abs(Z)), Z)) + +< q30 +How to find common values between two arrays? (★☆☆) + +< h30 +hint: np.intersect1d + +< a30 +Z1 = np.random.randint(0,10,10) +Z2 = np.random.randint(0,10,10) +print(np.intersect1d(Z1,Z2)) + +< q31 +How to ignore all numpy warnings (not recommended)? (★☆☆) + +< h31 +hint: np.seterr, np.errstate + +< a31 +# Suicide mode on +defaults = np.seterr(all="ignore") +Z = np.ones(1) / 0 + +# Back to sanity +_ = np.seterr(**defaults) + +# Equivalently with a context manager +nz = np.nonzero([1,2,0,0,4,0]) +print(nz) + +< q32 +Is the following expressions true? (★☆☆) +```python +np.sqrt(-1) == np.emath.sqrt(-1) +``` + +< h32 +hint: imaginary number + +< a32 +np.sqrt(-1) == np.emath.sqrt(-1) + +< q33 +How to get the dates of yesterday, today and tomorrow? (★☆☆) + +< h33 +hint: np.datetime64, np.timedelta64 + +< a33 +yesterday = np.datetime64('today', 'D') - np.timedelta64(1, 'D') +today = np.datetime64('today', 'D') +tomorrow = np.datetime64('today', 'D') + np.timedelta64(1, 'D') + +< q34 +How to get all the dates corresponding to the month of July 2016? (★★☆) + +< h34 +hint: np.arange(dtype=datetime64['D']) + +< a34 +Z = np.arange('2016-07', '2016-08', dtype='datetime64[D]') +print(Z) + +< q35 +How to compute ((A+B)*(-A/2)) in place (without copy)? (★★☆) + +< h35 +hint: np.add(out=), np.negative(out=), np.multiply(out=), np.divide(out=) + +< a35 +A = np.ones(3)*1 +B = np.ones(3)*2 +C = np.ones(3)*3 +np.add(A,B,out=B) +np.divide(A,2,out=A) +np.negative(A,out=A) +np.multiply(A,B,out=A) + +< q36 +Extract the integer part of a random array of positive numbers using 4 different methods (★★☆) + +< h36 +hint: %, np.floor, astype, np.trunc + +< a36 +Z = np.random.uniform(0,10,10) + +print (Z - Z%1) +print (np.floor(Z)) +print (Z.astype(int)) +print (np.trunc(Z)) + +< q37 +Create a 5x5 matrix with row values ranging from 0 to 4 (★★☆) + +< h37 +hint: np.arange + +< a37 +Z = np.zeros((5,5)) +Z += np.arange(5) +print(Z) + +< q38 +Consider a generator function that generates 10 integers and use it to build an array (★☆☆) + +< h38 +hint: np.fromiter + +< a38 +def generate(): + for x in range(10): + yield x +Z = np.fromiter(generate(),dtype=float,count=-1) +print(Z) + +< q39 +Create a vector of size 10 with values ranging from 0 to 1, both excluded (★★☆) + +< h39 +hint: np.linspace + +< a39 +Z = np.linspace(0,1,11,endpoint=False)[1:] +print(Z) + +< q40 +Create a random vector of size 10 and sort it (★★☆) + +< h40 +hint: sort + +< a40 +Z = np.random.random(10) +Z.sort() +print(Z) + +< q41 +How to sum a small array faster than np.sum? (★★☆) + +< h41 +hint: np.add.reduce + +< a41 +# Author: Evgeni Burovski + +Z = np.arange(10) +np.add.reduce(Z) + +< q42 +Consider two random array A and B, check if they are equal (★★☆) + +< h42 +hint: np.allclose, np.array_equal + +< a42 +A = np.random.randint(0,2,5) +B = np.random.randint(0,2,5) + +# Assuming identical shape of the arrays and a tolerance for the comparison of values +equal = np.allclose(A,B) +print(equal) + +# Checking both the shape and the element values, no tolerance (values have to be exactly equal) +equal = np.array_equal(A,B) +print(equal) + +< q43 +Make an array immutable (read-only) (★★☆) + +< h43 +hint: flags.writeable + +< a43 +Z = np.zeros(10) +Z.flags.writeable = False +Z[0] = 1 + +< q44 +Consider a random 10x2 matrix representing cartesian coordinates, convert them to polar coordinates (★★☆) + +< h44 +hint: np.sqrt, np.arctan2 + +< a44 +Z = np.random.random((10,2)) +X,Y = Z[:,0], Z[:,1] +R = np.sqrt(X**2+Y**2) +T = np.arctan2(Y,X) +print(R) +print(T) + +< q45 +Create random vector of size 10 and replace the maximum value by 0 (★★☆) + +< h45 +hint: argmax + +< a45 +Z = np.random.random(10) +Z[Z.argmax()] = 0 +print(Z) + +< q46 +Create a structured array with `x` and `y` coordinates covering the [0,1]x[0,1] area (★★☆) + +< h46 +hint: np.meshgrid + +< a46 +Z = np.zeros((5,5), [('x',float),('y',float)]) +Z['x'], Z['y'] = np.meshgrid(np.linspace(0,1,5), + np.linspace(0,1,5)) +print(Z) + +< q47 +Given two arrays, X and Y, construct the Cauchy matrix C (Cij =1/(xi - yj)) + +< h47 +hint: np.subtract.outer + +< a47 +# Author: Evgeni Burovski + +X = np.arange(8) +Y = X + 0.5 +C = 1.0 / np.subtract.outer(X, Y) +print(np.linalg.det(C)) + +< q48 +Print the minimum and maximum representable value for each numpy scalar type (★★☆) + +< h48 +hint: np.iinfo, np.finfo, eps + +< a48 +for dtype in [np.int8, np.int32, np.int64]: + print(np.iinfo(dtype).min) + print(np.iinfo(dtype).max) +for dtype in [np.float32, np.float64]: + print(np.finfo(dtype).min) + print(np.finfo(dtype).max) + print(np.finfo(dtype).eps) + +< q49 +How to print all the values of an array? (★★☆) + +< h49 +hint: np.set_printoptions + +< a49 +import sys +np.set_printoptions(threshold=sys.maxsize) +Z = np.zeros((16,16)) +print(Z) + +< q50 +How to find the closest value (to a given scalar) in a vector? (★★☆) + +< h50 +hint: argmin + +< a50 +Z = np.arange(100) +v = np.random.uniform(0,100) +index = (np.abs(Z-v)).argmin() +print(Z[index]) + +< q51 +Create a structured array representing a position (x,y) and a color (r,g,b) (★★☆) + +< h51 +hint: dtype + +< a51 +Z = np.zeros(10, [ ('position', [ ('x', float, 1), + ('y', float, 1)]), + ('color', [ ('r', float, 1), + ('g', float, 1), + ('b', float, 1)])]) +print(Z) + +< q52 +Consider a random vector with shape (100,2) representing coordinates, find point by point distances (★★☆) + +< h52 +hint: np.atleast_2d, T, np.sqrt + +< a52 +Z = np.random.random((10,2)) +X,Y = np.atleast_2d(Z[:,0], Z[:,1]) +D = np.sqrt( (X-X.T)**2 + (Y-Y.T)**2) +print(D) + +# Much faster with scipy +import scipy +# Thanks Gavin Heverly-Coulson (#issue 1) +import scipy.spatial + +Z = np.random.random((10,2)) +D = scipy.spatial.distance.cdist(Z,Z) +print(D) + +< q53 +How to convert a float (32 bits) array into an integer (32 bits) in place? + +< h53 +hint: astype(copy=False) + +< a53 +Z = np.arange(10, dtype=np.float32) +Z = Z.astype(np.int32, copy=False) +print(Z) + +< q54 +How to read the following file? (★★☆) +``` +1, 2, 3, 4, 5 +6, , , 7, 8 + , , 9,10,11 +``` + +< h54 +hint: np.genfromtxt + +< a54 +from io import StringIO + +# Fake file +s = StringIO('''1, 2, 3, 4, 5 + + 6, , , 7, 8 + + , , 9,10,11 +''') +Z = np.genfromtxt(s, delimiter=",", dtype=np.int) +print(Z) + +< q55 +What is the equivalent of enumerate for numpy arrays? (★★☆) + +< h55 +hint: np.ndenumerate, np.ndindex + +< a55 +Z = np.arange(9).reshape(3,3) +for index, value in np.ndenumerate(Z): + print(index, value) +for index in np.ndindex(Z.shape): + print(index, Z[index]) + +< q56 +Generate a generic 2D Gaussian-like array (★★☆) + +< h56 +hint: np.meshgrid, np.exp + +< a56 +X, Y = np.meshgrid(np.linspace(-1,1,10), np.linspace(-1,1,10)) +D = np.sqrt(X*X+Y*Y) +sigma, mu = 1.0, 0.0 +G = np.exp(-( (D-mu)**2 / ( 2.0 * sigma**2 ) ) ) +print(G) + +< q57 +How to randomly place p elements in a 2D array? (★★☆) + +< h57 +hint: np.put, np.random.choice + +< a57 +# Author: Divakar + +n = 10 +p = 3 +Z = np.zeros((n,n)) +np.put(Z, np.random.choice(range(n*n), p, replace=False),1) +print(Z) + +< q58 +Subtract the mean of each row of a matrix (★★☆) + +< h58 +hint: mean(axis=,keepdims=) + +< a58 +# Author: Warren Weckesser + +X = np.random.rand(5, 10) + +# Recent versions of numpy +Y = X - X.mean(axis=1, keepdims=True) + +# Older versions of numpy +Y = X - X.mean(axis=1).reshape(-1, 1) + +print(Y) + +< q59 +How to sort an array by the nth column? (★★☆) + +< h59 +hint: argsort + +< a59 +# Author: Steve Tjoa + +Z = np.random.randint(0,10,(3,3)) +print(Z) +print(Z[Z[:,1].argsort()]) + +< q60 +How to tell if a given 2D array has null columns? (★★☆) + +< h60 +hint: any, ~ + +< a60 +# Author: Warren Weckesser + +Z = np.random.randint(0,3,(3,10)) +print((~Z.any(axis=0)).any()) + +< q61 +Find the nearest value from a given value in an array (★★☆) + +< h61 +hint: np.abs, argmin, flat + +< a61 +Z = np.random.uniform(0,1,10) +z = 0.5 +m = Z.flat[np.abs(Z - z).argmin()] +print(m) + +< q62 +Considering two arrays with shape (1,3) and (3,1), how to compute their sum using an iterator? (★★☆) + +< h62 +hint: np.nditer + +< a62 +A = np.arange(3).reshape(3,1) +B = np.arange(3).reshape(1,3) +it = np.nditer([A,B,None]) +for x,y,z in it: z[...] = x + y +print(it.operands[2]) + +< q63 +Create an array class that has a name attribute (★★☆) + +< h63 +hint: class method + +< a63 +class NamedArray(np.ndarray): + def __new__(cls, array, name="no name"): + obj = np.asarray(array).view(cls) + obj.name = name + return obj + def __array_finalize__(self, obj): + if obj is None: return + self.info = getattr(obj, 'name', "no name") + +Z = NamedArray(np.arange(10), "range_10") +print (Z.name) + +< q64 +Consider a given vector, how to add 1 to each element indexed by a second vector (be careful with repeated indices)? (★★★) + +< h64 +hint: np.bincount | np.add.at + +< a64 +# Author: Brett Olsen + +Z = np.ones(10) +I = np.random.randint(0,len(Z),20) +Z += np.bincount(I, minlength=len(Z)) +print(Z) + +# Another solution +# Author: Bartosz Telenczuk +np.add.at(Z, I, 1) +print(Z) + +< q65 +How to accumulate elements of a vector (X) to an array (F) based on an index list (I)? (★★★) + +< h65 +hint: np.bincount + +< a65 +# Author: Alan G Isaac + +X = [1,2,3,4,5,6] +I = [1,3,9,3,4,1] +F = np.bincount(I,X) +print(F) + +< q66 +Considering a (w,h,3) image of (dtype=ubyte), compute the number of unique colors (★★★) + +< h66 +hint: np.unique + +< a66 +# Author: Nadav Horesh + +w,h = 16,16 +I = np.random.randint(0,2,(h,w,3)).astype(np.ubyte) +F = I[...,0]*256*256 + I[...,1]*256 +I[...,2] +n = len(np.unique(F)) +print(np.unique(I)) + +< q67 +Considering a four dimensions array, how to get sum over the last two axis at once? (★★★) + +< h67 +hint: sum(axis=(-2,-1)) + +< a67 +A = np.random.randint(0,10,(3,4,3,4)) +# solution by passing a tuple of axes (introduced in numpy 1.7.0) +sum = A.sum(axis=(-2,-1)) +print(sum) +# solution by flattening the last two dimensions into one +# (useful for functions that don't accept tuples for axis argument) +sum = A.reshape(A.shape[:-2] + (-1,)).sum(axis=-1) +print(sum) + +< q68 +Considering a one-dimensional vector D, how to compute means of subsets of D using a vector S of same size describing subset indices? (★★★) + +< h68 +hint: np.bincount + +< a68 +# Author: Jaime Fernández del Río + +D = np.random.uniform(0,1,100) +S = np.random.randint(0,10,100) +D_sums = np.bincount(S, weights=D) +D_counts = np.bincount(S) +D_means = D_sums / D_counts +print(D_means) + +# Pandas solution as a reference due to more intuitive code +import pandas as pd +print(pd.Series(D).groupby(S).mean()) + +< q69 +How to get the diagonal of a dot product? (★★★) + +< h69 +hint: np.diag + +< a69 +# Author: Mathieu Blondel + +A = np.random.uniform(0,1,(5,5)) +B = np.random.uniform(0,1,(5,5)) + +# Slow version +np.diag(np.dot(A, B)) + +# Fast version +np.sum(A * B.T, axis=1) + +# Faster version +np.einsum("ij,ji->i", A, B) + +< q70 +Consider the vector [1, 2, 3, 4, 5], how to build a new vector with 3 consecutive zeros interleaved between each value? (★★★) + +< h70 +hint: array[::4] + +< a70 +# Author: Warren Weckesser + +Z = np.array([1,2,3,4,5]) +nz = 3 +Z0 = np.zeros(len(Z) + (len(Z)-1)*(nz)) +Z0[::nz+1] = Z +print(Z0) + +< q71 +Consider an array of dimension (5,5,3), how to mulitply it by an array with dimensions (5,5)? (★★★) + +< h71 +hint: array[:, :, None] + +< a71 +A = np.ones((5,5,3)) +B = 2*np.ones((5,5)) +print(A * B[:,:,None]) + +< q72 +How to swap two rows of an array? (★★★) + +< h72 +hint: array[[]] = array[[]] + +< a72 +# Author: Eelco Hoogendoorn + +A = np.arange(25).reshape(5,5) +A[[0,1]] = A[[1,0]] +print(A) + +< q73 +Consider a set of 10 triplets describing 10 triangles (with shared vertices), find the set of unique line segments composing all the triangles (★★★) + +< h73 +hint: repeat, np.roll, np.sort, view, np.unique + +< a73 +# Author: Nicolas P. Rougier + +faces = np.random.randint(0,100,(10,3)) +F = np.roll(faces.repeat(2,axis=1),-1,axis=1) +F = F.reshape(len(F)*3,2) +F = np.sort(F,axis=1) +G = F.view( dtype=[('p0',F.dtype),('p1',F.dtype)] ) +G = np.unique(G) +print(G) + +< q74 +Given an array C that is a bincount, how to produce an array A such that np.bincount(A) == C? (★★★) + +< h74 +hint: np.repeat + +< a74 +# Author: Jaime Fernández del Río + +C = np.bincount([1,1,2,3,4,4,6]) +A = np.repeat(np.arange(len(C)), C) +print(A) + +< q75 +How to compute averages using a sliding window over an array? (★★★) + +< h75 +hint: np.cumsum + +< a75 +# Author: Jaime Fernández del Río + +def moving_average(a, n=3) : + ret = np.cumsum(a, dtype=float) + ret[n:] = ret[n:] - ret[:-n] + return ret[n - 1:] / n +Z = np.arange(20) +print(moving_average(Z, n=3)) + +< q76 +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]) (★★★) + +< h76 +hint: from numpy.lib import stride_tricks + +< a76 +# Author: Joe Kington / Erik Rigtorp +from numpy.lib import stride_tricks + +def rolling(a, window): + shape = (a.size - window + 1, window) + strides = (a.itemsize, a.itemsize) + return stride_tricks.as_strided(a, shape=shape, strides=strides) +Z = rolling(np.arange(10), 3) +print(Z) + +< q77 +How to negate a boolean, or to change the sign of a float inplace? (★★★) + +< h77 +hint: np.logical_not, np.negative + +< a77 +# Author: Nathaniel J. Smith + +Z = np.random.randint(0,2,100) +np.logical_not(Z, out=Z) + +Z = np.random.uniform(-1.0,1.0,100) +np.negative(Z, out=Z) + +< q78 +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])? (★★★) + +< h78 +No hints provided... + +< a78 +def distance(P0, P1, p): + T = P1 - P0 + L = (T**2).sum(axis=1) + U = -((P0[:,0]-p[...,0])*T[:,0] + (P0[:,1]-p[...,1])*T[:,1]) / L + U = U.reshape(len(U),1) + D = P0 + U*T - p + return np.sqrt((D**2).sum(axis=1)) + +P0 = np.random.uniform(-10,10,(10,2)) +P1 = np.random.uniform(-10,10,(10,2)) +p = np.random.uniform(-10,10,( 1,2)) +print(distance(P0, P1, p)) + +< q79 +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])? (★★★) + +< h79 +No hints provided... + +< a79 +# Author: Italmassov Kuanysh + +# based on distance function from previous question +P0 = np.random.uniform(-10, 10, (10,2)) +P1 = np.random.uniform(-10,10,(10,2)) +p = np.random.uniform(-10, 10, (10,2)) +print(np.array([distance(P0,P1,p_i) for p_i in p])) + +< q80 +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) (★★★) + +< h80 +hint: minimum maximum + +< a80 +# Author: Nicolas Rougier + +Z = np.random.randint(0,10,(10,10)) +shape = (5,5) +fill = 0 +position = (1,1) + +R = np.ones(shape, dtype=Z.dtype)*fill +P = np.array(list(position)).astype(int) +Rs = np.array(list(R.shape)).astype(int) +Zs = np.array(list(Z.shape)).astype(int) + +R_start = np.zeros((len(shape),)).astype(int) +R_stop = np.array(list(shape)).astype(int) +Z_start = (P-Rs//2) +Z_stop = (P+Rs//2)+Rs%2 + +R_start = (R_start - np.minimum(Z_start,0)).tolist() +Z_start = (np.maximum(Z_start,0)).tolist() +R_stop = np.maximum(R_start, (R_stop - np.maximum(Z_stop-Zs,0))).tolist() +Z_stop = (np.minimum(Z_stop,Zs)).tolist() + +r = [slice(start,stop) for start,stop in zip(R_start,R_stop)] +z = [slice(start,stop) for start,stop in zip(Z_start,Z_stop)] +R[r] = Z[z] +print(Z) +print(R) + +< q81 +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]]? (★★★) + +< h81 +hint: stride_tricks.as_strided + +< a81 +# Author: Stefan van der Walt + +Z = np.arange(1,15,dtype=np.uint32) +R = stride_tricks.as_strided(Z,(11,4),(4,4)) +print(R) + +< q82 +Compute a matrix rank (★★★) + +< h82 +hint: np.linalg.svd + +< a82 +# Author: Stefan van der Walt + +Z = np.random.uniform(0,1,(10,10)) +U, S, V = np.linalg.svd(Z) # Singular Value Decomposition +rank = np.sum(S > 1e-10) +print(rank) + +< q83 +How to find the most frequent value in an array? + +< h83 +hint: np.bincount, argmax + +< a83 +Z = np.random.randint(0,10,50) +print(np.bincount(Z).argmax()) + +< q84 +Extract all the contiguous 3x3 blocks from a random 10x10 matrix (★★★) + +< h84 +hint: stride_tricks.as_strided + +< a84 +# Author: Chris Barker + +Z = np.random.randint(0,5,(10,10)) +n = 3 +i = 1 + (Z.shape[0]-3) +j = 1 + (Z.shape[1]-3) +C = stride_tricks.as_strided(Z, shape=(i, j, n, n), strides=Z.strides + Z.strides) +print(C) + +< q85 +Create a 2D array subclass such that Z[i,j] == Z[j,i] (★★★) + +< h85 +hint: class method + +< a85 +# Author: Eric O. Lebigot +# Note: only works for 2d array and value setting using indices + +class Symetric(np.ndarray): + def __setitem__(self, index, value): + i,j = index + super(Symetric, self).__setitem__((i,j), value) + super(Symetric, self).__setitem__((j,i), value) + +def symetric(Z): + return np.asarray(Z + Z.T - np.diag(Z.diagonal())).view(Symetric) + +S = symetric(np.random.randint(0,10,(5,5))) +S[2,3] = 42 +print(S) + +< q86 +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)) (★★★) + +< h86 +hint: np.tensordot + +< a86 +# Author: Stefan van der Walt + +p, n = 10, 20 +M = np.ones((p,n,n)) +V = np.ones((p,n,1)) +S = np.tensordot(M, V, axes=[[0, 2], [0, 1]]) +print(S) + +# It works, because: +# M is (p,n,n) +# V is (p,n,1) +# Thus, summing over the paired axes 0 and 0 (of M and V independently), +# and 2 and 1, to remain with a (n,1) vector. + +< q87 +Consider a 16x16 array, how to get the block-sum (block size is 4x4)? (★★★) + +< h87 +hint: np.add.reduceat + +< a87 +# Author: Robert Kern + +Z = np.ones((16,16)) +k = 4 +S = np.add.reduceat(np.add.reduceat(Z, np.arange(0, Z.shape[0], k), axis=0), + np.arange(0, Z.shape[1], k), axis=1) +print(S) + +< q88 +How to implement the Game of Life using numpy arrays? (★★★) + +< h88 +No hints provided... + +< a88 +# Author: Nicolas Rougier + +def iterate(Z): + # Count neighbours + N = (Z[0:-2,0:-2] + Z[0:-2,1:-1] + Z[0:-2,2:] + + Z[1:-1,0:-2] + Z[1:-1,2:] + + Z[2: ,0:-2] + Z[2: ,1:-1] + Z[2: ,2:]) + + # Apply rules + birth = (N==3) & (Z[1:-1,1:-1]==0) + survive = ((N==2) | (N==3)) & (Z[1:-1,1:-1]==1) + Z[...] = 0 + Z[1:-1,1:-1][birth | survive] = 1 + return Z + +Z = np.random.randint(0,2,(50,50)) +for i in range(100): Z = iterate(Z) +print(Z) + +< q89 +How to get the n largest values of an array (★★★) + +< h89 +hint: np.argsort | np.argpartition + +< a89 +Z = np.arange(10000) +np.random.shuffle(Z) +n = 5 + +# Slow +print (Z[np.argsort(Z)[-n:]]) + +# Fast +print (Z[np.argpartition(-Z,n)[:n]]) + +< q90 +Given an arbitrary number of vectors, build the cartesian product (every combinations of every item) (★★★) + +< h90 +hint: np.indices + +< a90 +# Author: Stefan Van der Walt + +def cartesian(arrays): + arrays = [np.asarray(a) for a in arrays] + shape = (len(x) for x in arrays) + + ix = np.indices(shape, dtype=int) + ix = ix.reshape(len(arrays), -1).T + + for n, arr in enumerate(arrays): + ix[:, n] = arrays[n][ix[:, n]] + + return ix + +print (cartesian(([1, 2, 3], [4, 5], [6, 7]))) + +< q91 +How to create a record array from a regular array? (★★★) + +< h91 +hint: np.core.records.fromarrays + +< a91 +Z = np.array([("Hello", 2.5, 3), + ("World", 3.6, 2)]) +R = np.core.records.fromarrays(Z.T, + names='col1, col2, col3', + formats = 'S8, f8, i8') +print(R) + +< q92 +Consider a large vector Z, compute Z to the power of 3 using 3 different methods (★★★) + +< h92 +hint: np.power, *, np.einsum + +< a92 +# Author: Ryan G. + +x = np.random.rand(int(5e7)) + +%timeit np.power(x,3) +%timeit x*x*x +%timeit np.einsum('i,i,i->i',x,x,x) + +< q93 +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? (★★★) + +< h93 +hint: np.where + +< a93 +# Author: Gabe Schwartz + +A = np.random.randint(0,5,(8,3)) +B = np.random.randint(0,5,(2,2)) + +C = (A[..., np.newaxis, np.newaxis] == B) +rows = np.where(C.any((3,1)).all(1))[0] +print(rows) + +< q94 +Considering a 10x3 matrix, extract rows with unequal values (e.g. [2,2,3]) (★★★) + +< h94 +No hints provided... + +< a94 +# Author: Robert Kern + +Z = np.random.randint(0,5,(10,3)) +print(Z) +# solution for arrays of all dtypes (including string arrays and record arrays) +E = np.all(Z[:,1:] == Z[:,:-1], axis=1) +U = Z[~E] +print(U) +# soluiton for numerical arrays only, will work for any number of columns in Z +U = Z[Z.max(axis=1) != Z.min(axis=1),:] +print(U) + +< q95 +Convert a vector of ints into a matrix binary representation (★★★) + +< h95 +hint: np.unpackbits + +< a95 +# Author: Warren Weckesser + +I = np.array([0, 1, 2, 3, 15, 16, 32, 64, 128]) +B = ((I.reshape(-1,1) & (2**np.arange(8))) != 0).astype(int) +print(B[:,::-1]) + +# Author: Daniel T. McDonald + +I = np.array([0, 1, 2, 3, 15, 16, 32, 64, 128], dtype=np.uint8) +print(np.unpackbits(I[:, np.newaxis], axis=1)) + +< q96 +Given a two dimensional array, how to extract unique rows? (★★★) + +< h96 +hint: np.ascontiguousarray | np.unique + +< a96 +# Author: Jaime Fernández del Río + +Z = np.random.randint(0,2,(6,3)) +T = np.ascontiguousarray(Z).view(np.dtype((np.void, Z.dtype.itemsize * Z.shape[1]))) +_, idx = np.unique(T, return_index=True) +uZ = Z[idx] +print(uZ) + +# Author: Andreas Kouzelis +# NumPy >= 1.13 +uZ = np.unique(Z, axis=0) +print(uZ) + +< q97 +Considering 2 vectors A & B, write the einsum equivalent of inner, outer, sum, and mul function (★★★) + +< h97 +hint: np.einsum + +< a97 +# Author: Alex Riley +# Make sure to read: http://ajcr.net/Basic-guide-to-einsum/ + +A = np.random.uniform(0,1,10) +B = np.random.uniform(0,1,10) + +np.einsum('i->', A) # np.sum(A) +np.einsum('i,i->i', A, B) # A * B +np.einsum('i,i', A, B) # np.inner(A, B) +np.einsum('i,j->ij', A, B) # np.outer(A, B) + +< q98 +Considering a path described by two vectors (X,Y), how to sample it using equidistant samples (★★★)? + +< h98 +hint: np.cumsum, np.interp + +< a98 +# Author: Bas Swinckels + +phi = np.arange(0, 10*np.pi, 0.1) +a = 1 +x = a*phi*np.cos(phi) +y = a*phi*np.sin(phi) + +dr = (np.diff(x)**2 + np.diff(y)**2)**.5 # segment lengths +r = np.zeros_like(x) +r[1:] = np.cumsum(dr) # integrate path +r_int = np.linspace(0, r.max(), 200) # regular spaced path +x_int = np.interp(r_int, r, x) # integrate path +y_int = np.interp(r_int, r, y) + +< q99 +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. (★★★) + +< h99 +hint: np.logical_and.reduce, np.mod + +< a99 +# Author: Evgeni Burovski + +X = np.asarray([[1.0, 0.0, 3.0, 8.0], + [2.0, 0.0, 1.0, 1.0], + [1.5, 2.5, 1.0, 0.0]]) +n = 4 +M = np.logical_and.reduce(np.mod(X, 1) == 0, axis=-1) +M &= (X.sum(axis=-1) == n) +print(X[M]) + +< q100 +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). (★★★) + +< h100 +hint: np.percentile + +< a100 +# Author: Jessica B. Hamrick + +X = np.random.randn(100) # random 1D array +N = 1000 # number of bootstrap samples +idx = np.random.randint(0, X.size, (N, X.size)) +means = X[idx].mean(axis=1) +confint = np.percentile(means, [2.5, 97.5]) +print(confint) + diff --git a/source/headers.ktx b/source/headers.ktx new file mode 100644 index 00000000..03acd5df --- /dev/null +++ b/source/headers.ktx @@ -0,0 +1,25 @@ +< header +# 100 numpy exercises + +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. + + +If you find an error or think you've a better way to solve some of them, feel +free to open an issue at . + + +< sub_header +File automatically generated. See the documentation to update questions/answers/hints programmatically. + + +< jupyter_instruction +Run the `initialize.py` module, then for each question you can query the +answer or an hint with `hint(n)` or `answer(n)` for `n` question number. + + +< jupyter_instruction_rand +Run the `initialize.py` module, then call a random question with `pick()` an hint towards its solution with +`hint(n)` and the answer with `answer(n)`, where n is the number of the picked question. +