rename and ktx source files added
This commit is contained in:
parent
ac42b7e154
commit
3298f0258b
@ -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 <https://github.com/rougier/numpy-100>\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 <https://github.com/rougier/numpy-100>"
|
||||
]
|
||||
},
|
||||
{
|
||||
@ -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 (★★★)"
|
||||
]
|
||||
},
|
||||
{
|
@ -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 <https://github.com/rougier/numpy-100>
|
||||
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 <https://github.com/rougier/numpy-100>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?
|
||||
|
@ -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 <https://github.com/rougier/numpy-100>
|
||||
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 <https://github.com/rougier/numpy-100>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). (★★★)
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -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 <https://github.com/rougier/numpy-100>\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 <https://github.com/rougier/numpy-100>"
|
||||
]
|
||||
},
|
||||
{
|
||||
@ -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."
|
||||
]
|
||||
},
|
||||
{
|
@ -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)
|
||||
|
@ -2,10 +2,41 @@ import os
|
||||
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()
|
||||
|
||||
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 create_jupyter_notebook(destination_filename='numpy_100.ipynb'):
|
||||
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):
|
||||
|
@ -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():
|
||||
|
1457
source/exercises100.ktx
Normal file
1457
source/exercises100.ktx
Normal file
File diff suppressed because it is too large
Load Diff
25
source/headers.ktx
Normal file
25
source/headers.ktx
Normal file
@ -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 <https://github.com/rougier/numpy-100>
|
||||
|
||||
|
||||
< 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.
|
||||
|
Loading…
Reference in New Issue
Block a user