From f2f4a52cf8676d74665359f7473e8b2e68bd887d Mon Sep 17 00:00:00 2001 From: mozhonglin Date: Fri, 10 Jan 2020 11:36:03 +0800 Subject: [PATCH 01/22] issue #79: setting np.set_printoption threshold param to np.nan is not allowed now --- 100_Numpy_exercises.ipynb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/100_Numpy_exercises.ipynb b/100_Numpy_exercises.ipynb index f0f3e27b..3f23dc0b 100644 --- a/100_Numpy_exercises.ipynb +++ b/100_Numpy_exercises.ipynb @@ -931,8 +931,9 @@ "metadata": {}, "outputs": [], "source": [ - "np.set_printoptions(threshold=np.nan)\n", - "Z = np.zeros((16,16))\n", + "import sys\n", + "np.set_printoptions(threshold=sys.maxsize)\n", + "Z = np.zeros(1001) # 1000 is the default threshold which trigger summarization\n", "print(Z)" ] }, From e19f1f521c1dea2db09523e46c6e02f67a1f8a45 Mon Sep 17 00:00:00 2001 From: SebastianoF Date: Sun, 17 Nov 2019 18:57:24 +0000 Subject: [PATCH 02/22] gitignore and requirements modified --- .gitignore | 3 +++ hints/ex01_import_numpy.py | 1 + hints/ex02_print_version_and_config.py | 0 hints/ex03_null_vect_size_10.py | 0 hints/ex04_memory_size_of_an_array.py | 0 hints/ex05_get_infos.py | 0 requirements.txt | 6 ++++-- solutions/ex01_import_numpy.py | 1 + solutions/ex02_print_version_and_config.py | 0 solutions/ex03_null_vect_size_10.py | 0 solutions/ex04_memory_size_of_an_array.py | 0 solutions/ex05_get_infos.py | 0 12 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 hints/ex01_import_numpy.py create mode 100644 hints/ex02_print_version_and_config.py create mode 100644 hints/ex03_null_vect_size_10.py create mode 100644 hints/ex04_memory_size_of_an_array.py create mode 100644 hints/ex05_get_infos.py create mode 100644 solutions/ex01_import_numpy.py create mode 100644 solutions/ex02_print_version_and_config.py create mode 100644 solutions/ex03_null_vect_size_10.py create mode 100644 solutions/ex04_memory_size_of_an_array.py create mode 100644 solutions/ex05_get_infos.py diff --git a/.gitignore b/.gitignore index 87620ac7..00dd6eaa 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,4 @@ .ipynb_checkpoints/ +venv +.idea +.vscode diff --git a/hints/ex01_import_numpy.py b/hints/ex01_import_numpy.py new file mode 100644 index 00000000..552cccb8 --- /dev/null +++ b/hints/ex01_import_numpy.py @@ -0,0 +1 @@ +print("hint: import … as …") diff --git a/hints/ex02_print_version_and_config.py b/hints/ex02_print_version_and_config.py new file mode 100644 index 00000000..e69de29b diff --git a/hints/ex03_null_vect_size_10.py b/hints/ex03_null_vect_size_10.py new file mode 100644 index 00000000..e69de29b diff --git a/hints/ex04_memory_size_of_an_array.py b/hints/ex04_memory_size_of_an_array.py new file mode 100644 index 00000000..e69de29b diff --git a/hints/ex05_get_infos.py b/hints/ex05_get_infos.py new file mode 100644 index 00000000..e69de29b diff --git a/requirements.txt b/requirements.txt index 5da331cf..0ad85da2 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,4 @@ -numpy -pandas +numpy==1.17.4 +pandas==0.25.3 +jupyter==1.0.0 +jupyterthemes==0.20.0 diff --git a/solutions/ex01_import_numpy.py b/solutions/ex01_import_numpy.py new file mode 100644 index 00000000..a22b22b1 --- /dev/null +++ b/solutions/ex01_import_numpy.py @@ -0,0 +1 @@ +import numpy as np diff --git a/solutions/ex02_print_version_and_config.py b/solutions/ex02_print_version_and_config.py new file mode 100644 index 00000000..e69de29b diff --git a/solutions/ex03_null_vect_size_10.py b/solutions/ex03_null_vect_size_10.py new file mode 100644 index 00000000..e69de29b diff --git a/solutions/ex04_memory_size_of_an_array.py b/solutions/ex04_memory_size_of_an_array.py new file mode 100644 index 00000000..e69de29b diff --git a/solutions/ex05_get_infos.py b/solutions/ex05_get_infos.py new file mode 100644 index 00000000..e69de29b From a51ba776c27f0987bc3f5ff768f311f8f3dbfba5 Mon Sep 17 00:00:00 2001 From: SebastianoF Date: Sun, 17 Nov 2019 19:01:09 +0000 Subject: [PATCH 03/22] questions dict added --- hints/ex01_import_numpy.py | 1 - hints/ex02_print_version_and_config.py | 0 hints/ex03_null_vect_size_10.py | 0 hints/ex04_memory_size_of_an_array.py | 0 hints/ex05_get_infos.py | 0 questsions_dict.py | 631 +++++++++++++++++++++ solutions/ex01_import_numpy.py | 1 - solutions/ex02_print_version_and_config.py | 0 solutions/ex03_null_vect_size_10.py | 0 solutions/ex04_memory_size_of_an_array.py | 0 solutions/ex05_get_infos.py | 0 11 files changed, 631 insertions(+), 2 deletions(-) delete mode 100644 hints/ex01_import_numpy.py delete mode 100644 hints/ex02_print_version_and_config.py delete mode 100644 hints/ex03_null_vect_size_10.py delete mode 100644 hints/ex04_memory_size_of_an_array.py delete mode 100644 hints/ex05_get_infos.py create mode 100644 questsions_dict.py delete mode 100644 solutions/ex01_import_numpy.py delete mode 100644 solutions/ex02_print_version_and_config.py delete mode 100644 solutions/ex03_null_vect_size_10.py delete mode 100644 solutions/ex04_memory_size_of_an_array.py delete mode 100644 solutions/ex05_get_infos.py diff --git a/hints/ex01_import_numpy.py b/hints/ex01_import_numpy.py deleted file mode 100644 index 552cccb8..00000000 --- a/hints/ex01_import_numpy.py +++ /dev/null @@ -1 +0,0 @@ -print("hint: import … as …") diff --git a/hints/ex02_print_version_and_config.py b/hints/ex02_print_version_and_config.py deleted file mode 100644 index e69de29b..00000000 diff --git a/hints/ex03_null_vect_size_10.py b/hints/ex03_null_vect_size_10.py deleted file mode 100644 index e69de29b..00000000 diff --git a/hints/ex04_memory_size_of_an_array.py b/hints/ex04_memory_size_of_an_array.py deleted file mode 100644 index e69de29b..00000000 diff --git a/hints/ex05_get_infos.py b/hints/ex05_get_infos.py deleted file mode 100644 index e69de29b..00000000 diff --git a/questsions_dict.py b/questsions_dict.py new file mode 100644 index 00000000..d6b1dbb7 --- /dev/null +++ b/questsions_dict.py @@ -0,0 +1,631 @@ + +qha = { +"q1" : "1. Import the numpy package under the name `np` (★☆☆)", +"h1": "hint: import … as ", +"a1": """ +import numpy as 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/solutions/ex01_import_numpy.py b/solutions/ex01_import_numpy.py deleted file mode 100644 index a22b22b1..00000000 --- a/solutions/ex01_import_numpy.py +++ /dev/null @@ -1 +0,0 @@ -import numpy as np diff --git a/solutions/ex02_print_version_and_config.py b/solutions/ex02_print_version_and_config.py deleted file mode 100644 index e69de29b..00000000 diff --git a/solutions/ex03_null_vect_size_10.py b/solutions/ex03_null_vect_size_10.py deleted file mode 100644 index e69de29b..00000000 diff --git a/solutions/ex04_memory_size_of_an_array.py b/solutions/ex04_memory_size_of_an_array.py deleted file mode 100644 index e69de29b..00000000 diff --git a/solutions/ex05_get_infos.py b/solutions/ex05_get_infos.py deleted file mode 100644 index e69de29b..00000000 From 343b47506e75a098f1a0f7fa0b6227c0f30813b8 Mon Sep 17 00:00:00 2001 From: SebastianoF Date: Sun, 17 Nov 2019 19:58:22 +0000 Subject: [PATCH 04/22] initialise and questions draft --- .gitignore | 1 + initalise.py | 13 +++++++++++++ questsions_dict.py | 7 ++++--- 3 files changed, 18 insertions(+), 3 deletions(-) create mode 100644 initalise.py diff --git a/.gitignore b/.gitignore index 00dd6eaa..49c8b28b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ .ipynb_checkpoints/ +__pycache__ venv .idea .vscode diff --git a/initalise.py b/initalise.py new file mode 100644 index 00000000..46e4d923 --- /dev/null +++ b/initalise.py @@ -0,0 +1,13 @@ +from questsions_dict import qha + + +def question(n): + print(qha[f'q{n}']) + + +def hint(n): + print(qha[f'h{n}']) + + +def answer(n): + print(qha[f'a{n}']) diff --git a/questsions_dict.py b/questsions_dict.py index d6b1dbb7..929efd7a 100644 --- a/questsions_dict.py +++ b/questsions_dict.py @@ -1,8 +1,9 @@ qha = { -"q1" : "1. Import the numpy package under the name `np` (★☆☆)", -"h1": "hint: import … as ", -"a1": """ + "q1": "1. Import the numpy package under the name `np` (★☆☆)", + "h1": "hint: import … as ", + "a1": +""" import numpy as np """, From b9f3eb71c190921e6293f97f62ffcada9dee8334 Mon Sep 17 00:00:00 2001 From: SebastianoF Date: Sun, 17 Nov 2019 20:06:26 +0000 Subject: [PATCH 05/22] dict progresses --- questsions_dict.py | 31 +++++++++++++------------------ 1 file changed, 13 insertions(+), 18 deletions(-) diff --git a/questsions_dict.py b/questsions_dict.py index 929efd7a..25d8e324 100644 --- a/questsions_dict.py +++ b/questsions_dict.py @@ -6,26 +6,21 @@ """ import numpy as np """, + "q2": "2. Print the numpy version and the configuration (★☆☆)", + "h2": "hint: np.__version__, np.show_config)", + "a2": +""" + +""", + "q3": "3. Create a null vector of size 10 (★☆☆)", + "h3": "hint: np.zeros", + "a3": +""" + +""", + } -# #### -# -# (**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) From 953f91af32a8cf8b824f27adc9dff391315c5601 Mon Sep 17 00:00:00 2001 From: SebastianoF Date: Sun, 17 Nov 2019 23:12:04 +0000 Subject: [PATCH 06/22] wip - more dicts entries added --- questsions_dict.py | 634 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 585 insertions(+), 49 deletions(-) diff --git a/questsions_dict.py b/questsions_dict.py index 25d8e324..f8049b44 100644 --- a/questsions_dict.py +++ b/questsions_dict.py @@ -18,58 +18,594 @@ """ """, + "q4": "4. How to find the memory size of any array (★☆☆)", + "h4": "hint: size, itemsize", + "a4": +""" + +""", + "q5": "5. How to get the documentation of the numpy add function from the command line? (★☆☆)", + "h5": "hint: np.info", + "a5": +""" + +""", + "q6": "6. Create a null vector of size 10 but the fifth value which is 1 (★☆☆)", + "h6": "hint: array[4]", + "a6": +""" + +""", + "q7": "7. Create a vector with values ranging from 10 to 49 (★☆☆)", + "h7": "hint: arange", + "a7": +""" + +""", + "q8": "8. Reverse a vector (first element becomes last) (★☆☆)", + "h8": "hint: array[::-1]", + "a8": +""" + +""", + "q9": "9. Create a 3x3 matrix with values ranging from 0 to 8 (★☆☆)", + "h9": "hint: reshape", + "a9": +""" + +""", + "q10": "10. Find indices of non-zero elements from [1,2,0,0,4,0] (★☆☆)", + "h10": "hint: np.nonzero", + "a10": +""" + +""", + "q11": "11. Create a 3x3 identity matrix (★☆☆)", + "h11": "hint: np.eye", + "a11": +""" + +""", + "q12": "12. Create a 3x3x3 array with random values (★☆☆)", + "h12": "hint: np.random.random", + "a12": +""" + +""", + "q13": "", + "h13": "hint: ", + "a13": +""" + +""", + "q14": "", + "h14": "hint: ", + "a14": +""" + +""", + "q15": "", + "h15": "hint: ", + "a15": +""" + +""", + "q16": "", + "h16": "hint: ", + "a16": +""" + +""", + "q17": "", + "h17": "hint: ", + "a17": +""" + +""", + "q18": "", + "h18": "hint: ", + "a18": +""" + +""", + "q19": "", + "h19": "hint: ", + "a19": +""" + +""", + "q20": "", + "h20": "hint: ", + "a20": +""" + +""", + "q21": "", + "h21": "hint: ", + "a21": +""" + +""", + "q22": "", + "h22": "hint: ", + "a22": +""" + +""", + "q23": "", + "h23": "hint: ", + "a23": +""" + +""", + "q24": "", + "h24": "hint: ", + "a24": +""" + +""", + "q25": "", + "h25": "hint: ", + "a25": +""" + +""", + "q26": "", + "h26": "hint: ", + "a26": +""" + +""", + "q27": "", + "h27": "hint: ", + "a27": +""" + +""", + "q28": "", + "h28": "hint: ", + "a28": +""" + +""", + "q29": "", + "h29": "hint: ", + "a29": +""" + +""", + "q30": "", + "h30": "hint: ", + "a30": +""" + +""", + "q31": "", + "h31": "hint: ", + "a31": +""" + +""", + "q32": "", + "h32": "hint: ", + "a32": +""" + +""", + "q33": "", + "h33": "hint: ", + "a33": +""" + +""", + "q34": "", + "h34": "hint: ", + "a34": +""" + +""", + "q35": "", + "h35": "hint: ", + "a35": +""" + +""", + "q36": "", + "h36": "hint: ", + "a36": +""" + +""", + "q37": "", + "h37": "hint: ", + "a37": +""" + +""", + "q38": "", + "h38": "hint: ", + "a38": +""" + +""", + "q39": "", + "h39": "hint: ", + "a39": +""" + +""", + "q40": "", + "h40": "hint: ", + "a40": +""" + +""", + "q41": "", + "h41": "hint: ", + "a41": +""" + +""", + "q42": "", + "h42": "hint: ", + "a42": +""" + +""", + "q43": "", + "h43": "hint: ", + "a43": +""" + +""", + "q44": "", + "h44": "hint: ", + "a44": +""" + +""", + "q45": "", + "h45": "hint: ", + "a45": +""" + +""", + "q46": "", + "h46": "hint: ", + "a46": +""" + +""", + "q47": "", + "h47": "hint: ", + "a47": +""" + +""", + "q48": "", + "h48": "hint: ", + "a48": +""" + +""", + "q49": "", + "h49": "hint: ", + "a49": +""" + +""", + "q50": "", + "h50": "hint: ", + "a50": +""" + +""", + "q51": "", + "h51": "hint: ", + "a51": +""" + +""", + "q52": "", + "h52": "hint: ", + "a52": +""" + +""", + "q53": "", + "h53": "hint: ", + "a53": +""" + +""", + "q54": "", + "h54": "hint: ", + "a54": +""" + +""", + "q55": "", + "h55": "hint: ", + "a55": +""" + +""", + "q56": "", + "h56": "hint: ", + "a56": +""" + +""", + "q57": "", + "h57": "hint: ", + "a57": +""" + +""", + "q58": "", + "h58": "hint: ", + "a58": +""" +""", + "q59": "", + "h59": "hint: ", + "a59": +""" + +""", + + "q60": "", + "h60": "hint: ", + "a60": +""" + +""", + "q61": "", + "h61": "hint: ", + "a61": +""" + +""", + "q62": "", + "h62": "hint: ", + "a62": +""" + +""", + "q63": "", + "h63": "hint: ", + "a63": +""" + +""", + "q64": "", + "h64": "hint: ", + "a64": +""" + +""", + "q65": "", + "h65": "hint: ", + "a65": +""" + +""", + "q66": "", + "h66": "hint: ", + "a66": +""" + +""", + "q67": "", + "h67": "hint: ", + "a67": +""" + +""", + "q68": "", + "h68": "hint: ", + "a68": +""" + +""", + "q69": "", + "h69": "hint: ", + "a69": +""" + +""", + "q70": "", + "h70": "hint: ", + "a70": +""" + +""", + "q71": "", + "h71": "hint: ", + "a71": +""" + +""", + "q72": "", + "h72": "hint: ", + "a72": +""" + +""", + "q73": "", + "h73": "hint: ", + "a73": +""" + +""", + "q74": "", + "h74": "hint: ", + "a74": +""" + +""", + "q75": "", + "h75": "hint: ", + "a75": +""" + +""", + "q76": "", + "h76": "hint: ", + "a76": +""" + +""", + "q77": "", + "h77": "hint: ", + "a77": +""" + +""", + + "q78": "", + "h78": "hint: ", + "a78": +""" + +""", + "q79": "", + "h79": "hint: ", + "a79": +""" + +""", + "q80": "", + "h80": "hint: ", + "a80": +""" + +""", + "q81": "", + "h81": "hint: ", + "a81": +""" + +""", + "q82": "", + "h82": "hint: ", + "a82": +""" + +""", + "q83": "", + "h83": "hint: ", + "a83": +""" + +""", + "q84": "", + "h84": "hint: ", + "a84": +""" + +""", + "q85": "", + "h85": "hint: ", + "a85": +""" +""", + "q86": "", + "h86": "hint: ", + "a86": +""" + +""", + "q87": "", + "h87": "hint: ", + "a87": +""" + +""", + + "q88": "", + "h88": "hint: ", + "a88": +""" + +""", + "q89": "", + "h89": "hint: ", + "a89": +""" + +""", + "q90": "", + "h90": "hint: ", + "a90": +""" + +""", + "q91": "", + "h91": "hint: ", + "a91": +""" + +""", + "q92": "", + "h92": "hint: ", + "a92": +""" + +""", + "q93": "", + "h93": "hint: ", + "a93": +""" + +""", + "q94": "", + "h94": "hint: ", + "a94": +""" + +""", + "q95": "", + "h95": "hint: ", + "a95": +""" + +""", + "q96": "", + "h96": "hint: ", + "a96": +""" + +""", + "q97": "", + "h97": "hint: ", + "a97": +""" + +""", + + "q98": "", + "h98": "hint: ", + "a98": +""" + +""", + "q99": "", + "h99": "hint: ", + "a99": +""" + +""", + "q100": "", + "h100": "hint: ", + "a100": +""" + +""", } -# #### 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) # From ca6183aaa4bf1bc8c3b14c92c48ad3c68ea930d0 Mon Sep 17 00:00:00 2001 From: SebastianoF Date: Mon, 18 Nov 2019 22:56:25 +0000 Subject: [PATCH 07/22] quesions and hints added, solutions in progress --- questsions_dict.py | 994 ++++++++++++--------------------------------- 1 file changed, 251 insertions(+), 743 deletions(-) diff --git a/questsions_dict.py b/questsions_dict.py index f8049b44..f66efc9d 100644 --- a/questsions_dict.py +++ b/questsions_dict.py @@ -1,1163 +1,671 @@ qha = { - "q1": "1. Import the numpy package under the name `np` (★☆☆)", + "q1": "Import the numpy package under the name `np` (★☆☆)", "h1": "hint: import … as ", "a1": """ import numpy as np """, - "q2": "2. Print the numpy version and the configuration (★☆☆)", + "q2": "Print the numpy version and the configuration (★☆☆)", "h2": "hint: np.__version__, np.show_config)", "a2": """ """, - "q3": "3. Create a null vector of size 10 (★☆☆)", + "q3": "Create a null vector of size 10 (★☆☆)", "h3": "hint: np.zeros", "a3": """ """, - "q4": "4. How to find the memory size of any array (★☆☆)", + "q4": "How to find the memory size of any array (★☆☆)", "h4": "hint: size, itemsize", "a4": """ """, - "q5": "5. How to get the documentation of the numpy add function from the command line? (★☆☆)", + "q5": "How to get the documentation of the numpy add function from the command line? (★☆☆)", "h5": "hint: np.info", "a5": """ """, - "q6": "6. Create a null vector of size 10 but the fifth value which is 1 (★☆☆)", + "q6": "Create a null vector of size 10 but the fifth value which is 1 (★☆☆)", "h6": "hint: array[4]", "a6": """ """, - "q7": "7. Create a vector with values ranging from 10 to 49 (★☆☆)", + "q7": "Create a vector with values ranging from 10 to 49 (★☆☆)", "h7": "hint: arange", "a7": """ """, - "q8": "8. Reverse a vector (first element becomes last) (★☆☆)", + "q8": "Reverse a vector (first element becomes last) (★☆☆)", "h8": "hint: array[::-1]", "a8": """ """, - "q9": "9. Create a 3x3 matrix with values ranging from 0 to 8 (★☆☆)", + "q9": "Create a 3x3 matrix with values ranging from 0 to 8 (★☆☆)", "h9": "hint: reshape", "a9": """ """, - "q10": "10. Find indices of non-zero elements from [1,2,0,0,4,0] (★☆☆)", + "q10": "Find indices of non-zero elements from [1,2,0,0,4,0] (★☆☆)", "h10": "hint: np.nonzero", "a10": """ """, - "q11": "11. Create a 3x3 identity matrix (★☆☆)", + "q11": "Create a 3x3 identity matrix (★☆☆)", "h11": "hint: np.eye", "a11": """ """, - "q12": "12. Create a 3x3x3 array with random values (★☆☆)", + "q12": "Create a 3x3x3 array with random values (★☆☆)", "h12": "hint: np.random.random", "a12": """ """, - "q13": "", - "h13": "hint: ", + "q13": "Create a 10x10 array with random values and find the minimum and maximum values (★☆☆)", + "h13": "hint: min, max", "a13": """ """, - "q14": "", - "h14": "hint: ", + "q14": "Create a random vector of size 30 and find the mean value (★☆☆)", + "h14": "hint: mean", "a14": """ """, - "q15": "", - "h15": "hint: ", + "q15": "Create a 2d array with 1 on the border and 0 inside (★☆☆)", + "h15": "hint: array[1:-1, 1:-1]", "a15": """ """, - "q16": "", - "h16": "hint: ", + "q16": "How to add a border (filled with 0's) around an existing array? (★☆☆)", + "h16": "hint: np.pad", "a16": """ """, - "q17": "", - "h17": "hint: ", + "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": """ """, - "q18": "", - "h18": "hint: ", + "q18": "Create a 5x5 matrix with values 1,2,3,4 just below the diagonal (★☆☆)", + "h18": "hint: np.diag", "a18": """ """, - "q19": "", - "h19": "hint: ", + "q19": "Create a 8x8 matrix and fill it with a checkerboard pattern (★☆☆)", + "h19": "hint: array[::2]", "a19": """ """, - "q20": "", - "h20": "hint: ", + "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": """ """, - "q21": "", - "h21": "hint: ", + "q21": "Create a checkerboard 8x8 matrix using the tile function (★☆☆)", + "h21": "hint: np.tile", "a21": """ """, - "q22": "", - "h22": "hint: ", + "q22": "Normalize a 5x5 random matrix (★☆☆)", + "h22": "hint: (x -mean)/std", "a22": """ """, - "q23": "", - "h23": "hint: ", + "q23": "Create a custom dtype that describes a color as four unsigned bytes (RGBA) (★☆☆)", + "h23": "hint: np.dtype", "a23": """ """, - "q24": "", + "q24": "Multiply a 5x3 matrix by a 3x2 matrix (real matrix product) (★☆☆)", "h24": "hint: ", "a24": """ """, - "q25": "", - "h25": "hint: ", + "q25": "Given a 1D array, negate all elements which are between 3 and 8, in place. (★☆☆)", + "h25": "hint: >, <=", "a25": """ """, - "q26": "", - "h26": "hint: ", + "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": """ """, - "q27": "", - "h27": "hint: ", + "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": """ """, - "q28": "", - "h28": "hint: ", + "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": """ """, - "q29": "", - "h29": "hint: ", + "q29": "How to round away from zero a float array ? (★☆☆)", + "h29": "hint: np.uniform, np.copysign, np.ceil, np.abs", "a29": """ """, - "q30": "", - "h30": "hint: ", + "q30": "How to find common values between two arrays? (★☆☆)", + "h30": "hint: np.intersect1d", "a30": """ """, - "q31": "", - "h31": "hint: ", + "q31": "How to ignore all numpy warnings (not recommended)? (★☆☆)", + "h31": "hint: np.seterr, np.errstate", "a31": """ """, - "q32": "", - "h32": "hint: ", + "q32": """ +Is the following expressions true? (★☆☆) +```python +np.sqrt(-1) == np.emath.sqrt(-1) +``` +""", + "h32": "hint: imaginary number", "a32": """ """, - "q33": "", - "h33": "hint: ", + "q33": "How to get the dates of yesterday, today and tomorrow? (★☆☆)", + "h33": "hint: np.datetime64, np.timedelta64", "a33": """ """, - "q34": "", - "h34": "hint: ", + "q34": "How to get all the dates corresponding to the month of July 2016? (★★☆)", + "h34": "hint: np.arange(dtype=datetime64['D'])", "a34": """ """, - "q35": "", - "h35": "hint: ", + "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": """ """, - "q36": "", - "h36": "hint: ", + "q36": "Extract the integer part of a random array using 5 different methods (★★☆)", + "h36": "hint: %, np.floor, np.ceil, astype, np.trunc", "a36": """ """, - "q37": "", - "h37": "hint: ", + "q37": "Create a 5x5 matrix with row values ranging from 0 to 4 (★★☆)", + "h37": "hint: np.arange", "a37": """ """, - "q38": "", - "h38": "hint: ", + "q38": "Consider a generator function that generates 10 integers and use it to build an array (★☆☆)", + "h38": "hint: np.fromiter", "a38": """ """, - "q39": "", - "h39": "hint: ", + "q39": "Create a vector of size 10 with values ranging from 0 to 1, both excluded (★★☆)", + "h39": "hint: np.linspace", "a39": """ """, - "q40": "", - "h40": "hint: ", + "q40": "Create a random vector of size 10 and sort it (★★☆)", + "h40": "hint: sort", "a40": """ """, - "q41": "", - "h41": "hint: ", + "q41": "How to sum a small array faster than np.sum? (★★☆)", + "h41": "hint: np.add.reduce", "a41": """ """, - "q42": "", - "h42": "hint: ", + "q42": "Consider two random array A and B, check if they are equal (★★☆)", + "h42": "hint: np.allclose, np.array_equal", "a42": """ """, - "q43": "", - "h43": "hint: ", + "q43": "Make an array immutable (read-only) (★★☆)", + "h43": "hint: flags.writeable", "a43": """ """, - "q44": "", - "h44": "hint: ", + "q44": "Consider a random 10x2 matrix representing cartesian coordinates, convert them to polar coordinates (★★☆)", + "h44": "hint: np.sqrt, np.arctan2", "a44": """ """, - "q45": "", - "h45": "hint: ", + "q45": "Create random vector of size 10 and replace the maximum value by 0 (★★☆)", + "h45": "hint: argmax", "a45": """ """, - "q46": "", - "h46": "hint: ", + "q46": "Create a structured array with `x` and `y` coordinates covering the [0,1]x[0,1] area (★★☆)", + "h46": "hint: np.meshgrid", "a46": """ """, - "q47": "", - "h47": "hint: ", + "q47": "Given two arrays, X and Y, construct the Cauchy matrix C (Cij =1/(xi - yj))", + "h47": "hint: np.subtract.outer", "a47": """ """, - "q48": "", - "h48": "hint: ", + "q48": "Print the minimum and maximum representable value for each numpy scalar type (★★☆)", + "h48": "hint: np.iinfo, np.finfo, eps", "a48": """ """, - "q49": "", - "h49": "hint: ", + "q49": "How to print all the values of an array? (★★☆)", + "h49": "hint: np.set_printoptions", "a49": """ """, - "q50": "", - "h50": "hint: ", + "q50": "How to find the closest value (to a given scalar) in a vector? (★★☆)", + "h50": "hint: argmin", "a50": """ """, - "q51": "", - "h51": "hint: ", + "q51": "Create a structured array representing a position (x,y) and a color (r,g,b) (★★☆)", + "h51": "hint: dtype", "a51": """ """, - "q52": "", - "h52": "hint: ", + "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": """ """, - "q53": "", - "h53": "hint: ", + "q53": "How to convert a float (32 bits) array into an integer (32 bits) in place?", + "h53": "hint: astype(copy=False)", "a53": """ """, - "q54": "", - "h54": "hint: ", + "q54": """ +How to read the following file? (★★☆) +``` +1, 2, 3, 4, 5 +6, , , 7, 8 + , , 9,10,11 +``` +""", + "h54": "hint: np.genfromtxt", "a54": """ """, - "q55": "", - "h55": "hint: ", + "q55": "What is the equivalent of enumerate for numpy arrays? (★★☆)", + "h55": "hint: np.ndenumerate, np.ndindex", "a55": """ """, - "q56": "", - "h56": "hint: ", + "q56": "Generate a generic 2D Gaussian-like array (★★☆)", + "h56": "hint: np.meshgrid, np.exp", "a56": """ """, - "q57": "", - "h57": "hint: ", + "q57": "How to randomly place p elements in a 2D array? (★★☆)", + "h57": "hint: np.put, np.random.choice", "a57": """ """, - "q58": "", - "h58": "hint: ", + "q58": "Subtract the mean of each row of a matrix (★★☆)", + "h58": "hint: mean(axis=,keepdims=)", "a58": """ """, - "q59": "", - "h59": "hint: ", + "q59": "How to sort an array by the nth column? (★★☆)", + "h59": "hint: argsort", "a59": """ """, - "q60": "", - "h60": "hint: ", + "q60": "How to tell if a given 2D array has null columns? (★★☆)", + "h60": "hint: any, ~", "a60": """ """, - "q61": "", - "h61": "hint: ", + "q61": "Find the nearest value from a given value in an array (★★☆)", + "h61": "hint: np.abs, argmin, flat", "a61": """ """, - "q62": "", - "h62": "hint: ", + "q62": "Considering two arrays with shape (1,3) and (3,1), how to compute their sum using an iterator? (★★☆)", + "h62": "hint: np.nditer", "a62": """ """, - "q63": "", - "h63": "hint: ", + "q63": "Create an array class that has a name attribute (★★☆)", + "h63": "hint: class method", "a63": """ """, - "q64": "", - "h64": "hint: ", + "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": """ """, - "q65": "", - "h65": "hint: ", + "q65": "How to accumulate elements of a vector (X) to an array (F) based on an index list (I)? (★★★)", + "h65": "hint: np.bincount", "a65": """ """, - "q66": "", - "h66": "hint: ", + "q66": "Considering a (w,h,3) image of (dtype=ubyte), compute the number of unique colors (★★★)", + "h66": "hint: np.unique", "a66": """ """, - "q67": "", - "h67": "hint: ", + "q67": "Considering a four dimensions array, how to get sum over the last two axis at once? (★★★)", + "h67": "hint: sum(axis=(-2,-1))", "a67": """ """, - "q68": "", - "h68": "hint: ", + "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": """ """, - "q69": "", - "h69": "hint: ", + "q69": "How to get the diagonal of a dot product? (★★★)", + "h69": "hint: np.diag", "a69": """ """, - "q70": "", - "h70": "hint: ", + "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": """ """, - "q71": "", - "h71": "hint: ", + "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": """ """, - "q72": "", - "h72": "hint: ", + "q72": "How to swap two rows of an array? (★★★)", + "h72": "hint: array[[]] = array[[]]", "a72": """ """, - "q73": "", - "h73": "hint: ", + "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": """ """, - "q74": "", - "h74": "hint: ", + "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": """ """, - "q75": "", - "h75": "hint: ", + "q75": "How to compute averages using a sliding window over an array? (★★★)", + "h75": "hint: np.cumsum", "a75": """ """, - "q76": "", - "h76": "hint: ", + "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": """ """, - "q77": "", - "h77": "hint: ", + "q77": "How to negate a boolean, or to change the sign of a float inplace? (★★★)", + "h77": "hint: np.logical_not, np.negative", "a77": """ """, - "q78": "", - "h78": "hint: ", + "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": """ """, - "q79": "", - "h79": "hint: ", + "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": """ """, - "q80": "", - "h80": "hint: ", + "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": """ """, - "q81": "", - "h81": "hint: ", + "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": """ """, - "q82": "", - "h82": "hint: ", + "q82": "Compute a matrix rank (★★★) ", + "h82": "hint: np.linalg.svd", "a82": """ """, - "q83": "", - "h83": "hint: ", + "q83": "How to find the most frequent value in an array?", + "h83": "hint: np.bincount, argmax", "a83": """ """, - "q84": "", - "h84": "hint: ", + "q84": "Extract all the contiguous 3x3 blocks from a random 10x10 matrix (★★★)", + "h84": "hint: stride_tricks.as_strided", "a84": """ """, - "q85": "", - "h85": "hint: ", + "q85": "Create a 2D array subclass such that Z[i,j] == Z[j,i] (★★★)", + "h85": "hint: class method", "a85": """ """, - "q86": "", - "h86": "hint: ", + "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": """ """, - "q87": "", - "h87": "hint: ", + "q87": "Consider a 16x16 array, how to get the block-sum (block size is 4x4)? (★★★)", + "h87": "hint: np.add.reduceat", "a87": """ """, - "q88": "", - "h88": "hint: ", + "q88": "How to implement the Game of Life using numpy arrays? (★★★)", + "h88": "No hints provided... ", "a88": """ """, - "q89": "", - "h89": "hint: ", + "q89": "How to get the n largest values of an array (★★★)", + "h89": "hint: np.argsort | np.argpartition", "a89": """ """, - "q90": "", - "h90": "hint: ", + "q90": "Given an arbitrary number of vectors, build the cartesian product " + "(every combinations of every item) (★★★)", + "h90": "hint: np.indices", "a90": """ """, - "q91": "", - "h91": "hint: ", + "q91": "How to create a record array from a regular array? (★★★)", + "h91": "hint: np.core.records.fromarrays", "a91": """ """, - "q92": "", - "h92": "hint: ", + "q92": "Consider a large vector Z, compute Z to the power of 3 using 3 different methods (★★★)", + "h92": "hint: np.power, *, np.einsum", "a92": """ """, - "q93": "", - "h93": "hint: ", + "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": """ """, - "q94": "", - "h94": "hint: ", + "q94": "Considering a 10x3 matrix, extract rows with unequal values (e.g. [2,2,3]) (★★★)", + "h94": "No hints provided...", "a94": """ """, - "q95": "", - "h95": "hint: ", + "q95": "Convert a vector of ints into a matrix binary representation (★★★)", + "h95": "hint: np.unpackbits", "a95": """ """, - "q96": "", - "h96": "hint: ", + "q96": "Given a two dimensional array, how to extract unique rows? (★★★)", + "h96": "hint: np.ascontiguousarray | np.unique", "a96": """ """, - "q97": "", - "h97": "hint: ", + "q97": "Considering 2 vectors A & B, write the einsum equivalent of inner, outer, sum, and mul function (★★★)", + "h97": "hint: np.einsum", "a97": """ """, - "q98": "", - "h98": "hint: ", + "q98": "Considering a path described by two vectors (X,Y), how to sample it using equidistant samples (★★★)?", + "h98": "hint: np.cumsum, np.interp ", "a98": """ """, - "q99": "", - "h99": "hint: ", + "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": """ """, - "q100": "", - "h100": "hint: ", + "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": """ """, } -# #### -# -# (**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) -# From ed93c964a297f0485f54d8aa27394f4940320d7e Mon Sep 17 00:00:00 2001 From: SebastianoF Date: Mon, 18 Nov 2019 23:12:56 +0000 Subject: [PATCH 08/22] dict to 100 questions, hints and answers done --- questsions_dict.py | 619 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 569 insertions(+), 50 deletions(-) diff --git a/questsions_dict.py b/questsions_dict.py index f66efc9d..e498cc7a 100644 --- a/questsions_dict.py +++ b/questsions_dict.py @@ -10,91 +10,111 @@ "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? (★☆☆)" @@ -109,54 +129,79 @@ "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": """ @@ -172,7 +217,11 @@ "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? (★☆☆) @@ -187,7 +236,12 @@ "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? @@ -201,25 +255,41 @@ "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? (★☆☆) @@ -230,133 +300,216 @@ "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 using 5 different methods (★★☆)", "h36": "hint: %, np.floor, np.ceil, astype, np.trunc", "a36": """ +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)) """, "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": """ - +np.set_printoptions(threshold=np.nan) +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? (★★☆) @@ -369,138 +522,275 @@ "h54": "hint: np.genfromtxt", "a54": """ +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) """, "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 " @@ -508,13 +798,27 @@ "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 " @@ -522,135 +826,335 @@ "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 " @@ -658,7 +1162,15 @@ "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 " @@ -666,6 +1178,13 @@ "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) """, } From 7d1b400e8d1b44bf151764c47152eebf960d3d23 Mon Sep 17 00:00:00 2001 From: SebastianoF Date: Thu, 21 Nov 2019 22:44:23 +0000 Subject: [PATCH 09/22] update textfile scheleton, todo added --- TODO.txt | 14 ++++++++++++++ update_textfile.py | 22 ++++++++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 TODO.txt create mode 100644 update_textfile.py diff --git a/TODO.txt b/TODO.txt new file mode 100644 index 00000000..5ed3f59d --- /dev/null +++ b/TODO.txt @@ -0,0 +1,14 @@ +v get a single python file with all questions, hints and answers in a single dictionary. +v implement 3 functions: question, hint and solution, printing the required question, hint and solution in an `initialise.py` file. + ++ produce one jupyter with all the questions, the initialise.py in the first cell creating the full notebook: numpy_100_consecutive.ipynb ++ produce one jupyter notebook with the random game. initialise must also have a pick() function to get a random question: numpy_100_random.ipynb. ++ produce the method to create the md files (questions, questions with hints, questions with solutions, questions with hints and solution) ++ add to this method the a cli interface for quick manipulation. ++ produce and leave the files created with the cli. ++ cleanup. Erase all the other notebook but the two new 2 jupyter notebooks - numpy_100_consecutive.ipynb numpy_100_random.ipynb. ++ change the instructions in the readme to create the markdown files with hints with hints and answers and with only questions. ++ send PR. + +Utilities: +https://stackoverflow.com/questions/13614783/programmatically-add-cells-to-an-ipython-notebook-for-report-generation \ No newline at end of file diff --git a/update_textfile.py b/update_textfile.py new file mode 100644 index 00000000..e534118b --- /dev/null +++ b/update_textfile.py @@ -0,0 +1,22 @@ +""" +Module to automatically create the 100 exercises (with or without hints and answers) +as a textfile format (markdown format). +""" + +from .questsions_dict import qha + + +HEADER = "DO NOT MODIFY. \nFile automatically created. To modify change the content of questions_dict.py and then" \ + "re create via the python script 'create_as_textfile.py'. Search the documentation for more info." + + +def to_markdown(destination_filename, with_ints=False, with_answers=False): + pass + + +def to_rst(destination_filename, with_ints=False, with_answers=False): + pass + + +def cli(): + pass From b531b17e0085df2a6fc2bb4e33ce5a86d6f80ea0 Mon Sep 17 00:00:00 2001 From: SebastianoF Date: Thu, 21 Nov 2019 22:49:14 +0000 Subject: [PATCH 10/22] pick function implemented --- TODO.txt | 4 ++-- initalise.py | 9 ++++++++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/TODO.txt b/TODO.txt index 5ed3f59d..82d0c3ca 100644 --- a/TODO.txt +++ b/TODO.txt @@ -1,8 +1,8 @@ v get a single python file with all questions, hints and answers in a single dictionary. v implement 3 functions: question, hint and solution, printing the required question, hint and solution in an `initialise.py` file. - +v initialise must also have a pick() function for a random game. + produce one jupyter with all the questions, the initialise.py in the first cell creating the full notebook: numpy_100_consecutive.ipynb -+ produce one jupyter notebook with the random game. initialise must also have a pick() function to get a random question: numpy_100_random.ipynb. ++ produce one jupyter notebook with the random game: numpy_100_random.ipynb. + produce the method to create the md files (questions, questions with hints, questions with solutions, questions with hints and solution) + add to this method the a cli interface for quick manipulation. + produce and leave the files created with the cli. diff --git a/initalise.py b/initalise.py index 46e4d923..f193fec8 100644 --- a/initalise.py +++ b/initalise.py @@ -1,8 +1,10 @@ +import numpy as np + from questsions_dict import qha def question(n): - print(qha[f'q{n}']) + print(f'{n}. ' + qha[f'q{n}']) def hint(n): @@ -11,3 +13,8 @@ def hint(n): def answer(n): print(qha[f'a{n}']) + + +def pick(): + n = np.random.randint(1, 100) + question(n) From 6627ab7e93406242f964c1feb3568557048ec5e0 Mon Sep 17 00:00:00 2001 From: SebastianoF Date: Sat, 23 Nov 2019 20:05:14 +0000 Subject: [PATCH 11/22] geneartors added and new md and jupyter files created --- .gitignore | 1 + 100_Numpy_exercises.ipynb | 2174 ----------------- 100_Numpy_exercises_with_hint.ipynb | 1619 ------------ 100_Numpy_exercises_with_hint.md | 634 ----- README.md | 4 + TODO.txt | 14 - questsions_dict.py => data_source.py | 43 +- generators.py | 97 + initalise.py => initialise.py | 8 +- ...cises_no_solution.ipynb => numpy_100.ipynb | 538 ++-- ...y_exercises_no_solution.md => numpy_100.md | 257 +- numpy_100_random.ipynb | 55 + numpy_100_with_hints.md | 254 ++ numpy_100_with_hints_with_solutions.md | 1376 +++++++++++ ...xercises.md => numpy_100_with_solutions.md | 410 +++- requirements.txt | 1 + update_textfile.py | 22 - 17 files changed, 2300 insertions(+), 5207 deletions(-) delete mode 100644 100_Numpy_exercises.ipynb delete mode 100644 100_Numpy_exercises_with_hint.ipynb delete mode 100644 100_Numpy_exercises_with_hint.md delete mode 100644 TODO.txt rename questsions_dict.py => data_source.py (96%) create mode 100644 generators.py rename initalise.py => initialise.py (53%) rename 100_Numpy_exercises_no_solution.ipynb => numpy_100.ipynb (78%) rename 100_Numpy_exercises_no_solution.md => numpy_100.md (80%) create mode 100644 numpy_100_random.ipynb create mode 100644 numpy_100_with_hints.md create mode 100644 numpy_100_with_hints_with_solutions.md rename 100_Numpy_exercises.md => numpy_100_with_solutions.md (90%) delete mode 100644 update_textfile.py diff --git a/.gitignore b/.gitignore index 49c8b28b..28663f82 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ __pycache__ venv .idea .vscode +Untitled.ipynb diff --git a/100_Numpy_exercises.ipynb b/100_Numpy_exercises.ipynb deleted file mode 100644 index 3f23dc0b..00000000 --- a/100_Numpy_exercises.ipynb +++ /dev/null @@ -1,2174 +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": [ - "import numpy as np" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 2. Print the numpy version and the configuration (★☆☆)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "print(np.__version__)\n", - "np.show_config()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 3. Create a null vector of size 10 (★☆☆)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "Z = np.zeros(10)\n", - "print(Z)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 4. How to find the memory size of any array (★☆☆)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "Z = np.zeros((10,10))\n", - "print(\"%d bytes\" % (Z.size * Z.itemsize))" - ] - }, - { - "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": [ - "%run `python -c \"import numpy; numpy.info(numpy.add)\"`" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 6. Create a null vector of size 10 but the fifth value which is 1 (★☆☆)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "Z = np.zeros(10)\n", - "Z[4] = 1\n", - "print(Z)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 7. Create a vector with values ranging from 10 to 49 (★☆☆)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "Z = np.arange(10,50)\n", - "print(Z)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 8. Reverse a vector (first element becomes last) (★☆☆)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "Z = np.arange(50)\n", - "Z = Z[::-1]\n", - "print(Z)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 9. Create a 3x3 matrix with values ranging from 0 to 8 (★☆☆)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "Z = np.arange(9).reshape(3,3)\n", - "print(Z)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 10. Find indices of non-zero elements from \\[1,2,0,0,4,0\\] (★☆☆)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "nz = np.nonzero([1,2,0,0,4,0])\n", - "print(nz)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 11. Create a 3x3 identity matrix (★☆☆)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "Z = np.eye(3)\n", - "print(Z)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 12. Create a 3x3x3 array with random values (★☆☆)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "Z = np.random.random((3,3,3))\n", - "print(Z)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 13. Create a 10x10 array with random values and find the minimum and maximum values (★☆☆)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "Z = np.random.random((10,10))\n", - "Zmin, Zmax = Z.min(), Z.max()\n", - "print(Zmin, Zmax)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 14. Create a random vector of size 30 and find the mean value (★☆☆)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "Z = np.random.random(30)\n", - "m = Z.mean()\n", - "print(m)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 15. Create a 2d array with 1 on the border and 0 inside (★☆☆)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "Z = np.ones((10,10))\n", - "Z[1:-1,1:-1] = 0\n", - "print(Z)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 16. How to add a border (filled with 0's) around an existing array? (★☆☆)" - ] - }, - { - "cell_type": "code", - "execution_count": 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)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 17. What is the result of the following expression? (★☆☆)" - ] - }, - { - "cell_type": "code", - "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)" - ] - }, - { - "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": {}, - "outputs": [], - "source": [ - "Z = np.diag(1+np.arange(4),k=-1)\n", - "print(Z)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 19. Create a 8x8 matrix and fill it with a checkerboard pattern (★☆☆)" - ] - }, - { - "cell_type": "code", - "execution_count": 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)" - ] - }, - { - "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": {}, - "outputs": [], - "source": [ - "print(np.unravel_index(99,(6,7,8)))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 21. Create a checkerboard 8x8 matrix using the tile function (★☆☆)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "Z = np.tile( np.array([[0,1],[1,0]]), (4,4))\n", - "print(Z)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 22. Normalize a 5x5 random matrix (★☆☆)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "Z = np.random.random((5,5))\n", - "Z = (Z - np.mean (Z)) / (np.std (Z))\n", - "print(Z)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 23. Create a custom dtype that describes a color as four unsigned bytes (RGBA) (★☆☆)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "color = np.dtype([(\"r\", np.ubyte, 1),\n", - " (\"g\", np.ubyte, 1),\n", - " (\"b\", np.ubyte, 1),\n", - " (\"a\", np.ubyte, 1)])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 24. Multiply a 5x3 matrix by a 3x2 matrix (real matrix product) (★☆☆)" - ] - }, - { - "cell_type": "code", - "execution_count": 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))" - ] - }, - { - "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": {}, - "outputs": [], - "source": [ - "# Author: Evgeni Burovski\n", - "\n", - "Z = np.arange(11)\n", - "Z[(3 < Z) & (Z <= 8)] *= -1\n", - "print(Z)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 26. What is the output of the following script? (★☆☆)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Author: Jake VanderPlas\n", - "\n", - "print(sum(range(5),-1))\n", - "from numpy import *\n", - "print(sum(range(5),-1))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 27. Consider an integer vector Z, which of these expressions are legal? (★☆☆)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "Z**Z\n", - "2 << Z >> 2\n", - "Z <- Z\n", - "1j*Z\n", - "Z/1/1\n", - "ZZ" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 28. What are the result of the following expressions?" - ] - }, - { - "cell_type": "code", - "execution_count": 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))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 29. How to round away from zero a float array ? (★☆☆)" - ] - }, - { - "cell_type": "code", - "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))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 30. How to find common values between two arrays? (★☆☆)" - ] - }, - { - "cell_type": "code", - "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))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 31. How to ignore all numpy warnings (not recommended)? (★☆☆)" - ] - }, - { - "cell_type": "code", - "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" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 32. Is the following expressions true? (★☆☆)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "np.sqrt(-1) == np.emath.sqrt(-1)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 33. How to get the dates of yesterday, today and tomorrow? (★☆☆)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "yesterday = np.datetime64('today', 'D') - np.timedelta64(1, 'D')\n", - "today = np.datetime64('today', 'D')\n", - "tomorrow = np.datetime64('today', 'D') + np.timedelta64(1, 'D')" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 34. How to get all the dates corresponding to the month of July 2016? (★★☆)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "Z = np.arange('2016-07', '2016-08', dtype='datetime64[D]')\n", - "print(Z)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 35. How to compute ((A+B)\\*(-A/2)) in place (without copy)? (★★☆)" - ] - }, - { - "cell_type": "code", - "execution_count": 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)" - ] - }, - { - "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": {}, - "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))" - ] - }, - { - "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": {}, - "outputs": [], - "source": [ - "Z = np.zeros((5,5))\n", - "Z += np.arange(5)\n", - "print(Z)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 38. Consider a generator function that generates 10 integers and use it to build an array (★☆☆)" - ] - }, - { - "cell_type": "code", - "execution_count": 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)" - ] - }, - { - "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": {}, - "outputs": [], - "source": [ - "Z = np.linspace(0,1,11,endpoint=False)[1:]\n", - "print(Z)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 40. Create a random vector of size 10 and sort it (★★☆)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "Z = np.random.random(10)\n", - "Z.sort()\n", - "print(Z)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 41. How to sum a small array faster than np.sum? (★★☆)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Author: Evgeni Burovski\n", - "\n", - "Z = np.arange(10)\n", - "np.add.reduce(Z)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 42. Consider two random array A and B, check if they are equal (★★☆)" - ] - }, - { - "cell_type": "code", - "execution_count": 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)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 43. Make an array immutable (read-only) (★★☆)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "Z = np.zeros(10)\n", - "Z.flags.writeable = False\n", - "Z[0] = 1" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 44. Consider a random 10x2 matrix representing cartesian coordinates, convert them to polar coordinates (★★☆)" - ] - }, - { - "cell_type": "code", - "execution_count": 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)" - ] - }, - { - "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": {}, - "outputs": [], - "source": [ - "Z = np.random.random(10)\n", - "Z[Z.argmax()] = 0\n", - "print(Z)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 46. Create a structured array with `x` and `y` coordinates covering the \\[0,1\\]x\\[0,1\\] area (★★☆)" - ] - }, - { - "cell_type": "code", - "execution_count": 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)" - ] - }, - { - "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": {}, - "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))" - ] - }, - { - "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": {}, - "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)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 49. How to print all the values of an array? (★★☆)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import sys\n", - "np.set_printoptions(threshold=sys.maxsize)\n", - "Z = np.zeros(1001) # 1000 is the default threshold which trigger summarization\n", - "print(Z)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 50. How to find the closest value (to a given scalar) in a vector? (★★☆)" - ] - }, - { - "cell_type": "code", - "execution_count": 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])" - ] - }, - { - "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": {}, - "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)" - ] - }, - { - "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": {}, - "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)" - ] - }, - { - "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": {}, - "outputs": [], - "source": [ - "Z = np.arange(10, dtype=np.float32)\n", - "Z = Z.astype(np.int32, copy=False)\n", - "print(Z)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 54. How to read the following file? (★★☆)" - ] - }, - { - "cell_type": "code", - "execution_count": 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)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 55. What is the equivalent of enumerate for numpy arrays? (★★☆)" - ] - }, - { - "cell_type": "code", - "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])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 56. Generate a generic 2D Gaussian-like array (★★☆)" - ] - }, - { - "cell_type": "code", - "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)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 57. How to randomly place p elements in a 2D array? (★★☆)" - ] - }, - { - "cell_type": "code", - "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)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 58. Subtract the mean of each row of a matrix (★★☆)" - ] - }, - { - "cell_type": "code", - "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)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 59. How to sort an array by the nth column? (★★☆)" - ] - }, - { - "cell_type": "code", - "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()])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 60. How to tell if a given 2D array has null columns? (★★☆)" - ] - }, - { - "cell_type": "code", - "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())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 61. Find the nearest value from a given value in an array (★★☆)" - ] - }, - { - "cell_type": "code", - "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)" - ] - }, - { - "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": {}, - "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])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 63. Create an array class that has a name attribute (★★☆)" - ] - }, - { - "cell_type": "code", - "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)" - ] - }, - { - "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": {}, - "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)" - ] - }, - { - "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": {}, - "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)" - ] - }, - { - "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": {}, - "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)" - ] - }, - { - "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": {}, - "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)" - ] - }, - { - "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": {}, - "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())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 69. How to get the diagonal of a dot product? (★★★)" - ] - }, - { - "cell_type": "code", - "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)" - ] - }, - { - "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": {}, - "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)" - ] - }, - { - "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": [ - "A = np.ones((5,5,3))\n", - "B = 2*np.ones((5,5))\n", - "print(A * B[:,:,None])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 72. How to swap two rows of an array? (★★★)" - ] - }, - { - "cell_type": "code", - "execution_count": 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)" - ] - }, - { - "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": {}, - "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)" - ] - }, - { - "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": {}, - "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)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 75. How to compute averages using a sliding window over an array? (★★★)" - ] - }, - { - "cell_type": "code", - "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))" - ] - }, - { - "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": {}, - "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)" - ] - }, - { - "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": {}, - "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)" - ] - }, - { - "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": [ - "def distance(P0, P1, p):\n", - " T = P1 - P0\n", - " L = (T**2).sum(axis=1)\n", - " U = -((P0[:,0]-p[...,0])*T[:,0] + (P0[:,1]-p[...,1])*T[:,1]) / L\n", - " U = U.reshape(len(U),1)\n", - " D = P0 + U*T - p\n", - " return np.sqrt((D**2).sum(axis=1))\n", - "\n", - "P0 = np.random.uniform(-10,10,(10,2))\n", - "P1 = np.random.uniform(-10,10,(10,2))\n", - "p = np.random.uniform(-10,10,( 1,2))\n", - "print(distance(P0, P1, p))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 79. Consider 2 sets of points P0,P1 describing lines (2d) and a set of points P, how to compute distance from each point j (P\\[j\\]) to each line i (P0\\[i\\],P1\\[i\\])? (★★★)" - ] - }, - { - "cell_type": "code", - "execution_count": 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]))" - ] - }, - { - "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": {}, - "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)" - ] - }, - { - "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": {}, - "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)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 82. Compute a matrix rank (★★★)" - ] - }, - { - "cell_type": "code", - "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)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 83. How to find the most frequent value in an array?" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "Z = np.random.randint(0,10,50)\n", - "print(np.bincount(Z).argmax())" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 84. Extract all the contiguous 3x3 blocks from a random 10x10 matrix (★★★)" - ] - }, - { - "cell_type": "code", - "execution_count": 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)" - ] - }, - { - "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": {}, - "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)" - ] - }, - { - "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": {}, - "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." - ] - }, - { - "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": {}, - "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)" - ] - }, - { - "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": [ - "# Author: Nicolas Rougier\n", - "\n", - "def iterate(Z):\n", - " # Count neighbours\n", - " N = (Z[0:-2,0:-2] + Z[0:-2,1:-1] + Z[0:-2,2:] +\n", - " Z[1:-1,0:-2] + Z[1:-1,2:] +\n", - " Z[2: ,0:-2] + Z[2: ,1:-1] + Z[2: ,2:])\n", - "\n", - " # Apply rules\n", - " birth = (N==3) & (Z[1:-1,1:-1]==0)\n", - " survive = ((N==2) | (N==3)) & (Z[1:-1,1:-1]==1)\n", - " Z[...] = 0\n", - " Z[1:-1,1:-1][birth | survive] = 1\n", - " return Z\n", - "\n", - "Z = np.random.randint(0,2,(50,50))\n", - "for i in range(100): Z = iterate(Z)\n", - "print(Z)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 89. How to get the n largest values of an array (★★★)" - ] - }, - { - "cell_type": "code", - "execution_count": 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]])" - ] - }, - { - "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": { - "scrolled": true - }, - "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])))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 91. How to create a record array from a regular array? (★★★)" - ] - }, - { - "cell_type": "code", - "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)" - ] - }, - { - "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": {}, - "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)" - ] - }, - { - "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": {}, - "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)" - ] - }, - { - "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": [ - "# Author: Robert Kern\n", - "\n", - "Z = np.random.randint(0,5,(10,3))\n", - "print(Z)\n", - "# solution for arrays of all dtypes (including string arrays and record arrays)\n", - "E = np.all(Z[:,1:] == Z[:,:-1], axis=1)\n", - "U = Z[~E]\n", - "print(U)\n", - "# soluiton for numerical arrays only, will work for any number of columns in Z\n", - "U = Z[Z.max(axis=1) != Z.min(axis=1),:]\n", - "print(U)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 95. Convert a vector of ints into a matrix binary representation (★★★)" - ] - }, - { - "cell_type": "code", - "execution_count": 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))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 96. Given a two dimensional array, how to extract unique rows? (★★★)" - ] - }, - { - "cell_type": "code", - "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)" - ] - }, - { - "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": {}, - "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)" - ] - }, - { - "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": [ - "# Author: Bas Swinckels\n", - "\n", - "phi = np.arange(0, 10*np.pi, 0.1)\n", - "a = 1\n", - "x = a*phi*np.cos(phi)\n", - "y = a*phi*np.sin(phi)\n", - "\n", - "dr = (np.diff(x)**2 + np.diff(y)**2)**.5 # segment lengths\n", - "r = np.zeros_like(x)\n", - "r[1:] = np.cumsum(dr) # integrate path\n", - "r_int = np.linspace(0, r.max(), 200) # regular spaced path\n", - "x_int = np.interp(r_int, r, x) # integrate path\n", - "y_int = np.interp(r_int, r, y)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### 99. Given an integer n and a 2D array X, select from X the rows which can be interpreted as draws from a multinomial distribution with n degrees, i.e., the rows which only contain integers and which sum to n. (★★★)" - ] - }, - { - "cell_type": "code", - "execution_count": 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])" - ] - }, - { - "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": {}, - "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)" - ] - } - ], - "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.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/README.md b/README.md index 28d33118..9502df6b 100644 --- a/README.md +++ b/README.md @@ -7,5 +7,9 @@ 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 dictionary in `data_source.py`. +To modify the content of these files, chance the text in `data_source.py` and then re-generate them via the +method into the `generators.py` module. + 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/TODO.txt b/TODO.txt deleted file mode 100644 index 82d0c3ca..00000000 --- a/TODO.txt +++ /dev/null @@ -1,14 +0,0 @@ -v get a single python file with all questions, hints and answers in a single dictionary. -v implement 3 functions: question, hint and solution, printing the required question, hint and solution in an `initialise.py` file. -v initialise must also have a pick() function for a random game. -+ produce one jupyter with all the questions, the initialise.py in the first cell creating the full notebook: numpy_100_consecutive.ipynb -+ produce one jupyter notebook with the random game: numpy_100_random.ipynb. -+ produce the method to create the md files (questions, questions with hints, questions with solutions, questions with hints and solution) -+ add to this method the a cli interface for quick manipulation. -+ produce and leave the files created with the cli. -+ cleanup. Erase all the other notebook but the two new 2 jupyter notebooks - numpy_100_consecutive.ipynb numpy_100_random.ipynb. -+ change the instructions in the readme to create the markdown files with hints with hints and answers and with only questions. -+ send PR. - -Utilities: -https://stackoverflow.com/questions/13614783/programmatically-add-cells-to-an-ipython-notebook-for-report-generation \ No newline at end of file diff --git a/questsions_dict.py b/data_source.py similarity index 96% rename from questsions_dict.py rename to data_source.py index e498cc7a..5559f41e 100644 --- a/questsions_dict.py +++ b/data_source.py @@ -1,5 +1,28 @@ +HEADER = """ +# 100 numpy exercises -qha = { +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_INSTRUCTIONS = "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_INSTRUCTIONS_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." + + +QHA = { "q1": "Import the numpy package under the name `np` (★☆☆)", "h1": "hint: import … as ", "a1": @@ -116,16 +139,16 @@ Z = np.pad(Z, pad_width=1, mode='constant', constant_values=0) print(Z) """, - "q17": """ -What is the result of the following expression? (★☆☆)" + "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 -# ```""", +0.3 == 3 * 0.1 +```""", "h17": "hint: NaN = not a number, inf = infinity", "a17": """ @@ -204,7 +227,7 @@ print(Z) """, - "q26": """ + "q26": """\ What is the output of the following script? (★☆☆) ```python # Author: Jake VanderPlas @@ -223,7 +246,7 @@ from numpy import * print(sum(range(5),-1)) """, - "q27": """ + "q27": """\ Consider an integer vector Z, which of these expressions are legal? (★☆☆) ```python Z**Z @@ -243,7 +266,7 @@ Z/1/1 ZZ """, - "q28": """ + "q28": """\ What are the result of the following expressions? ```python np.array(0) / np.array(0) @@ -291,7 +314,7 @@ nz = np.nonzero([1,2,0,0,4,0]) print(nz) """, - "q32": """ + "q32": """\ Is the following expressions true? (★☆☆) ```python np.sqrt(-1) == np.emath.sqrt(-1) @@ -511,7 +534,7 @@ def generate(): Z = Z.astype(np.int32, copy=False) print(Z) """, - "q54": """ + "q54": """\ How to read the following file? (★★☆) ``` 1, 2, 3, 4, 5 diff --git a/generators.py b/generators.py new file mode 100644 index 00000000..8e80fd65 --- /dev/null +++ b/generators.py @@ -0,0 +1,97 @@ +import os +import nbformat as nbf +import mdutils + +import data_source as ds + + +def create_jupyter_notebook(destination_filename='numpy_100.ipynb'): + """ Programmatically create jupyter notebook with the questions (and hints and solutions if required) + saved under data_source.py """ + + # Create cells sequence + nb = nbf.v4.new_notebook() + + nb['cells'] = [] + + # - Add header: + nb['cells'].append(nbf.v4.new_markdown_cell(ds.HEADER)) + nb['cells'].append(nbf.v4.new_markdown_cell(ds.SUB_HEADER)) + nb['cells'].append(nbf.v4.new_markdown_cell(ds.JUPYTER_INSTRUCTIONS)) + + # - 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}. ' + ds.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='numpy_100_random.ipynb'): + """ Programmatically create jupyter notebook with the questions (and hints and solutions if required) + saved under data_source.py """ + + # Create cells sequence + nb = nbf.v4.new_notebook() + + nb['cells'] = [] + + # - Add header: + nb['cells'].append(nbf.v4.new_markdown_cell(ds.HEADER)) + nb['cells'].append(nbf.v4.new_markdown_cell(ds.SUB_HEADER)) + nb['cells'].append(nbf.v4.new_markdown_cell(ds.JUPYTER_INSTRUCTIONS_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='numpy_100', 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(ds.HEADER) + mdfile.write(ds.SUB_HEADER) + + # Add questions (and hint or answers if required) + for n in range(1, 101): + mdfile.new_header(title=f"{n}. {ds.QHA[f'q{n}']}", level=4) + if with_hints: + mdfile.write(f"`{ds.QHA[f'h{n}']}`") + if with_solutions: + mdfile.insert_code(ds.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 diff --git a/initalise.py b/initialise.py similarity index 53% rename from initalise.py rename to initialise.py index f193fec8..5ed7a008 100644 --- a/initalise.py +++ b/initialise.py @@ -1,18 +1,18 @@ import numpy as np -from questsions_dict import qha +import data_source as ds def question(n): - print(f'{n}. ' + qha[f'q{n}']) + print(f'{n}. ' + ds.QHA[f'q{n}']) def hint(n): - print(qha[f'h{n}']) + print(ds.QHA[f'h{n}']) def answer(n): - print(qha[f'a{n}']) + print(ds.QHA[f'a{n}']) def pick(): diff --git a/100_Numpy_exercises_no_solution.ipynb b/numpy_100.ipynb similarity index 78% rename from 100_Numpy_exercises_no_solution.ipynb rename to numpy_100.ipynb index 13fccbe7..9b124c03 100644 --- a/100_Numpy_exercises_no_solution.ipynb +++ b/numpy_100.ipynb @@ -4,12 +4,39 @@ "cell_type": "markdown", "metadata": {}, "source": [ + "\n", "# 100 numpy exercises\n", "\n", - "This is a collection of exercises that have been collected in the numpy mailing list, on stack overflow and in the numpy documentation. The goal of this collection is to offer a quick reference for both old and new users but also to provide a set of exercises for those who teach.\n", + "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 \n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "File automatically generated. See the documentation to update the questions programmatically." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "%run initialise.py" ] }, { @@ -22,9 +49,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -38,9 +63,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -54,9 +77,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -64,15 +85,13 @@ "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 (★☆☆)" ] }, { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -80,15 +99,13 @@ "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": [] }, @@ -96,15 +113,13 @@ "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 (★☆☆)" ] }, { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -112,15 +127,13 @@ "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 (★☆☆)" ] }, { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -128,15 +141,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "#### 8. Reverse a vector (first element becomes last) (★☆☆)" + "#### 8. Reverse a vector (first element becomes last) (★☆☆)" ] }, { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -144,15 +155,13 @@ "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 (★☆☆)" ] }, { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -160,15 +169,13 @@ "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] (★☆☆)" ] }, { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -182,9 +189,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -198,9 +203,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -214,9 +217,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -230,9 +231,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -246,9 +245,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -262,9 +259,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -272,19 +267,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "#### 17. What is the result of the following expression? (★☆☆)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ + "#### 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", + "np.nan in set([np.nan])\n", "0.3 == 3 * 0.1\n", "```" ] @@ -292,9 +281,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -308,9 +295,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -324,9 +309,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -340,9 +323,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -356,9 +337,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -372,9 +351,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -388,9 +365,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -404,9 +379,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -420,9 +393,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -430,28 +401,20 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "#### 26. What is the output of the following script? (★☆☆)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ + "#### 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", - "```" + "```\n" ] }, { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -459,13 +422,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "#### 27. Consider an integer vector Z, which of these expressions are legal? (★☆☆)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ + "#### 27. Consider an integer vector Z, which of these expressions are legal? (★☆☆)\n", "```python\n", "Z**Z\n", "2 << Z >> 2\n", @@ -479,9 +436,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -489,26 +444,18 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "#### 28. What are the result of the following expressions?" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ + "#### 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", - "```" + "```\n" ] }, { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -522,9 +469,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -538,9 +483,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -554,9 +497,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -564,24 +505,16 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "#### 32. Is the following expressions true? (★☆☆)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ + "#### 32. Is the following expressions true? (★☆☆)\n", "```python\n", "np.sqrt(-1) == np.emath.sqrt(-1)\n", - "```" + "```\n" ] }, { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -595,9 +528,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -611,9 +542,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -621,15 +550,13 @@ "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)? (★★☆)" ] }, { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -643,9 +570,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -659,9 +584,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -675,9 +598,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -691,9 +612,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -707,9 +626,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -723,9 +640,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -739,9 +654,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -755,9 +668,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -771,9 +682,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -787,9 +696,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -797,15 +704,13 @@ "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 (★★☆)" ] }, { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -813,15 +718,13 @@ "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))" ] }, { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -835,9 +738,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -851,9 +752,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -867,9 +766,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -883,9 +780,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -899,9 +794,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -915,9 +808,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -925,26 +816,18 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "#### 54. How to read the following file? (★★☆)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ + "#### 54. How to read the following file? (★★☆)\n", "```\n", "1, 2, 3, 4, 5\n", "6, , , 7, 8\n", " , , 9,10,11\n", - "```" + "```\n" ] }, { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -958,9 +841,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -974,9 +855,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -990,9 +869,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -1006,9 +883,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -1022,9 +897,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -1038,9 +911,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -1054,9 +925,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -1070,9 +939,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -1086,9 +953,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -1102,9 +967,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -1118,9 +981,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -1134,9 +995,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -1150,9 +1009,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -1166,9 +1023,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -1182,9 +1037,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -1192,15 +1045,13 @@ "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? (★★★)" ] }, { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -1214,9 +1065,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -1230,9 +1079,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -1246,9 +1093,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -1262,9 +1107,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -1278,9 +1121,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -1288,15 +1129,13 @@ "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]) (★★★)" ] }, { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -1310,9 +1149,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -1320,15 +1157,13 @@ "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])? (★★★)" ] }, { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -1336,15 +1171,13 @@ "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])? (★★★)" ] }, { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -1358,9 +1191,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -1368,15 +1199,13 @@ "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]]? (★★★)" ] }, { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -1384,15 +1213,13 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "#### 82. Compute a matrix rank (★★★)" + "#### 82. Compute a matrix rank (★★★) " ] }, { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -1406,9 +1233,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -1422,9 +1247,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -1432,15 +1255,13 @@ "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] (★★★)" ] }, { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -1454,9 +1275,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -1470,9 +1289,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -1486,9 +1303,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -1502,9 +1317,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -1518,10 +1331,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false, - "scrolled": true - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -1535,9 +1345,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -1551,9 +1359,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -1567,9 +1373,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -1577,15 +1381,13 @@ "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]) (★★★)" ] }, { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -1599,9 +1401,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -1615,9 +1415,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -1631,9 +1429,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -1647,9 +1443,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -1663,9 +1457,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] }, @@ -1679,32 +1471,30 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": false - }, + "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { - "display_name": "Python 2", + "display_name": "Python 3", "language": "python", - "name": "python2" + "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", - "version": 2 + "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.12" + "pygments_lexer": "ipython3", + "version": "3.6.8" } }, "nbformat": 4, - "nbformat_minor": 0 + "nbformat_minor": 2 } diff --git a/100_Numpy_exercises_no_solution.md b/numpy_100.md similarity index 80% rename from 100_Numpy_exercises_no_solution.md rename to numpy_100.md index 44b3fbe5..07b7c25a 100644 --- a/100_Numpy_exercises_no_solution.md +++ b/numpy_100.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 -#### 1. Import the numpy package under the name `np` (★☆☆) +# 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. -#### 2. Print the numpy version and the configuration (★☆☆) +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` (★☆☆) +#### 2. Print the numpy version and the configuration (★☆☆) #### 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? (★☆☆) -#### 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 (★☆☆) -#### 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\] (★☆☆) +#### 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] (★☆☆) #### 11. Create a 3x3 identity matrix (★☆☆) - - #### 12. Create a 3x3x3 array with random values (★☆☆) - - #### 13. Create a 10x10 array with random values and find the minimum and maximum values (★☆☆) - - #### 14. Create a random vector of size 30 and find the mean value (★☆☆) - - #### 15. Create a 2d array with 1 on the border and 0 inside (★☆☆) - - #### 16. How to add a border (filled with 0's) around an existing array? (★☆☆) - - #### 17. What is the result of the following expression? (★☆☆) - - ```python 0 * np.nan np.nan == np.nan @@ -88,39 +56,21 @@ np.nan in set([np.nan]) #### 18. Create a 5x5 matrix with values 1,2,3,4 just below the diagonal (★☆☆) - - #### 19. Create a 8x8 matrix and fill it with a checkerboard pattern (★☆☆) - - #### 20. Consider a (6,7,8) shape array, what is the index (x,y,z) of the 100th element? - - #### 21. Create a checkerboard 8x8 matrix using the tile function (★☆☆) - - #### 22. Normalize a 5x5 random matrix (★☆☆) - - #### 23. Create a custom dtype that describes a color as four unsigned bytes (RGBA) (★☆☆) - - #### 24. Multiply a 5x3 matrix by a 3x2 matrix (real matrix product) (★☆☆) - - #### 25. Given a 1D array, negate all elements which are between 3 and 8, in place. (★☆☆) - - #### 26. What is the output of the following script? (★☆☆) - - ```python # Author: Jake VanderPlas @@ -129,9 +79,8 @@ from numpy import * print(sum(range(5),-1)) ``` -#### 27. Consider an integer vector Z, which of these expressions are legal? (★☆☆) - +#### 27. Consider an integer vector Z, which of these expressions are legal? (★☆☆) ```python Z**Z 2 << Z >> 2 @@ -142,305 +91,163 @@ 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 ? (★☆☆) - +#### 29. How to round away from zero a float array ? (★☆☆) #### 30. How to find common values between two arrays? (★☆☆) - - #### 31. How to ignore all numpy warnings (not recommended)? (★☆☆) - - #### 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? (★☆☆) - +#### 33. How to get the dates of yesterday, today and tomorrow? (★☆☆) #### 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)? (★★☆) - - +#### 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 (★★☆) - - #### 37. Create a 5x5 matrix with row values ranging from 0 to 4 (★★☆) - - #### 38. Consider a generator function that generates 10 integers and use it to build an array (★☆☆) - - #### 39. Create a vector of size 10 with values ranging from 0 to 1, both excluded (★★☆) - - #### 40. Create a random vector of size 10 and sort it (★★☆) - - #### 41. How to sum a small array faster than np.sum? (★★☆) - - #### 42. Consider two random array A and B, check if they are equal (★★☆) - - #### 43. Make an array immutable (read-only) (★★☆) - - #### 44. Consider a random 10x2 matrix representing cartesian coordinates, convert them to polar coordinates (★★☆) +#### 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 (★★☆) -#### 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)) - - +#### 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 (★★☆) - - #### 49. How to print all the values of an array? (★★☆) - - #### 50. How to find the closest value (to a given scalar) in a vector? (★★☆) - - #### 51. Create a structured array representing a position (x,y) and a color (r,g,b) (★★☆) - - #### 52. Consider a random vector with shape (100,2) representing coordinates, find point by point distances (★★☆) - - #### 53. How to convert a float (32 bits) array into an integer (32 bits) in place? - - #### 54. How to read the following file? (★★☆) - - ``` 1, 2, 3, 4, 5 6, , , 7, 8 , , 9,10,11 ``` -#### 55. What is the equivalent of enumerate for numpy arrays? (★★☆) - +#### 55. What is the equivalent of enumerate for numpy arrays? (★★☆) #### 56. Generate a generic 2D Gaussian-like array (★★☆) - - #### 57. How to randomly place p elements in a 2D array? (★★☆) - - #### 58. Subtract the mean of each row of a matrix (★★☆) - - #### 59. How to sort an array by the nth column? (★★☆) - - #### 60. How to tell if a given 2D array has null columns? (★★☆) - - #### 61. Find the nearest value from a given value in an array (★★☆) - - #### 62. Considering two arrays with shape (1,3) and (3,1), how to compute their sum using an iterator? (★★☆) - - #### 63. Create an array class that has a name attribute (★★☆) - - #### 64. Consider a given vector, how to add 1 to each element indexed by a second vector (be careful with repeated indices)? (★★★) - - #### 65. How to accumulate elements of a vector (X) to an array (F) based on an index list (I)? (★★★) - - #### 66. Considering a (w,h,3) image of (dtype=ubyte), compute the number of unique colors (★★★) - - #### 67. Considering a four dimensions array, how to get sum over the last two axis at once? (★★★) - - #### 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? (★★★) - - #### 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? (★★★) - - +#### 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)? (★★★) - - #### 72. How to swap two rows of an 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 (★★★) - - #### 74. Given an array C that is a bincount, how to produce an array A such that np.bincount(A) == C? (★★★) - - #### 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\]) (★★★) - - +#### 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])? (★★★) - -#### 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\])? (★★★) - - +#### 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) (★★★) +#### 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\]\]? (★★★) - - - -#### 82. Compute a matrix rank (★★★) - - +#### 82. Compute a matrix rank (★★★) #### 83. How to find the most frequent value in an array? - - #### 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\] (★★★) - - +#### 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)) (★★★) - - #### 87. Consider a 16x16 array, how to get the block-sum (block size is 4x4)? (★★★) - - #### 88. How to implement the Game of Life using numpy arrays? (★★★) - - #### 89. How to get the n largest values of an array (★★★) - - #### 90. Given an arbitrary number of vectors, build the cartesian product (every combinations of every item) (★★★) - - #### 91. How to create a record array from a regular array? (★★★) - - #### 92. Consider a large vector Z, compute Z to the power of 3 using 3 different methods (★★★) - - #### 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\]) (★★★) - - +#### 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 (★★★) - - #### 96. Given a two dimensional array, how to extract unique rows? (★★★) - - #### 97. Considering 2 vectors A & B, write the einsum equivalent of inner, outer, sum, and mul function (★★★) - - #### 98. Considering a path described by two vectors (X,Y), how to sample it using equidistant samples (★★★)? - - #### 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. (★★★) - - #### 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). (★★★) - diff --git a/numpy_100_random.ipynb b/numpy_100_random.ipynb new file mode 100644 index 00000000..b08e57ce --- /dev/null +++ b/numpy_100_random.ipynb @@ -0,0 +1,55 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "# 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 \n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "File automatically generated. See the documentation to update the questions programmatically." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "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." + ] + }, + { + "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": 2 +} diff --git a/numpy_100_with_hints.md b/numpy_100_with_hints.md new file mode 100644 index 00000000..e8d7ef9d --- /dev/null +++ b/numpy_100_with_hints.md @@ -0,0 +1,254 @@ + + + + +# 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: `hint: import … as ` +#### 2. Print the numpy version and the configuration (★☆☆) +Hint: `hint: np.__version__, np.show_config)` +#### 3. Create a null vector of size 10 (★☆☆) +Hint: `hint: np.zeros` +#### 4. How to find the memory size of any array (★☆☆) +Hint: `hint: size, itemsize` +#### 5. How to get the documentation of the numpy add function from the command line? (★☆☆) +Hint: `hint: np.info` +#### 6. Create a null vector of size 10 but the fifth value which is 1 (★☆☆) +Hint: `hint: array[4]` +#### 7. Create a vector with values ranging from 10 to 49 (★☆☆) +Hint: `hint: arange` +#### 8. Reverse a vector (first element becomes last) (★☆☆) +Hint: `hint: array[::-1]` +#### 9. Create a 3x3 matrix with values ranging from 0 to 8 (★☆☆) +Hint: `hint: reshape` +#### 10. Find indices of non-zero elements from [1,2,0,0,4,0] (★☆☆) +Hint: `hint: np.nonzero` +#### 11. Create a 3x3 identity matrix (★☆☆) +Hint: `hint: np.eye` +#### 12. Create a 3x3x3 array with random values (★☆☆) +Hint: `hint: np.random.random` +#### 13. Create a 10x10 array with random values and find the minimum and maximum values (★☆☆) +Hint: `hint: min, max` +#### 14. Create a random vector of size 30 and find the mean value (★☆☆) +Hint: `hint: mean` +#### 15. Create a 2d array with 1 on the border and 0 inside (★☆☆) +Hint: `hint: array[1:-1, 1:-1]` +#### 16. How to add a border (filled with 0's) around an existing array? (★☆☆) +Hint: `hint: np.pad` +#### 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: `hint: NaN = not a number, inf = infinity` +#### 18. Create a 5x5 matrix with values 1,2,3,4 just below the diagonal (★☆☆) +Hint: `hint: np.diag` +#### 19. Create a 8x8 matrix and fill it with a checkerboard pattern (★☆☆) +Hint: `hint: array[::2]` +#### 20. Consider a (6,7,8) shape array, what is the index (x,y,z) of the 100th element? +Hint: `hint: np.unravel_index` +#### 21. Create a checkerboard 8x8 matrix using the tile function (★☆☆) +Hint: `hint: np.tile` +#### 22. Normalize a 5x5 random matrix (★☆☆) +Hint: `hint: (x -mean)/std` +#### 23. Create a custom dtype that describes a color as four unsigned bytes (RGBA) (★☆☆) +Hint: `hint: np.dtype` +#### 24. Multiply a 5x3 matrix by a 3x2 matrix (real matrix product) (★☆☆) +Hint: `hint: ` +#### 25. Given a 1D array, negate all elements which are between 3 and 8, in place. (★☆☆) +Hint: `hint: >, <=` +#### 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: `hint: np.sum` +#### 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 +``` +Hint: `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) +``` + +Hint: `No hints provided... ` +#### 29. How to round away from zero a float array ? (★☆☆) +Hint: `hint: np.uniform, np.copysign, np.ceil, np.abs` +#### 30. How to find common values between two arrays? (★☆☆) +Hint: `hint: np.intersect1d` +#### 31. How to ignore all numpy warnings (not recommended)? (★☆☆) +Hint: `hint: np.seterr, np.errstate` +#### 32. Is the following expressions true? (★☆☆) +```python +np.sqrt(-1) == np.emath.sqrt(-1) +``` + +Hint: `hint: imaginary number` +#### 33. How to get the dates of yesterday, today and tomorrow? (★☆☆) +Hint: `hint: np.datetime64, np.timedelta64` +#### 34. How to get all the dates corresponding to the month of July 2016? (★★☆) +Hint: `hint: np.arange(dtype=datetime64['D'])` +#### 35. How to compute ((A+B)*(-A/2)) in place (without copy)? (★★☆) +Hint: `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: `hint: %, np.floor, np.ceil, astype, np.trunc` +#### 37. Create a 5x5 matrix with row values ranging from 0 to 4 (★★☆) +Hint: `hint: np.arange` +#### 38. Consider a generator function that generates 10 integers and use it to build an array (★☆☆) +Hint: `hint: np.fromiter` +#### 39. Create a vector of size 10 with values ranging from 0 to 1, both excluded (★★☆) +Hint: `hint: np.linspace` +#### 40. Create a random vector of size 10 and sort it (★★☆) +Hint: `hint: sort` +#### 41. How to sum a small array faster than np.sum? (★★☆) +Hint: `hint: np.add.reduce` +#### 42. Consider two random array A and B, check if they are equal (★★☆) +Hint: `hint: np.allclose, np.array_equal` +#### 43. Make an array immutable (read-only) (★★☆) +Hint: `hint: flags.writeable` +#### 44. Consider a random 10x2 matrix representing cartesian coordinates, convert them to polar coordinates (★★☆) +Hint: `hint: np.sqrt, np.arctan2` +#### 45. Create random vector of size 10 and replace the maximum value by 0 (★★☆) +Hint: `hint: argmax` +#### 46. Create a structured array with `x` and `y` coordinates covering the [0,1]x[0,1] area (★★☆) +Hint: `hint: np.meshgrid` +#### 47. Given two arrays, X and Y, construct the Cauchy matrix C (Cij =1/(xi - yj)) +Hint: `hint: np.subtract.outer` +#### 48. Print the minimum and maximum representable value for each numpy scalar type (★★☆) +Hint: `hint: np.iinfo, np.finfo, eps` +#### 49. How to print all the values of an array? (★★☆) +Hint: `hint: np.set_printoptions` +#### 50. How to find the closest value (to a given scalar) in a vector? (★★☆) +Hint: `hint: argmin` +#### 51. Create a structured array representing a position (x,y) and a color (r,g,b) (★★☆) +Hint: `hint: dtype` +#### 52. Consider a random vector with shape (100,2) representing coordinates, find point by point distances (★★☆) +Hint: `hint: np.atleast_2d, T, np.sqrt` +#### 53. How to convert a float (32 bits) array into an integer (32 bits) in place? +Hint: `hint: astype(copy=False)` +#### 54. How to read the following file? (★★☆) +``` +1, 2, 3, 4, 5 +6, , , 7, 8 + , , 9,10,11 +``` + +Hint: `hint: np.genfromtxt` +#### 55. What is the equivalent of enumerate for numpy arrays? (★★☆) +Hint: `hint: np.ndenumerate, np.ndindex` +#### 56. Generate a generic 2D Gaussian-like array (★★☆) +Hint: `hint: np.meshgrid, np.exp` +#### 57. How to randomly place p elements in a 2D array? (★★☆) +Hint: `hint: np.put, np.random.choice` +#### 58. Subtract the mean of each row of a matrix (★★☆) +Hint: `hint: mean(axis=,keepdims=)` +#### 59. How to sort an array by the nth column? (★★☆) +Hint: `hint: argsort` +#### 60. How to tell if a given 2D array has null columns? (★★☆) +Hint: `hint: any, ~` +#### 61. Find the nearest value from a given value in an array (★★☆) +Hint: `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: `hint: np.nditer` +#### 63. Create an array class that has a name attribute (★★☆) +Hint: `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: `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: `hint: np.bincount` +#### 66. Considering a (w,h,3) image of (dtype=ubyte), compute the number of unique colors (★★★) +Hint: `hint: np.unique` +#### 67. Considering a four dimensions array, how to get sum over the last two axis at once? (★★★) +Hint: `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: `hint: np.bincount` +#### 69. How to get the diagonal of a dot product? (★★★) +Hint: `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: `hint: array[::4]` +#### 71. Consider an array of dimension (5,5,3), how to mulitply it by an array with dimensions (5,5)? (★★★) +Hint: `hint: array[:, :, None]` +#### 72. How to swap two rows of an array? (★★★) +Hint: `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: `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: `hint: np.repeat` +#### 75. How to compute averages using a sliding window over an array? (★★★) +Hint: `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: `hint: from numpy.lib import stride_tricks` +#### 77. How to negate a boolean, or to change the sign of a float inplace? (★★★) +Hint: `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])? (★★★) +Hint: `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])? (★★★) +Hint: `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) (★★★) +Hint: `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: `hint: stride_tricks.as_strided` +#### 82. Compute a matrix rank (★★★) +Hint: `hint: np.linalg.svd` +#### 83. How to find the most frequent value in an array? +Hint: `hint: np.bincount, argmax` +#### 84. Extract all the contiguous 3x3 blocks from a random 10x10 matrix (★★★) +Hint: `hint: stride_tricks.as_strided` +#### 85. Create a 2D array subclass such that Z[i,j] == Z[j,i] (★★★) +Hint: `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: `hint: np.tensordot` +#### 87. Consider a 16x16 array, how to get the block-sum (block size is 4x4)? (★★★) +Hint: `hint: np.add.reduceat` +#### 88. How to implement the Game of Life using numpy arrays? (★★★) +Hint: `No hints provided... ` +#### 89. How to get the n largest values of an array (★★★) +Hint: `hint: np.argsort | np.argpartition` +#### 90. Given an arbitrary number of vectors, build the cartesian product (every combinations of every item) (★★★) +Hint: `hint: np.indices` +#### 91. How to create a record array from a regular array? (★★★) +Hint: `hint: np.core.records.fromarrays` +#### 92. Consider a large vector Z, compute Z to the power of 3 using 3 different methods (★★★) +Hint: `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: `hint: np.where` +#### 94. Considering a 10x3 matrix, extract rows with unequal values (e.g. [2,2,3]) (★★★) +Hint: `No hints provided...` +#### 95. Convert a vector of ints into a matrix binary representation (★★★) +Hint: `hint: np.unpackbits` +#### 96. Given a two dimensional array, how to extract unique rows? (★★★) +Hint: `hint: np.ascontiguousarray | np.unique` +#### 97. Considering 2 vectors A & B, write the einsum equivalent of inner, outer, sum, and mul function (★★★) +Hint: `hint: np.einsum` +#### 98. Considering a path described by two vectors (X,Y), how to sample it using equidistant samples (★★★)? +Hint: `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: `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: `hint: np.percentile` \ No newline at end of file diff --git a/numpy_100_with_hints_with_solutions.md b/numpy_100_with_hints_with_solutions.md new file mode 100644 index 00000000..0e10cd77 --- /dev/null +++ b/numpy_100_with_hints_with_solutions.md @@ -0,0 +1,1376 @@ + + + + +# 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 using 5 different methods (★★☆) +`hint: %, np.floor, np.ceil, astype, np.trunc` + +```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)) + +``` +#### 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 + +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? (★★☆) +`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.md b/numpy_100_with_solutions.md similarity index 90% rename from 100_Numpy_exercises.md rename to numpy_100_with_solutions.md index edec3972..2bcee632 100644 --- a/100_Numpy_exercises.md +++ b/numpy_100_with_solutions.md @@ -1,328 +1,401 @@ -# 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 +# 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 (★☆☆) +``` +#### 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? (★☆☆) +``` +#### 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 (★☆☆) +``` +#### 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 (★☆☆) +``` +#### 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) (★☆☆) +``` +#### 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 (★☆☆) +``` +#### 9. Create a 3x3 matrix with values ranging from 0 to 8 (★☆☆) ```python -Z = np.arange(9).reshape(3,3) -print(Z) -``` -#### 10. Find indices of non-zero elements from \[1,2,0,0,4,0\] (★☆☆) +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) -``` -An equivalent way, with a context manager: +# Equivalently with a context manager +nz = np.nonzero([1,2,0,0,4,0]) +print(nz) +``` +#### 32. Is the following expressions true? (★☆☆) ```python -with np.errstate(divide='ignore'): - Z = np.ones(1) / 0 +np.sqrt(-1) == np.emath.sqrt(-1) ``` -#### 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? (★★☆) ```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)? (★★☆) +``` +#### 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 @@ -330,12 +403,13 @@ 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) @@ -343,59 +417,65 @@ print (np.floor(Z)) print (np.ceil(Z)-1) 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) @@ -406,64 +486,70 @@ 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 (★★☆) +``` +#### 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)) +``` +#### 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) @@ -471,43 +557,47 @@ 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) @@ -521,57 +611,71 @@ 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\n - 6, , , 7, 8\n - , , 9,10,11\n""") +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 @@ -579,12 +683,13 @@ 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) @@ -596,54 +701,59 @@ Y = X - X.mean(axis=1, keepdims=True) Y = X - X.mean(axis=1).reshape(-1, 1) print(Y) -``` -#### 59. How to I sort an array by the nth column? (★★☆) +``` +#### 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) @@ -655,12 +765,13 @@ class NamedArray(np.ndarray): 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) @@ -672,24 +783,26 @@ print(Z) # 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 @@ -697,12 +810,13 @@ 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)) @@ -711,12 +825,13 @@ print(sum) # (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) @@ -729,12 +844,13 @@ 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)) @@ -748,12 +864,13 @@ 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? (★★★) +``` +#### 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]) @@ -761,32 +878,35 @@ 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)) @@ -796,23 +916,25 @@ 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) : @@ -821,12 +943,13 @@ def moving_average(a, n=3) : 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\]) (★★★) +``` +#### 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 @@ -836,12 +959,13 @@ def rolling(a, window): 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) @@ -849,12 +973,13 @@ 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\])? (★★★) +``` +#### 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) @@ -867,12 +992,13 @@ 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\])? (★★★) +``` +#### 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 @@ -880,12 +1006,13 @@ 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)) @@ -913,43 +1040,47 @@ 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\]\]? (★★★) +``` +#### 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 (★★★) +``` +#### 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)) @@ -958,12 +1089,13 @@ 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\] (★★★) +``` +#### 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 @@ -979,12 +1111,13 @@ def symetric(Z): 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 @@ -998,12 +1131,13 @@ print(S) # 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)) @@ -1011,12 +1145,13 @@ 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): @@ -1035,12 +1170,13 @@ def iterate(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 @@ -1050,12 +1186,13 @@ 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): @@ -1071,24 +1208,26 @@ def cartesian(arrays): 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)) @@ -1096,12 +1235,13 @@ 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)) @@ -1110,12 +1250,13 @@ 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\]) (★★★) +``` +#### 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)) @@ -1127,12 +1268,13 @@ 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]) @@ -1143,12 +1285,13 @@ print(B[:,::-1]) 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)) @@ -1161,12 +1304,13 @@ print(uZ) # 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/ @@ -1177,12 +1321,13 @@ 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) @@ -1196,12 +1341,13 @@ 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], @@ -1211,12 +1357,13 @@ 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 @@ -1225,4 +1372,5 @@ 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/requirements.txt b/requirements.txt index 0ad85da2..488a34ae 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,3 +2,4 @@ numpy==1.17.4 pandas==0.25.3 jupyter==1.0.0 jupyterthemes==0.20.0 +mdutils==1.0.0 diff --git a/update_textfile.py b/update_textfile.py deleted file mode 100644 index e534118b..00000000 --- a/update_textfile.py +++ /dev/null @@ -1,22 +0,0 @@ -""" -Module to automatically create the 100 exercises (with or without hints and answers) -as a textfile format (markdown format). -""" - -from .questsions_dict import qha - - -HEADER = "DO NOT MODIFY. \nFile automatically created. To modify change the content of questions_dict.py and then" \ - "re create via the python script 'create_as_textfile.py'. Search the documentation for more info." - - -def to_markdown(destination_filename, with_ints=False, with_answers=False): - pass - - -def to_rst(destination_filename, with_ints=False, with_answers=False): - pass - - -def cli(): - pass From 415a4ff9d09545b72e1f939820d147bf72cf9a25 Mon Sep 17 00:00:00 2001 From: SebastianoF Date: Sat, 23 Nov 2019 20:13:54 +0000 Subject: [PATCH 12/22] add quick creators of all files via geneators.py --- generators.py | 9 ++ numpy_100.ipynb | 26 +----- numpy_100_random.ipynb | 2 +- numpy_100_with_hints.md | 200 ++++++++++++++++++++-------------------- 4 files changed, 114 insertions(+), 123 deletions(-) diff --git a/generators.py b/generators.py index 8e80fd65..f398cfd8 100644 --- a/generators.py +++ b/generators.py @@ -95,3 +95,12 @@ 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/numpy_100.ipynb b/numpy_100.ipynb index 9b124c03..7f1e9d01 100644 --- a/numpy_100.ipynb +++ b/numpy_100.ipynb @@ -20,7 +20,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "File automatically generated. See the documentation to update the questions programmatically." + "File automatically generated. See the documentation to update questions/answers/hints programmatically." ] }, { @@ -32,7 +32,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, "outputs": [], "source": [ @@ -267,7 +267,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "#### 17. What is the result of the following expression? (★☆☆)\"\n", + "#### 17. What is the result of the following expression? (★☆☆)\n", "```python\n", "0 * np.nan\n", "np.nan == np.nan\n", @@ -1476,25 +1476,7 @@ "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.8" - } - }, + "metadata": {}, "nbformat": 4, "nbformat_minor": 2 } diff --git a/numpy_100_random.ipynb b/numpy_100_random.ipynb index b08e57ce..66b5c2ad 100644 --- a/numpy_100_random.ipynb +++ b/numpy_100_random.ipynb @@ -20,7 +20,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "File automatically generated. See the documentation to update the questions programmatically." + "File automatically generated. See the documentation to update questions/answers/hints programmatically." ] }, { diff --git a/numpy_100_with_hints.md b/numpy_100_with_hints.md index e8d7ef9d..4288ae44 100644 --- a/numpy_100_with_hints.md +++ b/numpy_100_with_hints.md @@ -13,37 +13,37 @@ 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: `hint: import … as ` +`hint: import … as ` #### 2. Print the numpy version and the configuration (★☆☆) -Hint: `hint: np.__version__, np.show_config)` +`hint: np.__version__, np.show_config)` #### 3. Create a null vector of size 10 (★☆☆) -Hint: `hint: np.zeros` +`hint: np.zeros` #### 4. How to find the memory size of any array (★☆☆) -Hint: `hint: size, itemsize` +`hint: size, itemsize` #### 5. How to get the documentation of the numpy add function from the command line? (★☆☆) -Hint: `hint: np.info` +`hint: np.info` #### 6. Create a null vector of size 10 but the fifth value which is 1 (★☆☆) -Hint: `hint: array[4]` +`hint: array[4]` #### 7. Create a vector with values ranging from 10 to 49 (★☆☆) -Hint: `hint: arange` +`hint: arange` #### 8. Reverse a vector (first element becomes last) (★☆☆) -Hint: `hint: array[::-1]` +`hint: array[::-1]` #### 9. Create a 3x3 matrix with values ranging from 0 to 8 (★☆☆) -Hint: `hint: reshape` +`hint: reshape` #### 10. Find indices of non-zero elements from [1,2,0,0,4,0] (★☆☆) -Hint: `hint: np.nonzero` +`hint: np.nonzero` #### 11. Create a 3x3 identity matrix (★☆☆) -Hint: `hint: np.eye` +`hint: np.eye` #### 12. Create a 3x3x3 array with random values (★☆☆) -Hint: `hint: np.random.random` +`hint: np.random.random` #### 13. Create a 10x10 array with random values and find the minimum and maximum values (★☆☆) -Hint: `hint: min, max` +`hint: min, max` #### 14. Create a random vector of size 30 and find the mean value (★☆☆) -Hint: `hint: mean` +`hint: mean` #### 15. Create a 2d array with 1 on the border and 0 inside (★☆☆) -Hint: `hint: array[1:-1, 1:-1]` +`hint: array[1:-1, 1:-1]` #### 16. How to add a border (filled with 0's) around an existing array? (★☆☆) -Hint: `hint: np.pad` +`hint: np.pad` #### 17. What is the result of the following expression? (★☆☆) ```python 0 * np.nan @@ -53,23 +53,23 @@ np.nan - np.nan np.nan in set([np.nan]) 0.3 == 3 * 0.1 ``` -Hint: `hint: NaN = not a number, inf = infinity` +`hint: NaN = not a number, inf = infinity` #### 18. Create a 5x5 matrix with values 1,2,3,4 just below the diagonal (★☆☆) -Hint: `hint: np.diag` +`hint: np.diag` #### 19. Create a 8x8 matrix and fill it with a checkerboard pattern (★☆☆) -Hint: `hint: array[::2]` +`hint: array[::2]` #### 20. Consider a (6,7,8) shape array, what is the index (x,y,z) of the 100th element? -Hint: `hint: np.unravel_index` +`hint: np.unravel_index` #### 21. Create a checkerboard 8x8 matrix using the tile function (★☆☆) -Hint: `hint: np.tile` +`hint: np.tile` #### 22. Normalize a 5x5 random matrix (★☆☆) -Hint: `hint: (x -mean)/std` +`hint: (x -mean)/std` #### 23. Create a custom dtype that describes a color as four unsigned bytes (RGBA) (★☆☆) -Hint: `hint: np.dtype` +`hint: np.dtype` #### 24. Multiply a 5x3 matrix by a 3x2 matrix (real matrix product) (★☆☆) -Hint: `hint: ` +`hint: ` #### 25. Given a 1D array, negate all elements which are between 3 and 8, in place. (★☆☆) -Hint: `hint: >, <=` +`hint: >, <=` #### 26. What is the output of the following script? (★☆☆) ```python # Author: Jake VanderPlas @@ -79,7 +79,7 @@ from numpy import * print(sum(range(5),-1)) ``` -Hint: `hint: np.sum` +`hint: np.sum` #### 27. Consider an integer vector Z, which of these expressions are legal? (★☆☆) ```python Z**Z @@ -89,7 +89,7 @@ Z <- Z Z/1/1 ZZ ``` -Hint: `No hints provided...` +`No hints provided...` #### 28. What are the result of the following expressions? ```python np.array(0) / np.array(0) @@ -97,61 +97,61 @@ np.array(0) // np.array(0) np.array([np.nan]).astype(int).astype(float) ``` -Hint: `No hints provided... ` +`No hints provided... ` #### 29. How to round away from zero a float array ? (★☆☆) -Hint: `hint: np.uniform, np.copysign, np.ceil, np.abs` +`hint: np.uniform, np.copysign, np.ceil, np.abs` #### 30. How to find common values between two arrays? (★☆☆) -Hint: `hint: np.intersect1d` +`hint: np.intersect1d` #### 31. How to ignore all numpy warnings (not recommended)? (★☆☆) -Hint: `hint: np.seterr, np.errstate` +`hint: np.seterr, np.errstate` #### 32. Is the following expressions true? (★☆☆) ```python np.sqrt(-1) == np.emath.sqrt(-1) ``` -Hint: `hint: imaginary number` +`hint: imaginary number` #### 33. How to get the dates of yesterday, today and tomorrow? (★☆☆) -Hint: `hint: np.datetime64, np.timedelta64` +`hint: np.datetime64, np.timedelta64` #### 34. How to get all the dates corresponding to the month of July 2016? (★★☆) -Hint: `hint: np.arange(dtype=datetime64['D'])` +`hint: np.arange(dtype=datetime64['D'])` #### 35. How to compute ((A+B)*(-A/2)) in place (without copy)? (★★☆) -Hint: `hint: np.add(out=), np.negative(out=), np.multiply(out=), np.divide(out=)` +`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: `hint: %, np.floor, np.ceil, astype, np.trunc` +`hint: %, np.floor, np.ceil, astype, np.trunc` #### 37. Create a 5x5 matrix with row values ranging from 0 to 4 (★★☆) -Hint: `hint: np.arange` +`hint: np.arange` #### 38. Consider a generator function that generates 10 integers and use it to build an array (★☆☆) -Hint: `hint: np.fromiter` +`hint: np.fromiter` #### 39. Create a vector of size 10 with values ranging from 0 to 1, both excluded (★★☆) -Hint: `hint: np.linspace` +`hint: np.linspace` #### 40. Create a random vector of size 10 and sort it (★★☆) -Hint: `hint: sort` +`hint: sort` #### 41. How to sum a small array faster than np.sum? (★★☆) -Hint: `hint: np.add.reduce` +`hint: np.add.reduce` #### 42. Consider two random array A and B, check if they are equal (★★☆) -Hint: `hint: np.allclose, np.array_equal` +`hint: np.allclose, np.array_equal` #### 43. Make an array immutable (read-only) (★★☆) -Hint: `hint: flags.writeable` +`hint: flags.writeable` #### 44. Consider a random 10x2 matrix representing cartesian coordinates, convert them to polar coordinates (★★☆) -Hint: `hint: np.sqrt, np.arctan2` +`hint: np.sqrt, np.arctan2` #### 45. Create random vector of size 10 and replace the maximum value by 0 (★★☆) -Hint: `hint: argmax` +`hint: argmax` #### 46. Create a structured array with `x` and `y` coordinates covering the [0,1]x[0,1] area (★★☆) -Hint: `hint: np.meshgrid` +`hint: np.meshgrid` #### 47. Given two arrays, X and Y, construct the Cauchy matrix C (Cij =1/(xi - yj)) -Hint: `hint: np.subtract.outer` +`hint: np.subtract.outer` #### 48. Print the minimum and maximum representable value for each numpy scalar type (★★☆) -Hint: `hint: np.iinfo, np.finfo, eps` +`hint: np.iinfo, np.finfo, eps` #### 49. How to print all the values of an array? (★★☆) -Hint: `hint: np.set_printoptions` +`hint: np.set_printoptions` #### 50. How to find the closest value (to a given scalar) in a vector? (★★☆) -Hint: `hint: argmin` +`hint: argmin` #### 51. Create a structured array representing a position (x,y) and a color (r,g,b) (★★☆) -Hint: `hint: dtype` +`hint: dtype` #### 52. Consider a random vector with shape (100,2) representing coordinates, find point by point distances (★★☆) -Hint: `hint: np.atleast_2d, T, np.sqrt` +`hint: np.atleast_2d, T, np.sqrt` #### 53. How to convert a float (32 bits) array into an integer (32 bits) in place? -Hint: `hint: astype(copy=False)` +`hint: astype(copy=False)` #### 54. How to read the following file? (★★☆) ``` 1, 2, 3, 4, 5 @@ -159,96 +159,96 @@ Hint: `hint: astype(copy=False)` , , 9,10,11 ``` -Hint: `hint: np.genfromtxt` +`hint: np.genfromtxt` #### 55. What is the equivalent of enumerate for numpy arrays? (★★☆) -Hint: `hint: np.ndenumerate, np.ndindex` +`hint: np.ndenumerate, np.ndindex` #### 56. Generate a generic 2D Gaussian-like array (★★☆) -Hint: `hint: np.meshgrid, np.exp` +`hint: np.meshgrid, np.exp` #### 57. How to randomly place p elements in a 2D array? (★★☆) -Hint: `hint: np.put, np.random.choice` +`hint: np.put, np.random.choice` #### 58. Subtract the mean of each row of a matrix (★★☆) -Hint: `hint: mean(axis=,keepdims=)` +`hint: mean(axis=,keepdims=)` #### 59. How to sort an array by the nth column? (★★☆) -Hint: `hint: argsort` +`hint: argsort` #### 60. How to tell if a given 2D array has null columns? (★★☆) -Hint: `hint: any, ~` +`hint: any, ~` #### 61. Find the nearest value from a given value in an array (★★☆) -Hint: `hint: np.abs, argmin, flat` +`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: `hint: np.nditer` +`hint: np.nditer` #### 63. Create an array class that has a name attribute (★★☆) -Hint: `hint: class method` +`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: `hint: np.bincount | np.add.at` +`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: `hint: np.bincount` +`hint: np.bincount` #### 66. Considering a (w,h,3) image of (dtype=ubyte), compute the number of unique colors (★★★) -Hint: `hint: np.unique` +`hint: np.unique` #### 67. Considering a four dimensions array, how to get sum over the last two axis at once? (★★★) -Hint: `hint: sum(axis=(-2,-1))` +`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: `hint: np.bincount` +`hint: np.bincount` #### 69. How to get the diagonal of a dot product? (★★★) -Hint: `hint: np.diag` +`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: `hint: array[::4]` +`hint: array[::4]` #### 71. Consider an array of dimension (5,5,3), how to mulitply it by an array with dimensions (5,5)? (★★★) -Hint: `hint: array[:, :, None]` +`hint: array[:, :, None]` #### 72. How to swap two rows of an array? (★★★) -Hint: `hint: array[[]] = 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: `hint: repeat, np.roll, np.sort, view, np.unique` +`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: `hint: np.repeat` +`hint: np.repeat` #### 75. How to compute averages using a sliding window over an array? (★★★) -Hint: `hint: np.cumsum` +`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: `hint: from numpy.lib import stride_tricks` +`hint: from numpy.lib import stride_tricks` #### 77. How to negate a boolean, or to change the sign of a float inplace? (★★★) -Hint: `hint: np.logical_not, np.negative` +`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])? (★★★) -Hint: `No hints provided...` +`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])? (★★★) -Hint: `No hints provided...` +`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) (★★★) -Hint: `hint: minimum maximum` +`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: `hint: stride_tricks.as_strided` +`hint: stride_tricks.as_strided` #### 82. Compute a matrix rank (★★★) -Hint: `hint: np.linalg.svd` +`hint: np.linalg.svd` #### 83. How to find the most frequent value in an array? -Hint: `hint: np.bincount, argmax` +`hint: np.bincount, argmax` #### 84. Extract all the contiguous 3x3 blocks from a random 10x10 matrix (★★★) -Hint: `hint: stride_tricks.as_strided` +`hint: stride_tricks.as_strided` #### 85. Create a 2D array subclass such that Z[i,j] == Z[j,i] (★★★) -Hint: `hint: class method` +`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: `hint: np.tensordot` +`hint: np.tensordot` #### 87. Consider a 16x16 array, how to get the block-sum (block size is 4x4)? (★★★) -Hint: `hint: np.add.reduceat` +`hint: np.add.reduceat` #### 88. How to implement the Game of Life using numpy arrays? (★★★) -Hint: `No hints provided... ` +`No hints provided... ` #### 89. How to get the n largest values of an array (★★★) -Hint: `hint: np.argsort | np.argpartition` +`hint: np.argsort | np.argpartition` #### 90. Given an arbitrary number of vectors, build the cartesian product (every combinations of every item) (★★★) -Hint: `hint: np.indices` +`hint: np.indices` #### 91. How to create a record array from a regular array? (★★★) -Hint: `hint: np.core.records.fromarrays` +`hint: np.core.records.fromarrays` #### 92. Consider a large vector Z, compute Z to the power of 3 using 3 different methods (★★★) -Hint: `hint: np.power, *, np.einsum` +`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: `hint: np.where` +`hint: np.where` #### 94. Considering a 10x3 matrix, extract rows with unequal values (e.g. [2,2,3]) (★★★) -Hint: `No hints provided...` +`No hints provided...` #### 95. Convert a vector of ints into a matrix binary representation (★★★) -Hint: `hint: np.unpackbits` +`hint: np.unpackbits` #### 96. Given a two dimensional array, how to extract unique rows? (★★★) -Hint: `hint: np.ascontiguousarray | np.unique` +`hint: np.ascontiguousarray | np.unique` #### 97. Considering 2 vectors A & B, write the einsum equivalent of inner, outer, sum, and mul function (★★★) -Hint: `hint: np.einsum` +`hint: np.einsum` #### 98. Considering a path described by two vectors (X,Y), how to sample it using equidistant samples (★★★)? -Hint: `hint: np.cumsum, np.interp ` +`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: `hint: np.logical_and.reduce, np.mod` +`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: `hint: np.percentile` \ No newline at end of file +`hint: np.percentile` \ No newline at end of file From 13c7e5c14f06954fbdd32eebf026a18e2cfa732b Mon Sep 17 00:00:00 2001 From: SebastianoF Date: Sun, 12 Jan 2020 14:22:49 +0000 Subject: [PATCH 13/22] rename and ktx source files added --- numpy_100.ipynb => 100_Numpy_exercises.ipynb | 22 +- numpy_100.md => 100_Numpy_exercises.md | 16 +- ...ts.md => 100_Numpy_exercises_with_hints.md | 26 +- ...mpy_exercises_with_hints_with_solutions.md | 227 +-- ...d => 100_Numpy_exercises_with_solutions.md | 217 +-- ...100_random.ipynb => 100_Numpy_random.ipynb | 12 +- README.md | 8 +- generators.py | 63 +- initialise.py | 8 +- source/exercises100.ktx | 1457 +++++++++++++++++ source/headers.ktx | 25 + 11 files changed, 1585 insertions(+), 496 deletions(-) rename numpy_100.ipynb => 100_Numpy_exercises.ipynb (98%) rename numpy_100.md => 100_Numpy_exercises.md (97%) rename numpy_100_with_hints.md => 100_Numpy_exercises_with_hints.md (96%) rename numpy_100_with_hints_with_solutions.md => 100_Numpy_exercises_with_hints_with_solutions.md (97%) rename numpy_100_with_solutions.md => 100_Numpy_exercises_with_solutions.md (98%) rename numpy_100_random.ipynb => 100_Numpy_random.ipynb (80%) create mode 100644 source/exercises100.ktx create mode 100644 source/headers.ktx diff --git a/numpy_100.ipynb b/100_Numpy_exercises.ipynb similarity index 98% rename from numpy_100.ipynb rename to 100_Numpy_exercises.ipynb index 7f1e9d01..e3fa47cd 100644 --- a/numpy_100.ipynb +++ b/100_Numpy_exercises.ipynb @@ -4,16 +4,15 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "\n", "# 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", + "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 \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 " ] }, { @@ -27,7 +26,8 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "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." + "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." ] }, { @@ -408,7 +408,7 @@ "print(sum(range(5),-1))\n", "from numpy import *\n", "print(sum(range(5),-1))\n", - "```\n" + "```" ] }, { @@ -449,7 +449,7 @@ "np.array(0) / np.array(0)\n", "np.array(0) // np.array(0)\n", "np.array([np.nan]).astype(int).astype(float)\n", - "```\n" + "```" ] }, { @@ -508,7 +508,7 @@ "#### 32. Is the following expressions true? (★☆☆)\n", "```python\n", "np.sqrt(-1) == np.emath.sqrt(-1)\n", - "```\n" + "```" ] }, { @@ -821,7 +821,7 @@ "1, 2, 3, 4, 5\n", "6, , , 7, 8\n", " , , 9,10,11\n", - "```\n" + "```" ] }, { @@ -1213,7 +1213,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "#### 82. Compute a matrix rank (★★★) " + "#### 82. Compute a matrix rank (★★★)" ] }, { diff --git a/numpy_100.md b/100_Numpy_exercises.md similarity index 97% rename from numpy_100.md rename to 100_Numpy_exercises.md index 07b7c25a..ef5a6f57 100644 --- a/numpy_100.md +++ b/100_Numpy_exercises.md @@ -1,17 +1,15 @@ - # 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 +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. +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` (★☆☆) #### 2. Print the numpy version and the configuration (★☆☆) @@ -79,7 +77,6 @@ from numpy import * print(sum(range(5),-1)) ``` - #### 27. Consider an integer vector Z, which of these expressions are legal? (★☆☆) ```python Z**Z @@ -97,7 +94,6 @@ np.array(0) // np.array(0) np.array([np.nan]).astype(int).astype(float) ``` - #### 29. How to round away from zero a float array ? (★☆☆) #### 30. How to find common values between two arrays? (★☆☆) @@ -109,7 +105,6 @@ np.array([np.nan]).astype(int).astype(float) np.sqrt(-1) == np.emath.sqrt(-1) ``` - #### 33. How to get the dates of yesterday, today and tomorrow? (★☆☆) #### 34. How to get all the dates corresponding to the month of July 2016? (★★☆) @@ -159,7 +154,6 @@ np.sqrt(-1) == np.emath.sqrt(-1) , , 9,10,11 ``` - #### 55. What is the equivalent of enumerate for numpy arrays? (★★☆) #### 56. Generate a generic 2D Gaussian-like array (★★☆) @@ -214,7 +208,7 @@ np.sqrt(-1) == np.emath.sqrt(-1) #### 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 (★★★) +#### 82. Compute a matrix rank (★★★) #### 83. How to find the most frequent value in an array? diff --git a/numpy_100_with_hints.md b/100_Numpy_exercises_with_hints.md similarity index 96% rename from numpy_100_with_hints.md rename to 100_Numpy_exercises_with_hints.md index 4288ae44..4a5b126d 100644 --- a/numpy_100_with_hints.md +++ b/100_Numpy_exercises_with_hints.md @@ -1,19 +1,17 @@ - # 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 +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. +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 ` +`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 (★☆☆) @@ -67,7 +65,7 @@ np.nan in set([np.nan]) #### 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: ` +`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? (★☆☆) @@ -78,7 +76,6 @@ 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 @@ -96,8 +93,7 @@ np.array(0) / np.array(0) np.array(0) // np.array(0) np.array([np.nan]).astype(int).astype(float) ``` - -`No hints provided... ` +`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? (★☆☆) @@ -108,7 +104,6 @@ np.array([np.nan]).astype(int).astype(float) ```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` @@ -158,7 +153,6 @@ np.sqrt(-1) == np.emath.sqrt(-1) 6, , , 7, 8 , , 9,10,11 ``` - `hint: np.genfromtxt` #### 55. What is the equivalent of enumerate for numpy arrays? (★★☆) `hint: np.ndenumerate, np.ndindex` @@ -214,7 +208,7 @@ np.sqrt(-1) == np.emath.sqrt(-1) `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 (★★★) +#### 82. Compute a matrix rank (★★★) `hint: np.linalg.svd` #### 83. How to find the most frequent value in an array? `hint: np.bincount, argmax` @@ -227,7 +221,7 @@ np.sqrt(-1) == np.emath.sqrt(-1) #### 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... ` +`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) (★★★) @@ -247,7 +241,7 @@ np.sqrt(-1) == np.emath.sqrt(-1) #### 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 ` +`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). (★★★) diff --git a/numpy_100_with_hints_with_solutions.md b/100_Numpy_exercises_with_hints_with_solutions.md similarity index 97% rename from numpy_100_with_hints_with_solutions.md rename to 100_Numpy_exercises_with_hints_with_solutions.md index 0e10cd77..24e9db53 100644 --- a/numpy_100_with_hints_with_solutions.md +++ b/100_Numpy_exercises_with_hints_with_solutions.md @@ -1,164 +1,130 @@ - # 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 +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. +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 ` +`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 @@ -172,98 +138,79 @@ np.nan in set([np.nan]) `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: ` +`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 @@ -273,17 +220,14 @@ 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 @@ -297,14 +241,12 @@ 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 @@ -312,42 +254,34 @@ np.array(0) / np.array(0) np.array(0) // np.array(0) np.array([np.nan]).astype(int).astype(float) ``` - -`No hints provided... ` +`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 @@ -358,44 +292,35 @@ _ = 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 @@ -403,13 +328,11 @@ 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 (★★☆) `hint: %, np.floor, np.ceil, astype, np.trunc` ```python - Z = np.random.uniform(0,10,10) print (Z - Z%1) @@ -417,65 +340,53 @@ print (np.floor(Z)) print (np.ceil(Z)-1) 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) @@ -486,70 +397,58 @@ 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) @@ -557,47 +456,39 @@ 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 - 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? (★★☆) `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) @@ -611,17 +502,14 @@ 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? (★★☆) ``` @@ -629,11 +517,9 @@ print(Z) 6, , , 7, 8 , , 9,10,11 ``` - `hint: np.genfromtxt` ```python - from io import StringIO # Fake file @@ -645,37 +531,31 @@ s = StringIO('''1, 2, 3, 4, 5 ''') 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 @@ -683,13 +563,11 @@ 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) @@ -701,59 +579,49 @@ Y = X - X.mean(axis=1, keepdims=True) 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) @@ -765,13 +633,11 @@ class NamedArray(np.ndarray): 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) @@ -783,26 +649,22 @@ print(Z) # 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 @@ -810,13 +672,11 @@ 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)) @@ -825,13 +685,11 @@ print(sum) # (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) @@ -844,13 +702,11 @@ 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)) @@ -864,13 +720,11 @@ 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]) @@ -878,35 +732,29 @@ 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)) @@ -916,25 +764,21 @@ 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) : @@ -943,13 +787,11 @@ def moving_average(a, n=3) : 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 @@ -959,13 +801,11 @@ def rolling(a, window): 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) @@ -973,13 +813,11 @@ 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) @@ -992,13 +830,11 @@ 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 @@ -1006,13 +842,11 @@ 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)) @@ -1040,47 +874,39 @@ 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 (★★★) +#### 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)) @@ -1089,13 +915,11 @@ 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 @@ -1111,13 +935,11 @@ def symetric(Z): 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 @@ -1131,13 +953,11 @@ print(S) # 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)) @@ -1145,13 +965,11 @@ 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... ` +`No hints provided...` ```python - # Author: Nicolas Rougier def iterate(Z): @@ -1170,13 +988,11 @@ def iterate(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 @@ -1186,13 +1002,11 @@ 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): @@ -1208,26 +1022,22 @@ def cartesian(arrays): 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)) @@ -1235,13 +1045,11 @@ 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)) @@ -1250,13 +1058,11 @@ 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)) @@ -1268,13 +1074,11 @@ 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]) @@ -1285,13 +1089,11 @@ print(B[:,::-1]) 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)) @@ -1304,13 +1106,11 @@ print(uZ) # 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/ @@ -1321,13 +1121,11 @@ 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 ` +`hint: np.cumsum, np.interp` ```python - # Author: Bas Swinckels phi = np.arange(0, 10*np.pi, 0.1) @@ -1341,13 +1139,11 @@ 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], @@ -1357,13 +1153,11 @@ 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 @@ -1372,5 +1166,4 @@ 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/numpy_100_with_solutions.md b/100_Numpy_exercises_with_solutions.md similarity index 98% rename from numpy_100_with_solutions.md rename to 100_Numpy_exercises_with_solutions.md index 2bcee632..71ed5a53 100644 --- a/numpy_100_with_solutions.md +++ b/100_Numpy_exercises_with_solutions.md @@ -1,164 +1,130 @@ - # 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 +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. +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 @@ -172,98 +138,79 @@ np.nan in set([np.nan]) ```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 @@ -275,15 +222,12 @@ 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 @@ -297,14 +241,12 @@ 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 @@ -314,40 +256,32 @@ 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 @@ -358,7 +292,6 @@ _ = 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 @@ -366,36 +299,28 @@ 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 @@ -403,13 +328,11 @@ 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) @@ -417,65 +340,53 @@ print (np.floor(Z)) print (np.ceil(Z)-1) 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) @@ -486,70 +397,58 @@ 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) @@ -557,47 +456,39 @@ 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) @@ -611,17 +502,14 @@ 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? (★★☆) ``` @@ -631,9 +519,7 @@ print(Z) ``` - ```python - from io import StringIO # Fake file @@ -645,37 +531,31 @@ s = StringIO('''1, 2, 3, 4, 5 ''') 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 @@ -683,13 +563,11 @@ 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) @@ -701,59 +579,49 @@ Y = X - X.mean(axis=1, keepdims=True) 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) @@ -765,13 +633,11 @@ class NamedArray(np.ndarray): 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) @@ -783,26 +649,22 @@ print(Z) # 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 @@ -810,13 +672,11 @@ 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)) @@ -825,13 +685,11 @@ print(sum) # (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) @@ -844,13 +702,11 @@ 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)) @@ -864,13 +720,11 @@ 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]) @@ -878,35 +732,29 @@ 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)) @@ -916,25 +764,21 @@ 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) : @@ -943,13 +787,11 @@ def moving_average(a, n=3) : 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 @@ -959,13 +801,11 @@ def rolling(a, window): 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) @@ -973,13 +813,11 @@ 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) @@ -992,13 +830,11 @@ 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 @@ -1006,13 +842,11 @@ 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)) @@ -1040,47 +874,39 @@ 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 (★★★) +#### 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)) @@ -1089,13 +915,11 @@ 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 @@ -1111,13 +935,11 @@ def symetric(Z): 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 @@ -1131,13 +953,11 @@ print(S) # 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)) @@ -1145,13 +965,11 @@ 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): @@ -1170,13 +988,11 @@ def iterate(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 @@ -1186,13 +1002,11 @@ 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): @@ -1208,26 +1022,22 @@ def cartesian(arrays): 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)) @@ -1235,13 +1045,11 @@ 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)) @@ -1250,13 +1058,11 @@ 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)) @@ -1268,13 +1074,11 @@ 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]) @@ -1285,13 +1089,11 @@ print(B[:,::-1]) 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)) @@ -1304,13 +1106,11 @@ print(uZ) # 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/ @@ -1321,13 +1121,11 @@ 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) @@ -1341,13 +1139,11 @@ 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], @@ -1357,13 +1153,11 @@ 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 @@ -1372,5 +1166,4 @@ 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/numpy_100_random.ipynb b/100_Numpy_random.ipynb similarity index 80% rename from numpy_100_random.ipynb rename to 100_Numpy_random.ipynb index 66b5c2ad..bddcb921 100644 --- a/numpy_100_random.ipynb +++ b/100_Numpy_random.ipynb @@ -4,16 +4,15 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "\n", "# 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", + "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 \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 " ] }, { @@ -27,7 +26,8 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "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." + "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." ] }, { diff --git a/README.md b/README.md index 9502df6b..fb0f5407 100644 --- a/README.md +++ b/README.md @@ -7,9 +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 dictionary in `data_source.py`. -To modify the content of these files, chance the text in `data_source.py` and then re-generate them via the -method into the `generators.py` module. +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 index f398cfd8..d8251f10 100644 --- a/generators.py +++ b/generators.py @@ -2,10 +2,41 @@ import nbformat as nbf import mdutils -import data_source as ds +def ktx_to_dict(input_file, keystarter='<'): + """ parsing keyed text to a python dictionary. """ + answer = dict() -def create_jupyter_notebook(destination_filename='numpy_100.ipynb'): + with open(input_file, 'r+') 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 data_source.py """ @@ -15,16 +46,16 @@ def create_jupyter_notebook(destination_filename='numpy_100.ipynb'): nb['cells'] = [] # - Add header: - nb['cells'].append(nbf.v4.new_markdown_cell(ds.HEADER)) - nb['cells'].append(nbf.v4.new_markdown_cell(ds.SUB_HEADER)) - nb['cells'].append(nbf.v4.new_markdown_cell(ds.JUPYTER_INSTRUCTIONS)) + 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}. ' + ds.QHA[f'q{n}'])) + 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 @@ -35,7 +66,7 @@ def create_jupyter_notebook(destination_filename='numpy_100.ipynb'): nbf.write(nb, destination_filename) -def create_jupyter_notebook_random_question(destination_filename='numpy_100_random.ipynb'): +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 data_source.py """ @@ -45,9 +76,9 @@ def create_jupyter_notebook_random_question(destination_filename='numpy_100_rand nb['cells'] = [] # - Add header: - nb['cells'].append(nbf.v4.new_markdown_cell(ds.HEADER)) - nb['cells'].append(nbf.v4.new_markdown_cell(ds.SUB_HEADER)) - nb['cells'].append(nbf.v4.new_markdown_cell(ds.JUPYTER_INSTRUCTIONS_RAND)) + 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')) @@ -61,7 +92,7 @@ def create_jupyter_notebook_random_question(destination_filename='numpy_100_rand nbf.write(nb, destination_filename) -def create_markdown(destination_filename='numpy_100', with_hints=False, with_solutions=False): +def create_markdown(destination_filename='100_Numpy_exercises', with_hints=False, with_solutions=False): # Create file name if with_hints: destination_filename += '_with_hints' @@ -72,16 +103,16 @@ def create_markdown(destination_filename='numpy_100', with_hints=False, with_sol mdfile = mdutils.MdUtils(file_name=destination_filename) # Add headers - mdfile.write(ds.HEADER) - mdfile.write(ds.SUB_HEADER) + mdfile.write(HEADERS["header"]) + mdfile.write(HEADERS["sub_header"]) # Add questions (and hint or answers if required) for n in range(1, 101): - mdfile.new_header(title=f"{n}. {ds.QHA[f'q{n}']}", level=4) + mdfile.new_header(title=f"{n}. {QHA[f'q{n}']}", level=4) if with_hints: - mdfile.write(f"`{ds.QHA[f'h{n}']}`") + mdfile.write(f"`{QHA[f'h{n}']}`") if with_solutions: - mdfile.insert_code(ds.QHA[f'a{n}'], language='python') + 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): diff --git a/initialise.py b/initialise.py index 5ed7a008..01ec48a7 100644 --- a/initialise.py +++ b/initialise.py @@ -1,18 +1,18 @@ import numpy as np -import data_source as ds +import generators as ge def question(n): - print(f'{n}. ' + ds.QHA[f'q{n}']) + print(f'{n}. ' + ge.QHA[f'q{n}']) def hint(n): - print(ds.QHA[f'h{n}']) + print(ge.QHA[f'h{n}']) def answer(n): - print(ds.QHA[f'a{n}']) + print(ge.QHA[f'a{n}']) def pick(): diff --git a/source/exercises100.ktx b/source/exercises100.ktx new file mode 100644 index 00000000..13026432 --- /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 using 5 different methods (★★☆) + +< h36 +hint: %, np.floor, np.ceil, astype, np.trunc + +< a36 +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)) + +< 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 +np.set_printoptions(threshold=np.nan) +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..5bee6f2c --- /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. + From 7e871d43994380c0f19c00b5e25999d2185c077a Mon Sep 17 00:00:00 2001 From: SebastianoF Date: Sun, 12 Jan 2020 14:29:05 +0000 Subject: [PATCH 14/22] doc update and data_source removed --- data_source.py | 1213 ------------------------------------------------ generators.py | 4 +- 2 files changed, 2 insertions(+), 1215 deletions(-) delete mode 100644 data_source.py diff --git a/data_source.py b/data_source.py deleted file mode 100644 index 5559f41e..00000000 --- a/data_source.py +++ /dev/null @@ -1,1213 +0,0 @@ -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_INSTRUCTIONS = "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_INSTRUCTIONS_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." - - -QHA = { - "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 using 5 different methods (★★☆)", - "h36": "hint: %, np.floor, np.ceil, astype, np.trunc", - "a36": -""" -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)) -""", - "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": -""" -np.set_printoptions(threshold=np.nan) -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\n - 6, , , 7, 8\n - , , 9,10,11\n''') -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/generators.py b/generators.py index d8251f10..9425b704 100644 --- a/generators.py +++ b/generators.py @@ -38,7 +38,7 @@ def dict_to_ktx(input_dict, output_file, keystarter='<'): 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 data_source.py """ + saved under source files """ # Create cells sequence nb = nbf.v4.new_notebook() @@ -68,7 +68,7 @@ def create_jupyter_notebook(destination_filename='100_Numpy_exercises.ipynb'): 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 data_source.py """ + saved under source files """ # Create cells sequence nb = nbf.v4.new_notebook() From d80aa9c3c9bc046c24e0f4af57389f284bb3676f Mon Sep 17 00:00:00 2001 From: SebastianoF Date: Sun, 19 Jan 2020 22:08:29 +0000 Subject: [PATCH 15/22] source updated with latest merged PR and source re-created --- 100_Numpy_exercises_with_hints.md | 2 +- 100_Numpy_exercises_with_hints_with_solutions.md | 11 +++++++---- 100_Numpy_exercises_with_solutions.md | 9 ++++++--- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/100_Numpy_exercises_with_hints.md b/100_Numpy_exercises_with_hints.md index 4a5b126d..40a04795 100644 --- a/100_Numpy_exercises_with_hints.md +++ b/100_Numpy_exercises_with_hints.md @@ -146,7 +146,7 @@ np.sqrt(-1) == np.emath.sqrt(-1) #### 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)` +`hint: view and [:] =` #### 54. How to read the following file? (★★☆) ``` 1, 2, 3, 4, 5 diff --git a/100_Numpy_exercises_with_hints_with_solutions.md b/100_Numpy_exercises_with_hints_with_solutions.md index 24e9db53..2d63101f 100644 --- a/100_Numpy_exercises_with_hints_with_solutions.md +++ b/100_Numpy_exercises_with_hints_with_solutions.md @@ -504,12 +504,15 @@ 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)` +`hint: view and [:] =` ```python -Z = np.arange(10, dtype=np.float32) -Z = Z.astype(np.int32, copy=False) -print(Z) +# Thanks Vikas (https://stackoverflow.com/a/10622758/5989906) +# & unutbu (https://stackoverflow.com/a/4396247/5989906) +Z = (np.random.rand(10)*100).astype(np.float32) +Y = Z.view(np.int32) +Y[:] = Z +print(Y) ``` #### 54. How to read the following file? (★★☆) ``` diff --git a/100_Numpy_exercises_with_solutions.md b/100_Numpy_exercises_with_solutions.md index 71ed5a53..dcedca91 100644 --- a/100_Numpy_exercises_with_solutions.md +++ b/100_Numpy_exercises_with_solutions.md @@ -507,9 +507,12 @@ print(D) ```python -Z = np.arange(10, dtype=np.float32) -Z = Z.astype(np.int32, copy=False) -print(Z) +# Thanks Vikas (https://stackoverflow.com/a/10622758/5989906) +# & unutbu (https://stackoverflow.com/a/4396247/5989906) +Z = (np.random.rand(10)*100).astype(np.float32) +Y = Z.view(np.int32) +Y[:] = Z +print(Y) ``` #### 54. How to read the following file? (★★☆) ``` From a9fb35b45869c0f0850d2c9e75fe74fd44a6039a Mon Sep 17 00:00:00 2001 From: SebastianoF Date: Tue, 21 Jan 2020 14:09:14 +0000 Subject: [PATCH 16/22] trailing File addressed --- 100_Numpy_exercises.ipynb | 2 +- 100_Numpy_exercises.md | 4 +++- 100_Numpy_exercises_with_hints.md | 4 +++- 100_Numpy_exercises_with_hints_with_solutions.md | 4 +++- 100_Numpy_exercises_with_solutions.md | 4 +++- 100_Numpy_random.ipynb | 2 +- generators.py | 4 ++-- source/headers.ktx | 2 +- 8 files changed, 17 insertions(+), 9 deletions(-) diff --git a/100_Numpy_exercises.ipynb b/100_Numpy_exercises.ipynb index e3fa47cd..2e4a30ee 100644 --- a/100_Numpy_exercises.ipynb +++ b/100_Numpy_exercises.ipynb @@ -12,7 +12,7 @@ "\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 " + "free to open an issue at ." ] }, { diff --git a/100_Numpy_exercises.md b/100_Numpy_exercises.md index ef5a6f57..1e7ce709 100644 --- a/100_Numpy_exercises.md +++ b/100_Numpy_exercises.md @@ -9,7 +9,9 @@ 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. +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` (★☆☆) #### 2. Print the numpy version and the configuration (★☆☆) diff --git a/100_Numpy_exercises_with_hints.md b/100_Numpy_exercises_with_hints.md index 40a04795..905334ad 100644 --- a/100_Numpy_exercises_with_hints.md +++ b/100_Numpy_exercises_with_hints.md @@ -9,7 +9,9 @@ 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. +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 (★☆☆) diff --git a/100_Numpy_exercises_with_hints_with_solutions.md b/100_Numpy_exercises_with_hints_with_solutions.md index 2d63101f..eb835330 100644 --- a/100_Numpy_exercises_with_hints_with_solutions.md +++ b/100_Numpy_exercises_with_hints_with_solutions.md @@ -9,7 +9,9 @@ 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. +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` diff --git a/100_Numpy_exercises_with_solutions.md b/100_Numpy_exercises_with_solutions.md index dcedca91..d51bbde8 100644 --- a/100_Numpy_exercises_with_solutions.md +++ b/100_Numpy_exercises_with_solutions.md @@ -9,7 +9,9 @@ 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. +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` (★☆☆) diff --git a/100_Numpy_random.ipynb b/100_Numpy_random.ipynb index bddcb921..3abd9829 100644 --- a/100_Numpy_random.ipynb +++ b/100_Numpy_random.ipynb @@ -12,7 +12,7 @@ "\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 " + "free to open an issue at ." ] }, { diff --git a/generators.py b/generators.py index 9425b704..a8691d8d 100644 --- a/generators.py +++ b/generators.py @@ -103,8 +103,8 @@ def create_markdown(destination_filename='100_Numpy_exercises', with_hints=False mdfile = mdutils.MdUtils(file_name=destination_filename) # Add headers - mdfile.write(HEADERS["header"]) - mdfile.write(HEADERS["sub_header"]) + 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): diff --git a/source/headers.ktx b/source/headers.ktx index 5bee6f2c..03acd5df 100644 --- a/source/headers.ktx +++ b/source/headers.ktx @@ -7,7 +7,7 @@ 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 +free to open an issue at . < sub_header From 106ca63107f05105f35f63f7951c4d860b3573de Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 12 Feb 2020 18:09:05 +0800 Subject: [PATCH 17/22] fix No.25 --- 100_Numpy_exercises_with_hints.md | 2 +- 100_Numpy_exercises_with_hints_with_solutions.md | 2 +- 100_Numpy_exercises_with_solutions.md | 2 +- source/exercises100.ktx | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/100_Numpy_exercises_with_hints.md b/100_Numpy_exercises_with_hints.md index 905334ad..96fa44af 100644 --- a/100_Numpy_exercises_with_hints.md +++ b/100_Numpy_exercises_with_hints.md @@ -69,7 +69,7 @@ np.nan in set([np.nan]) #### 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: >, <=` +`hint: >, <` #### 26. What is the output of the following script? (★☆☆) ```python # Author: Jake VanderPlas diff --git a/100_Numpy_exercises_with_hints_with_solutions.md b/100_Numpy_exercises_with_hints_with_solutions.md index eb835330..8319fdbf 100644 --- a/100_Numpy_exercises_with_hints_with_solutions.md +++ b/100_Numpy_exercises_with_hints_with_solutions.md @@ -205,7 +205,7 @@ 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: >, <=` +`hint: >, <` ```python # Author: Evgeni Burovski diff --git a/100_Numpy_exercises_with_solutions.md b/100_Numpy_exercises_with_solutions.md index d51bbde8..aaafa807 100644 --- a/100_Numpy_exercises_with_solutions.md +++ b/100_Numpy_exercises_with_solutions.md @@ -211,7 +211,7 @@ print(Z) # Author: Evgeni Burovski Z = np.arange(11) -Z[(3 < Z) & (Z <= 8)] *= -1 +Z[(3 < Z) & (Z < 8)] *= -1 print(Z) ``` #### 26. What is the output of the following script? (★☆☆) diff --git a/source/exercises100.ktx b/source/exercises100.ktx index 13026432..5feb8949 100644 --- a/source/exercises100.ktx +++ b/source/exercises100.ktx @@ -266,7 +266,7 @@ print(Z) Given a 1D array, negate all elements which are between 3 and 8, in place. (★☆☆) < h25 -hint: >, <= +hint: >, < < a25 # Author: Evgeni Burovski From 048e809e07385f7dcd765c12d7faafd4874b8270 Mon Sep 17 00:00:00 2001 From: Corwin74 Date: Sat, 29 Feb 2020 21:05:15 +0300 Subject: [PATCH 18/22] Fix error when running initialise.py on localized Windows --- generators.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generators.py b/generators.py index a8691d8d..3553a741 100644 --- a/generators.py +++ b/generators.py @@ -7,7 +7,7 @@ def ktx_to_dict(input_file, keystarter='<'): """ parsing keyed text to a python dictionary. """ answer = dict() - with open(input_file, 'r+') as f: + with open(input_file, 'r+', encoding='utf-8') as f: lines = f.readlines() k, val = '', '' From 494225f30906a1cd2480f0bec33d4b57e82ced1c Mon Sep 17 00:00:00 2001 From: Viacheslav Zhukov Date: Sat, 7 Mar 2020 14:40:11 +0300 Subject: [PATCH 19/22] fix issue #92 --- source/exercises100.ktx | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/source/exercises100.ktx b/source/exercises100.ktx index 5feb8949..f30fa4ee 100644 --- a/source/exercises100.ktx +++ b/source/exercises100.ktx @@ -423,17 +423,16 @@ np.negative(A,out=A) np.multiply(A,B,out=A) < q36 -Extract the integer part of a random array using 5 different methods (★★☆) +Extract the integer part of a random array of positive numbers using 4 different methods (★★☆) < h36 -hint: %, np.floor, np.ceil, astype, np.trunc +hint: %, np.floor, astype, np.trunc < a36 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)) From 8fe9fdbcf80d763677d2db288e3e9712eb8d7656 Mon Sep 17 00:00:00 2001 From: "Nicolas P. Rougier" Date: Mon, 6 Apr 2020 16:11:55 +0200 Subject: [PATCH 20/22] Create FUNDING.yml --- .github/FUNDING.yml | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .github/FUNDING.yml 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] From b254334f805f4762255299ea7f18233fe9ad1668 Mon Sep 17 00:00:00 2001 From: mozhonglin Date: Fri, 10 Jan 2020 11:36:03 +0800 Subject: [PATCH 21/22] issue #79: setting np.set_printoption threshold param to np.nan is not allowed now --- 100_Numpy_exercises.ipynb | 4 ++-- 100_Numpy_exercises.md | 2 +- 100_Numpy_exercises_with_hints.md | 4 ++-- 100_Numpy_exercises_with_hints_with_solutions.md | 8 ++++---- 100_Numpy_exercises_with_solutions.md | 8 ++++---- 100_Numpy_random.ipynb | 2 +- source/exercises100.ktx | 3 ++- 7 files changed, 16 insertions(+), 15 deletions(-) diff --git a/100_Numpy_exercises.ipynb b/100_Numpy_exercises.ipynb index 2e4a30ee..a0587e98 100644 --- a/100_Numpy_exercises.ipynb +++ b/100_Numpy_exercises.ipynb @@ -564,7 +564,7 @@ "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 (★★☆)" ] }, { @@ -1478,5 +1478,5 @@ ], "metadata": {}, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } diff --git a/100_Numpy_exercises.md b/100_Numpy_exercises.md index 1e7ce709..85c1eac4 100644 --- a/100_Numpy_exercises.md +++ b/100_Numpy_exercises.md @@ -113,7 +113,7 @@ np.sqrt(-1) == np.emath.sqrt(-1) #### 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 (★★☆) +#### 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 (★★☆) diff --git a/100_Numpy_exercises_with_hints.md b/100_Numpy_exercises_with_hints.md index 96fa44af..b9921540 100644 --- a/100_Numpy_exercises_with_hints.md +++ b/100_Numpy_exercises_with_hints.md @@ -113,8 +113,8 @@ np.sqrt(-1) == np.emath.sqrt(-1) `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` +#### 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 (★☆☆) diff --git a/100_Numpy_exercises_with_hints_with_solutions.md b/100_Numpy_exercises_with_hints_with_solutions.md index 8319fdbf..3840ca6c 100644 --- a/100_Numpy_exercises_with_hints_with_solutions.md +++ b/100_Numpy_exercises_with_hints_with_solutions.md @@ -331,15 +331,14 @@ 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 (★★☆) -`hint: %, np.floor, np.ceil, astype, np.trunc` +#### 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 (np.ceil(Z)-1) print (Z.astype(int)) print (np.trunc(Z)) ``` @@ -463,7 +462,8 @@ for dtype in [np.float32, np.float64]: `hint: np.set_printoptions` ```python -np.set_printoptions(threshold=np.nan) +import sys +np.set_printoptions(threshold=sys.maxsize) Z = np.zeros((16,16)) print(Z) ``` diff --git a/100_Numpy_exercises_with_solutions.md b/100_Numpy_exercises_with_solutions.md index aaafa807..33e5389b 100644 --- a/100_Numpy_exercises_with_solutions.md +++ b/100_Numpy_exercises_with_solutions.md @@ -211,7 +211,7 @@ print(Z) # Author: Evgeni Burovski Z = np.arange(11) -Z[(3 < Z) & (Z < 8)] *= -1 +Z[(3 < Z) & (Z <= 8)] *= -1 print(Z) ``` #### 26. What is the output of the following script? (★☆☆) @@ -331,7 +331,7 @@ 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 (★★☆) +#### 36. Extract the integer part of a random array of positive numbers using 4 different methods (★★☆) ```python @@ -339,7 +339,6 @@ 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)) ``` @@ -463,7 +462,8 @@ for dtype in [np.float32, np.float64]: ```python -np.set_printoptions(threshold=np.nan) +import sys +np.set_printoptions(threshold=sys.maxsize) Z = np.zeros((16,16)) print(Z) ``` diff --git a/100_Numpy_random.ipynb b/100_Numpy_random.ipynb index 3abd9829..37dd57da 100644 --- a/100_Numpy_random.ipynb +++ b/100_Numpy_random.ipynb @@ -51,5 +51,5 @@ ], "metadata": {}, "nbformat": 4, - "nbformat_minor": 2 + "nbformat_minor": 4 } diff --git a/source/exercises100.ktx b/source/exercises100.ktx index f30fa4ee..29c14510 100644 --- a/source/exercises100.ktx +++ b/source/exercises100.ktx @@ -595,7 +595,8 @@ How to print all the values of an array? (★★☆) hint: np.set_printoptions < a49 -np.set_printoptions(threshold=np.nan) +import sys +np.set_printoptions(threshold=sys.maxsize) Z = np.zeros((16,16)) print(Z) From e21ebee58e19d691095ca9a71e7151d2c4d036db Mon Sep 17 00:00:00 2001 From: mozhonglin Date: Fri, 10 Jan 2020 11:36:03 +0800 Subject: [PATCH 22/22] issue #79: setting np.set_printoption threshold param to np.nan is not allowed now --- 100_Numpy_exercises_with_hints.md | 2 +- 100_Numpy_exercises_with_hints_with_solutions.md | 11 ++++------- 100_Numpy_exercises_with_solutions.md | 9 +++------ 3 files changed, 8 insertions(+), 14 deletions(-) diff --git a/100_Numpy_exercises_with_hints.md b/100_Numpy_exercises_with_hints.md index b9921540..c6b2a43a 100644 --- a/100_Numpy_exercises_with_hints.md +++ b/100_Numpy_exercises_with_hints.md @@ -148,7 +148,7 @@ np.sqrt(-1) == np.emath.sqrt(-1) #### 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: view and [:] =` +`hint: astype(copy=False)` #### 54. How to read the following file? (★★☆) ``` 1, 2, 3, 4, 5 diff --git a/100_Numpy_exercises_with_hints_with_solutions.md b/100_Numpy_exercises_with_hints_with_solutions.md index 3840ca6c..ea7f96d6 100644 --- a/100_Numpy_exercises_with_hints_with_solutions.md +++ b/100_Numpy_exercises_with_hints_with_solutions.md @@ -506,15 +506,12 @@ 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: view and [:] =` +`hint: astype(copy=False)` ```python -# Thanks Vikas (https://stackoverflow.com/a/10622758/5989906) -# & unutbu (https://stackoverflow.com/a/4396247/5989906) -Z = (np.random.rand(10)*100).astype(np.float32) -Y = Z.view(np.int32) -Y[:] = Z -print(Y) +Z = np.arange(10, dtype=np.float32) +Z = Z.astype(np.int32, copy=False) +print(Z) ``` #### 54. How to read the following file? (★★☆) ``` diff --git a/100_Numpy_exercises_with_solutions.md b/100_Numpy_exercises_with_solutions.md index 33e5389b..4d742558 100644 --- a/100_Numpy_exercises_with_solutions.md +++ b/100_Numpy_exercises_with_solutions.md @@ -509,12 +509,9 @@ print(D) ```python -# Thanks Vikas (https://stackoverflow.com/a/10622758/5989906) -# & unutbu (https://stackoverflow.com/a/4396247/5989906) -Z = (np.random.rand(10)*100).astype(np.float32) -Y = Z.view(np.int32) -Y[:] = Z -print(Y) +Z = np.arange(10, dtype=np.float32) +Z = Z.astype(np.int32, copy=False) +print(Z) ``` #### 54. How to read the following file? (★★☆) ```