2016-07-15 15:28:59 +02:00
2019-11-23 21:05:14 +01:00
# 100 numpy exercises
2023-04-03 09:26:02 +02:00
This is a collection of exercises that have been collected in the numpy mailing list , on stack overflow
2020-01-12 15:22:49 +01:00
and in the numpy documentation . The goal of this collection is to offer a quick reference for both old
2023-04-03 09:26:02 +02:00
and new users but also to provide a set of exercises for those who teach .
2019-11-23 21:05:14 +01:00
2016-07-15 15:28:59 +02:00
2023-04-03 09:26:02 +02:00
If you find an error or think you ' ve a better way to solve some of them, feel
2020-01-21 15:09:14 +01:00
free to open an issue at < https : / / github . com / rougier / numpy - 100 > .
File automatically generated . See the documentation to update questions / answers / hints programmatically .
2016-07-15 15:28:59 +02:00
#### 1. Import the numpy package under the name `np` (★☆☆)
` ` ` python
import numpy as np
2019-11-23 21:05:14 +01:00
` ` `
2016-07-15 15:28:59 +02:00
#### 2. Print the numpy version and the configuration (★☆☆)
` ` ` python
print ( np . __version__ )
np . show_config ( )
2019-11-23 21:05:14 +01:00
` ` `
2016-07-15 15:28:59 +02:00
#### 3. Create a null vector of size 10 (★☆☆)
` ` ` python
Z = np . zeros ( 10 )
print ( Z )
2019-11-23 21:05:14 +01:00
` ` `
#### 4. How to find the memory size of any array (★☆☆)
2016-07-15 15:28:59 +02:00
` ` ` python
Z = np . zeros ( ( 10 , 10 ) )
print ( " %d bytes " % ( Z . size * Z . itemsize ) )
2019-11-23 21:05:14 +01:00
` ` `
#### 5. How to get the documentation of the numpy add function from the command line? (★☆☆)
2016-07-15 15:28:59 +02:00
2016-08-18 01:05:56 +02:00
` ` ` python
% run ` python - c " import numpy; numpy.info(numpy.add) " `
2019-11-23 21:05:14 +01:00
` ` `
#### 6. Create a null vector of size 10 but the fifth value which is 1 (★☆☆)
2016-07-15 15:28:59 +02:00
` ` ` python
Z = np . zeros ( 10 )
Z [ 4 ] = 1
print ( Z )
2019-11-23 21:05:14 +01:00
` ` `
#### 7. Create a vector with values ranging from 10 to 49 (★☆☆)
2016-07-15 15:28:59 +02:00
` ` ` python
Z = np . arange ( 10 , 50 )
print ( Z )
2019-11-23 21:05:14 +01:00
` ` `
#### 8. Reverse a vector (first element becomes last) (★☆☆)
2016-07-15 15:28:59 +02:00
` ` ` python
Z = np . arange ( 50 )
Z = Z [ : : - 1 ]
print ( Z )
2019-11-23 21:05:14 +01:00
` ` `
#### 9. Create a 3x3 matrix with values ranging from 0 to 8 (★☆☆)
2016-07-15 15:28:59 +02:00
` ` ` python
2020-05-29 00:35:39 +02:00
Z = np . arange ( 9 ) . reshape ( 3 , 3 )
print ( Z )
2019-11-23 21:05:14 +01:00
` ` `
#### 10. Find indices of non-zero elements from [1,2,0,0,4,0] (★☆☆)
2016-07-15 15:28:59 +02:00
` ` ` python
nz = np . nonzero ( [ 1 , 2 , 0 , 0 , 4 , 0 ] )
print ( nz )
2019-11-23 21:05:14 +01:00
` ` `
2016-07-15 15:28:59 +02:00
#### 11. Create a 3x3 identity matrix (★☆☆)
` ` ` python
Z = np . eye ( 3 )
print ( Z )
2019-11-23 21:05:14 +01:00
` ` `
2016-07-15 15:28:59 +02:00
#### 12. Create a 3x3x3 array with random values (★☆☆)
` ` ` python
Z = np . random . random ( ( 3 , 3 , 3 ) )
print ( Z )
2019-11-23 21:05:14 +01:00
` ` `
2016-07-15 15:28:59 +02:00
#### 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 )
2019-11-23 21:05:14 +01:00
` ` `
2016-07-15 15:28:59 +02:00
#### 14. Create a random vector of size 30 and find the mean value (★☆☆)
` ` ` python
Z = np . random . random ( 30 )
m = Z . mean ( )
print ( m )
2019-11-23 21:05:14 +01:00
` ` `
2016-07-15 15:28:59 +02:00
#### 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 )
2019-11-23 21:05:14 +01:00
` ` `
2016-07-15 15:28:59 +02:00
#### 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 )
2020-06-03 23:58:44 +02:00
# Using fancy indexing
Z [ : , [ 0 , - 1 ] ] = 0
Z [ [ 0 , - 1 ] , : ] = 0
print ( Z )
2019-11-23 21:05:14 +01:00
` ` `
2016-07-15 15:28:59 +02:00
#### 17. What is the result of the following expression? (★☆☆)
2019-11-23 21:05:14 +01:00
` ` ` 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
` ` `
2016-07-15 15:28:59 +02:00
` ` ` python
print ( 0 * np . nan )
print ( np . nan == np . nan )
print ( np . inf > np . nan )
print ( np . nan - np . nan )
2018-10-31 09:42:02 +01:00
print ( np . nan in set ( [ np . nan ] ) )
2016-07-15 15:28:59 +02:00
print ( 0.3 == 3 * 0.1 )
2019-11-23 21:05:14 +01:00
` ` `
2016-07-15 15:28:59 +02:00
#### 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 )
2019-11-23 21:05:14 +01:00
` ` `
2016-07-15 15:28:59 +02:00
#### 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 )
2019-11-23 21:05:14 +01:00
` ` `
2021-06-11 16:14:29 +02:00
#### 20. Consider a (6,7,8) shape array, what is the index (x,y,z) of the 100th element? (★☆☆)
2016-07-15 15:28:59 +02:00
` ` ` python
2018-06-07 16:25:23 +02:00
print ( np . unravel_index ( 99 , ( 6 , 7 , 8 ) ) )
2019-11-23 21:05:14 +01:00
` ` `
2016-07-15 15:28:59 +02:00
#### 21. Create a checkerboard 8x8 matrix using the tile function (★☆☆)
` ` ` python
2022-01-31 19:14:41 +01:00
Z = np . tile ( np . array ( [ [ 0 , 1 ] , [ 1 , 0 ] ] ) , ( 4 , 4 ) )
2016-07-15 15:28:59 +02:00
print ( Z )
2019-11-23 21:05:14 +01:00
` ` `
2016-07-15 15:28:59 +02:00
#### 22. Normalize a 5x5 random matrix (★☆☆)
` ` ` python
Z = np . random . random ( ( 5 , 5 ) )
2018-10-31 09:27:30 +01:00
Z = ( Z - np . mean ( Z ) ) / ( np . std ( Z ) )
2016-07-15 15:28:59 +02:00
print ( Z )
2019-11-23 21:05:14 +01:00
` ` `
2017-03-30 18:35:50 +02:00
#### 23. Create a custom dtype that describes a color as four unsigned bytes (RGBA) (★☆☆)
2016-07-15 15:28:59 +02:00
` ` ` python
2021-04-08 20:51:14 +02:00
color = np . dtype ( [ ( " r " , np . ubyte ) ,
( " g " , np . ubyte ) ,
( " b " , np . ubyte ) ,
( " a " , np . ubyte ) ] )
2019-11-23 21:05:14 +01:00
` ` `
2016-07-15 15:28:59 +02:00
#### 24. Multiply a 5x3 matrix by a 3x2 matrix (real matrix product) (★☆☆)
` ` ` python
2025-02-18 08:13:08 +01:00
Z = np . matmul ( np . ones ( ( 5 , 3 ) ) , np . ones ( ( 3 , 2 ) ) )
2016-07-15 15:28:59 +02:00
print ( Z )
2016-09-30 23:25:54 +02:00
# Alternative solution, in Python 3.5 and above
Z = np . ones ( ( 5 , 3 ) ) @ np . ones ( ( 3 , 2 ) )
print ( Z )
2019-11-23 21:05:14 +01:00
` ` `
2016-07-15 15:28:59 +02:00
#### 25. Given a 1D array, negate all elements which are between 3 and 8, in place. (★☆☆)
` ` ` python
# Author: Evgeni Burovski
Z = np . arange ( 11 )
2020-06-09 23:07:54 +02:00
Z [ ( 3 < Z ) & ( Z < 8 ) ] * = - 1
2016-07-15 15:28:59 +02:00
print ( Z )
2019-11-23 21:05:14 +01:00
` ` `
2016-07-15 15:28:59 +02:00
#### 26. What is the output of the following script? (★☆☆)
2019-11-23 21:05:14 +01:00
` ` ` python
# Author: Jake VanderPlas
print ( sum ( range ( 5 ) , - 1 ) )
from numpy import *
print ( sum ( range ( 5 ) , - 1 ) )
` ` `
2016-07-15 15:28:59 +02:00
` ` ` python
# Author: Jake VanderPlas
print ( sum ( range ( 5 ) , - 1 ) )
from numpy import *
print ( sum ( range ( 5 ) , - 1 ) )
2019-11-23 21:05:14 +01:00
` ` `
2016-07-15 15:28:59 +02:00
#### 27. Consider an integer vector Z, which of these expressions are legal? (★☆☆)
2019-11-23 21:05:14 +01:00
` ` ` python
Z * * Z
2 << Z >> 2
Z < - Z
1 j * Z
Z / 1 / 1
Z < Z > Z
` ` `
2016-07-15 15:28:59 +02:00
` ` ` python
Z * * Z
2 << Z >> 2
Z < - Z
1 j * Z
Z / 1 / 1
Z < Z > Z
2019-11-23 21:05:14 +01:00
` ` `
2021-06-11 16:14:29 +02:00
#### 28. What are the result of the following expressions? (★☆☆)
2019-11-23 21:05:14 +01:00
` ` ` python
np . array ( 0 ) / np . array ( 0 )
np . array ( 0 ) / / np . array ( 0 )
np . array ( [ np . nan ] ) . astype ( int ) . astype ( float )
` ` `
2016-07-15 15:28:59 +02:00
` ` ` python
print ( np . array ( 0 ) / np . array ( 0 ) )
print ( np . array ( 0 ) / / np . array ( 0 ) )
print ( np . array ( [ np . nan ] ) . astype ( int ) . astype ( float ) )
2019-11-23 21:05:14 +01:00
` ` `
2016-07-15 15:28:59 +02:00
#### 29. How to round away from zero a float array ? (★☆☆)
` ` ` python
# Author: Charles R Harris
Z = np . random . uniform ( - 10 , + 10 , 10 )
2020-05-29 00:35:39 +02:00
print ( np . copysign ( np . ceil ( np . abs ( Z ) ) , Z ) )
# More readable but less efficient
print ( np . where ( Z > 0 , np . ceil ( Z ) , np . floor ( Z ) ) )
2019-11-23 21:05:14 +01:00
` ` `
2016-07-15 15:28:59 +02:00
#### 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 ) )
2019-11-23 21:05:14 +01:00
` ` `
2016-07-15 15:28:59 +02:00
#### 31. How to ignore all numpy warnings (not recommended)? (★☆☆)
` ` ` python
# Suicide mode on
defaults = np . seterr ( all = " ignore " )
2016-10-29 16:03:53 +02:00
Z = np . ones ( 1 ) / 0
2016-07-15 15:28:59 +02:00
# Back to sanity
_ = np . seterr ( * * defaults )
2019-11-23 21:05:14 +01:00
# Equivalently with a context manager
2020-05-29 00:35:39 +02:00
with np . errstate ( all = " ignore " ) :
np . arange ( 3 ) / 0
2019-11-23 21:05:14 +01:00
` ` `
#### 32. Is the following expressions true? (★☆☆)
2016-10-29 16:03:53 +02:00
` ` ` python
2019-11-23 21:05:14 +01:00
np . sqrt ( - 1 ) == np . emath . sqrt ( - 1 )
2016-10-29 16:03:53 +02:00
` ` `
2016-07-15 15:28:59 +02:00
` ` ` python
np . sqrt ( - 1 ) == np . emath . sqrt ( - 1 )
2019-11-23 21:05:14 +01:00
` ` `
2016-07-15 15:28:59 +02:00
#### 33. How to get the dates of yesterday, today and tomorrow? (★☆☆)
` ` ` python
2020-05-29 00:35:39 +02:00
yesterday = np . datetime64 ( ' today ' ) - np . timedelta64 ( 1 )
today = np . datetime64 ( ' today ' )
tomorrow = np . datetime64 ( ' today ' ) + np . timedelta64 ( 1 )
2019-11-23 21:05:14 +01:00
` ` `
2016-07-15 15:28:59 +02:00
#### 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 )
2019-11-23 21:05:14 +01:00
` ` `
#### 35. How to compute ((A+B)*(-A/2)) in place (without copy)? (★★☆)
2016-07-15 15:28:59 +02:00
` ` ` python
A = np . ones ( 3 ) * 1
B = np . ones ( 3 ) * 2
np . add ( A , B , out = B )
np . divide ( A , 2 , out = A )
np . negative ( A , out = A )
np . multiply ( A , B , out = A )
2019-11-23 21:05:14 +01:00
` ` `
2020-05-29 00:35:39 +02:00
#### 36. Extract the integer part of a random array of positive numbers using 4 different methods (★★☆)
2016-07-15 15:28:59 +02:00
` ` ` python
Z = np . random . uniform ( 0 , 10 , 10 )
2020-05-29 00:35:39 +02:00
print ( Z - Z % 1 )
print ( Z / / 1 )
print ( np . floor ( Z ) )
print ( Z . astype ( int ) )
print ( np . trunc ( Z ) )
2019-11-23 21:05:14 +01:00
` ` `
2016-07-15 15:28:59 +02:00
#### 37. Create a 5x5 matrix with row values ranging from 0 to 4 (★★☆)
` ` ` python
2021-04-09 10:50:11 +02:00
Z = np . zeros ( ( 5 , 5 ) )
Z + = np . arange ( 5 )
print ( Z )
# without broadcasting
2021-04-08 20:51:14 +02:00
Z = np . tile ( np . arange ( 0 , 5 ) , ( 5 , 1 ) )
2016-07-15 15:28:59 +02:00
print ( Z )
2019-11-23 21:05:14 +01:00
` ` `
2016-07-15 15:28:59 +02:00
#### 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 )
2019-11-23 21:05:14 +01:00
` ` `
2016-07-15 15:28:59 +02:00
#### 39. Create a vector of size 10 with values ranging from 0 to 1, both excluded (★★☆)
` ` ` python
2017-07-04 06:34:47 +02:00
Z = np . linspace ( 0 , 1 , 11 , endpoint = False ) [ 1 : ]
2016-07-15 15:28:59 +02:00
print ( Z )
2019-11-23 21:05:14 +01:00
` ` `
2016-07-15 15:28:59 +02:00
#### 40. Create a random vector of size 10 and sort it (★★☆)
` ` ` python
Z = np . random . random ( 10 )
Z . sort ( )
print ( Z )
2019-11-23 21:05:14 +01:00
` ` `
2016-07-15 15:28:59 +02:00
#### 41. How to sum a small array faster than np.sum? (★★☆)
` ` ` python
# Author: Evgeni Burovski
Z = np . arange ( 10 )
np . add . reduce ( Z )
2019-11-23 21:05:14 +01:00
` ` `
2017-03-30 18:35:50 +02:00
#### 42. Consider two random array A and B, check if they are equal (★★☆)
2016-07-15 15:28:59 +02:00
` ` ` python
A = np . random . randint ( 0 , 2 , 5 )
B = np . random . randint ( 0 , 2 , 5 )
2016-09-01 13:52:41 +02:00
2016-08-25 14:52:59 +02:00
# Assuming identical shape of the arrays and a tolerance for the comparison of values
2016-07-15 15:28:59 +02:00
equal = np . allclose ( A , B )
print ( equal )
2016-08-25 14:52:59 +02:00
# Checking both the shape and the element values, no tolerance (values have to be exactly equal)
equal = np . array_equal ( A , B )
print ( equal )
2019-11-23 21:05:14 +01:00
` ` `
2016-07-15 15:28:59 +02:00
#### 43. Make an array immutable (read-only) (★★☆)
` ` ` python
Z = np . zeros ( 10 )
Z . flags . writeable = False
Z [ 0 ] = 1
2019-11-23 21:05:14 +01:00
` ` `
2016-07-15 15:28:59 +02:00
#### 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 )
2019-11-23 21:05:14 +01:00
` ` `
2016-07-15 15:28:59 +02:00
#### 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 )
2019-11-23 21:05:14 +01:00
` ` `
#### 46. Create a structured array with `x` and `y` coordinates covering the [0,1]x[0,1] area (★★☆)
2016-07-15 15:28:59 +02:00
` ` ` 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 )
2019-11-23 21:05:14 +01:00
` ` `
2021-06-11 16:14:29 +02:00
#### 47. Given two arrays, X and Y, construct the Cauchy matrix C (Cij =1/(xi - yj)) (★★☆)
2016-07-15 15:28:59 +02:00
` ` ` 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 ) )
2019-11-23 21:05:14 +01:00
` ` `
2016-07-15 15:28:59 +02:00
#### 48. Print the minimum and maximum representable value for each numpy scalar type (★★☆)
` ` ` python
for dtype in [ np . int8 , np . int32 , np . int64 ] :
print ( np . iinfo ( dtype ) . min )
print ( np . iinfo ( dtype ) . max )
for dtype in [ np . float32 , np . float64 ] :
print ( np . finfo ( dtype ) . min )
print ( np . finfo ( dtype ) . max )
print ( np . finfo ( dtype ) . eps )
2019-11-23 21:05:14 +01:00
` ` `
2016-07-15 15:28:59 +02:00
#### 49. How to print all the values of an array? (★★☆)
` ` ` python
2020-07-01 10:19:32 +02:00
np . set_printoptions ( threshold = float ( " inf " ) )
2021-04-08 20:51:14 +02:00
Z = np . zeros ( ( 40 , 40 ) )
2016-07-15 15:28:59 +02:00
print ( Z )
2019-11-23 21:05:14 +01:00
` ` `
2017-05-25 17:25:13 +02:00
#### 50. How to find the closest value (to a given scalar) in a vector? (★★☆)
2016-07-15 15:28:59 +02:00
` ` ` python
Z = np . arange ( 100 )
v = np . random . uniform ( 0 , 100 )
index = ( np . abs ( Z - v ) ) . argmin ( )
print ( Z [ index ] )
2019-11-23 21:05:14 +01:00
` ` `
2016-07-15 15:28:59 +02:00
#### 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 )
2019-11-23 21:05:14 +01:00
` ` `
2016-07-15 15:28:59 +02:00
#### 52. Consider a random vector with shape (100,2) representing coordinates, find point by point distances (★★☆)
` ` ` python
Z = np . random . random ( ( 10 , 2 ) )
2016-09-09 11:50:46 +02:00
X , Y = np . atleast_2d ( Z [ : , 0 ] , Z [ : , 1 ] )
2016-07-15 15:28:59 +02:00
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 )
2019-11-23 21:05:14 +01:00
` ` `
2016-07-15 15:28:59 +02:00
#### 53. How to convert a float (32 bits) array into an integer (32 bits) in place?
` ` ` python
2020-01-19 23:08:29 +01:00
# 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 )
2019-11-23 21:05:14 +01:00
` ` `
2016-07-15 15:28:59 +02:00
#### 54. How to read the following file? (★★☆)
2019-11-23 21:05:14 +01:00
` ` `
1 , 2 , 3 , 4 , 5
6 , , , 7 , 8
, , 9 , 10 , 11
` ` `
2016-07-15 15:28:59 +02:00
` ` ` python
from io import StringIO
2018-06-07 16:25:23 +02:00
# Fake file
2019-11-23 21:05:14 +01:00
s = StringIO ( ''' 1, 2, 3, 4, 5
6 , , , 7 , 8
, , 9 , 10 , 11
''' )
2016-07-15 15:28:59 +02:00
Z = np . genfromtxt ( s , delimiter = " , " , dtype = np . int )
print ( Z )
2019-11-23 21:05:14 +01:00
` ` `
2016-07-15 15:28:59 +02:00
#### 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 ] )
2019-11-23 21:05:14 +01:00
` ` `
2016-07-15 15:28:59 +02:00
#### 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 )
2019-11-23 21:05:14 +01:00
` ` `
2016-07-15 15:28:59 +02:00
#### 57. How to randomly place p elements in a 2D array? (★★☆)
` ` ` python
# Author: Divakar
n = 10
p = 3
Z = np . zeros ( ( n , n ) )
np . put ( Z , np . random . choice ( range ( n * n ) , p , replace = False ) , 1 )
print ( Z )
2019-11-23 21:05:14 +01:00
` ` `
2016-07-15 15:28:59 +02:00
#### 58. Subtract the mean of each row of a matrix (★★☆)
` ` ` python
# Author: Warren Weckesser
X = np . random . rand ( 5 , 10 )
# Recent versions of numpy
Y = X - X . mean ( axis = 1 , keepdims = True )
# Older versions of numpy
Y = X - X . mean ( axis = 1 ) . reshape ( - 1 , 1 )
print ( Y )
2019-11-23 21:05:14 +01:00
` ` `
#### 59. How to sort an array by the nth column? (★★☆)
2016-07-15 15:28:59 +02:00
` ` ` python
# Author: Steve Tjoa
Z = np . random . randint ( 0 , 10 , ( 3 , 3 ) )
print ( Z )
print ( Z [ Z [ : , 1 ] . argsort ( ) ] )
2019-11-23 21:05:14 +01:00
` ` `
2016-07-16 00:09:47 +02:00
#### 60. How to tell if a given 2D array has null columns? (★★☆)
2016-07-15 15:28:59 +02:00
` ` ` python
# Author: Warren Weckesser
2022-10-17 13:43:14 +02:00
# null : 0
2016-07-15 15:28:59 +02:00
Z = np . random . randint ( 0 , 3 , ( 3 , 10 ) )
print ( ( ~ Z . any ( axis = 0 ) ) . any ( ) )
2022-10-17 13:43:14 +02:00
# null : np.nan
Z = np . array ( [
[ 0 , 1 , np . nan ] ,
[ 1 , 2 , np . nan ] ,
[ 4 , 5 , np . nan ]
] )
print ( np . isnan ( Z ) . all ( axis = 0 ) )
2019-11-23 21:05:14 +01:00
` ` `
2016-07-15 15:28:59 +02:00
#### 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 )
2019-11-23 21:05:14 +01:00
` ` `
2016-07-15 15:28:59 +02:00
#### 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 ] )
2019-11-23 21:05:14 +01:00
` ` `
2016-07-15 15:28:59 +02:00
#### 63. Create an array class that has a name attribute (★★☆)
` ` ` python
class NamedArray ( np . ndarray ) :
def __new__ ( cls , array , name = " no name " ) :
obj = np . asarray ( array ) . view ( cls )
obj . name = name
return obj
def __array_finalize__ ( self , obj ) :
if obj is None : return
2022-10-17 13:43:14 +02:00
self . name = getattr ( obj , ' name ' , " no name " )
2016-07-15 15:28:59 +02:00
Z = NamedArray ( np . arange ( 10 ) , " range_10 " )
print ( Z . name )
2019-11-23 21:05:14 +01:00
` ` `
2016-07-15 15:28:59 +02:00
#### 64. Consider a given vector, how to add 1 to each element indexed by a second vector (be careful with repeated indices)? (★★★)
` ` ` python
# Author: Brett Olsen
Z = np . ones ( 10 )
I = np . random . randint ( 0 , len ( Z ) , 20 )
Z + = np . bincount ( I , minlength = len ( Z ) )
print ( Z )
2016-08-18 01:05:56 +02:00
# Another solution
# Author: Bartosz Telenczuk
np . add . at ( Z , I , 1 )
print ( Z )
2019-11-23 21:05:14 +01:00
` ` `
2016-07-15 15:28:59 +02:00
#### 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 )
2019-11-23 21:05:14 +01:00
` ` `
2021-03-11 10:10:53 +01:00
#### 66. Considering a (w,h,3) image of (dtype=ubyte), compute the number of unique colors (★★☆)
2016-07-15 15:28:59 +02:00
` ` ` python
2021-03-09 14:42:18 +01:00
# Author: Fisher Wang
2021-03-12 15:29:45 +01:00
w , h = 256 , 256
2021-04-08 20:51:14 +02:00
I = np . random . randint ( 0 , 4 , ( h , w , 3 ) ) . astype ( np . ubyte )
2021-03-12 15:29:45 +01:00
colors = np . unique ( I . reshape ( - 1 , 3 ) , axis = 0 )
2021-03-09 14:42:18 +01:00
n = len ( colors )
print ( n )
2021-04-08 20:51:14 +02:00
# Faster version
# Author: Mark Setchell
# https://stackoverflow.com/a/59671950/2836621
w , h = 256 , 256
I = np . random . randint ( 0 , 4 , ( h , w , 3 ) , dtype = np . uint8 )
# View each pixel as a single 24-bit integer, rather than three 8-bit bytes
I24 = np . dot ( I . astype ( np . uint32 ) , [ 1 , 256 , 65536 ] )
# Count unique colours
n = len ( np . unique ( I24 ) )
print ( n )
2019-11-23 21:05:14 +01:00
` ` `
2016-07-15 15:28:59 +02:00
#### 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 ) )
2016-09-28 09:32:10 +02:00
# solution by passing a tuple of axes (introduced in numpy 1.7.0)
2016-09-27 15:16:26 +02:00
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)
2016-07-15 15:28:59 +02:00
sum = A . reshape ( A . shape [ : - 2 ] + ( - 1 , ) ) . sum ( axis = - 1 )
print ( sum )
2019-11-23 21:05:14 +01:00
` ` `
2016-07-15 15:28:59 +02:00
#### 68. Considering a one-dimensional vector D, how to compute means of subsets of D using a vector S of same size describing subset indices? (★★★)
` ` ` python
# Author: Jaime Fernández del Río
D = np . random . uniform ( 0 , 1 , 100 )
S = np . random . randint ( 0 , 10 , 100 )
D_sums = np . bincount ( S , weights = D )
D_counts = np . bincount ( S )
D_means = D_sums / D_counts
print ( D_means )
2016-10-04 11:57:43 +02:00
# Pandas solution as a reference due to more intuitive code
import pandas as pd
print ( pd . Series ( D ) . groupby ( S ) . mean ( ) )
2019-11-23 21:05:14 +01:00
` ` `
2016-07-15 15:28:59 +02:00
#### 69. How to get the diagonal of a dot product? (★★★)
` ` ` python
# Author: Mathieu Blondel
A = np . random . uniform ( 0 , 1 , ( 5 , 5 ) )
B = np . random . uniform ( 0 , 1 , ( 5 , 5 ) )
2020-05-29 00:35:39 +02:00
# Slow version
2016-07-15 15:28:59 +02:00
np . diag ( np . dot ( A , B ) )
# Fast version
np . sum ( A * B . T , axis = 1 )
# Faster version
np . einsum ( " ij,ji->i " , A , B )
2019-11-23 21:05:14 +01:00
` ` `
#### 70. Consider the vector [1, 2, 3, 4, 5], how to build a new vector with 3 consecutive zeros interleaved between each value? (★★★)
2016-07-15 15:28:59 +02:00
` ` ` 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 )
2019-11-23 21:05:14 +01:00
` ` `
2016-07-15 15:28:59 +02:00
#### 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 ] )
2019-11-23 21:05:14 +01:00
` ` `
2016-07-15 15:28:59 +02:00
#### 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 )
2019-11-23 21:05:14 +01:00
` ` `
2016-07-15 15:28:59 +02:00
#### 73. Consider a set of 10 triplets describing 10 triangles (with shared vertices), find the set of unique line segments composing all the triangles (★★★)
` ` ` python
# Author: Nicolas P. Rougier
faces = np . random . randint ( 0 , 100 , ( 10 , 3 ) )
F = np . roll ( faces . repeat ( 2 , axis = 1 ) , - 1 , axis = 1 )
F = F . reshape ( len ( F ) * 3 , 2 )
F = np . sort ( F , axis = 1 )
G = F . view ( dtype = [ ( ' p0 ' , F . dtype ) , ( ' p1 ' , F . dtype ) ] )
G = np . unique ( G )
print ( G )
2019-11-23 21:05:14 +01:00
` ` `
2021-01-04 10:01:42 +01:00
#### 74. Given a sorted array C that corresponds to a bincount, how to produce an array A such that np.bincount(A) == C? (★★★)
2016-07-15 15:28:59 +02:00
` ` ` 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 )
2019-11-23 21:05:14 +01:00
` ` `
2016-07-15 15:28:59 +02:00
#### 75. How to compute averages using a sliding window over an array? (★★★)
` ` ` python
# Author: Jaime Fernández del Río
def moving_average ( a , n = 3 ) :
ret = np . cumsum ( a , dtype = float )
ret [ n : ] = ret [ n : ] - ret [ : - n ]
return ret [ n - 1 : ] / n
Z = np . arange ( 20 )
print ( moving_average ( Z , n = 3 ) )
2022-01-31 19:14:41 +01:00
# Author: Jeff Luo (@Jeff1999)
# make sure your NumPy >= 1.20.0
from numpy . lib . stride_tricks import sliding_window_view
Z = np . arange ( 20 )
print ( sliding_window_view ( Z , window_shape = 3 ) . mean ( axis = - 1 ) )
2019-11-23 21:05:14 +01:00
` ` `
#### 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]) (★★★)
2016-07-15 15:28:59 +02:00
` ` ` python
# Author: Joe Kington / Erik Rigtorp
from numpy . lib import stride_tricks
def rolling ( a , window ) :
shape = ( a . size - window + 1 , window )
2021-06-11 16:14:29 +02:00
strides = ( a . strides [ 0 ] , a . strides [ 0 ] )
2016-07-15 15:28:59 +02:00
return stride_tricks . as_strided ( a , shape = shape , strides = strides )
Z = rolling ( np . arange ( 10 ) , 3 )
print ( Z )
2022-01-31 19:14:41 +01:00
# Author: Jeff Luo (@Jeff1999)
Z = np . arange ( 10 )
print ( sliding_window_view ( Z , window_shape = 3 ) )
2019-11-23 21:05:14 +01:00
` ` `
2016-07-15 15:28:59 +02:00
#### 77. How to negate a boolean, or to change the sign of a float inplace? (★★★)
` ` ` python
# Author: Nathaniel J. Smith
Z = np . random . randint ( 0 , 2 , 100 )
np . logical_not ( Z , out = Z )
Z = np . random . uniform ( - 1.0 , 1.0 , 100 )
np . negative ( Z , out = Z )
2019-11-23 21:05:14 +01:00
` ` `
#### 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])? (★★★)
2016-07-15 15:28:59 +02:00
` ` ` 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 ) )
2019-11-23 21:05:14 +01:00
` ` `
#### 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])? (★★★)
2016-07-15 15:28:59 +02:00
` ` ` 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 ] ) )
2025-02-18 08:13:08 +01:00
# Author: Yang Wu (Broadcasting)
def distance_points_to_lines ( p : np . ndarray , p_1 : np . ndarray , p_2 : np . ndarray ) - > np . ndarray :
x_0 , y_0 = p . T # Shape -> (n points, )
x_1 , y_1 = p_1 . T # Shape -> (n lines, )
x_2 , y_2 = p_2 . T # Shape -> (n lines, )
# Displacement vector coordinates from p_1 -> p_2
dx = x_2 - x_1 # Shape -> (n lines, )
dy = y_2 - y_1 # Shape -> (n lines, )
# The 'cross product' term
cross_term = x_2 * y_1 - y_2 * x_1 # Shape -> (n lines, )
# Broadcast x_0, y_0 (n points, 1) and dx, dy, cross_term (1, n lines) -> (n points, n lines)
numerator = np . abs (
dy [ np . newaxis , : ] * x_0 [ : , np . newaxis ]
- dx [ np . newaxis , : ] * y_0 [ : , np . newaxis ]
+ cross_term [ np . newaxis , : ]
)
denominator = np . sqrt ( dx * * 2 + dy * * 2 ) # Shape -> (n lines, )
# Shape (n points, n lines) / (1, n_lines) -> (n points, n lines)
return numerator / denominator [ np . newaxis , : ]
distance_points_to_lines ( p , P0 , P1 )
2019-11-23 21:05:14 +01:00
` ` `
2016-07-15 15:28:59 +02:00
#### 80. Consider an arbitrary array, write a function that extract a subpart with a fixed shape and centered on a given element (pad with a `fill` value when necessary) (★★★)
` ` ` python
# Author: Nicolas Rougier
Z = np . random . randint ( 0 , 10 , ( 10 , 10 ) )
shape = ( 5 , 5 )
fill = 0
position = ( 1 , 1 )
R = np . ones ( shape , dtype = Z . dtype ) * fill
P = np . array ( list ( position ) ) . astype ( int )
Rs = np . array ( list ( R . shape ) ) . astype ( int )
Zs = np . array ( list ( Z . shape ) ) . astype ( int )
R_start = np . zeros ( ( len ( shape ) , ) ) . astype ( int )
R_stop = np . array ( list ( shape ) ) . astype ( int )
Z_start = ( P - Rs / / 2 )
Z_stop = ( P + Rs / / 2 ) + Rs % 2
R_start = ( R_start - np . minimum ( Z_start , 0 ) ) . tolist ( )
Z_start = ( np . maximum ( Z_start , 0 ) ) . tolist ( )
R_stop = np . maximum ( R_start , ( R_stop - np . maximum ( Z_stop - Zs , 0 ) ) ) . tolist ( )
Z_stop = ( np . minimum ( Z_stop , Zs ) ) . tolist ( )
r = [ slice ( start , stop ) for start , stop in zip ( R_start , R_stop ) ]
z = [ slice ( start , stop ) for start , stop in zip ( Z_start , Z_stop ) ]
R [ r ] = Z [ z ]
print ( Z )
print ( R )
2019-11-23 21:05:14 +01:00
` ` `
#### 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]]? (★★★)
2016-07-15 15:28:59 +02:00
` ` ` 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 )
2022-01-31 19:14:41 +01:00
# Author: Jeff Luo (@Jeff1999)
Z = np . arange ( 1 , 15 , dtype = np . uint32 )
print ( sliding_window_view ( Z , window_shape = 4 ) )
2019-11-23 21:05:14 +01:00
` ` `
2020-01-12 15:22:49 +01:00
#### 82. Compute a matrix rank (★★★)
2016-07-15 15:28:59 +02:00
` ` ` 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 )
2022-01-31 19:14:41 +01:00
# alternative solution:
# Author: Jeff Luo (@Jeff1999)
rank = np . linalg . matrix_rank ( Z )
print ( rank )
2019-11-23 21:05:14 +01:00
` ` `
2016-07-15 15:28:59 +02:00
#### 83. How to find the most frequent value in an array?
` ` ` python
Z = np . random . randint ( 0 , 10 , 50 )
print ( np . bincount ( Z ) . argmax ( ) )
2019-11-23 21:05:14 +01:00
` ` `
2016-07-15 15:28:59 +02:00
#### 84. Extract all the contiguous 3x3 blocks from a random 10x10 matrix (★★★)
` ` ` python
# Author: Chris Barker
Z = np . random . randint ( 0 , 5 , ( 10 , 10 ) )
n = 3
i = 1 + ( Z . shape [ 0 ] - 3 )
j = 1 + ( Z . shape [ 1 ] - 3 )
C = stride_tricks . as_strided ( Z , shape = ( i , j , n , n ) , strides = Z . strides + Z . strides )
print ( C )
2022-01-31 19:14:41 +01:00
# Author: Jeff Luo (@Jeff1999)
Z = np . random . randint ( 0 , 5 , ( 10 , 10 ) )
print ( sliding_window_view ( Z , window_shape = ( 3 , 3 ) ) )
2019-11-23 21:05:14 +01:00
` ` `
#### 85. Create a 2D array subclass such that Z[i,j] == Z[j,i] (★★★)
2016-07-15 15:28:59 +02:00
` ` ` 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 )
2019-11-23 21:05:14 +01:00
` ` `
2023-04-03 09:26:02 +02:00
#### 86. Consider a set of p matrices with 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)) (★★★)
2016-07-15 15:28:59 +02:00
` ` ` 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.
2019-11-23 21:05:14 +01:00
` ` `
2016-07-15 15:28:59 +02:00
#### 87. Consider a 16x16 array, how to get the block-sum (block size is 4x4)? (★★★)
` ` ` python
# Author: Robert Kern
Z = np . ones ( ( 16 , 16 ) )
k = 4
S = np . add . reduceat ( np . add . reduceat ( Z , np . arange ( 0 , Z . shape [ 0 ] , k ) , axis = 0 ) ,
np . arange ( 0 , Z . shape [ 1 ] , k ) , axis = 1 )
print ( S )
2021-06-13 16:20:39 +02:00
# alternative solution:
# Author: Sebastian Wallkötter (@FirefoxMetzger)
Z = np . ones ( ( 16 , 16 ) )
k = 4
windows = np . lib . stride_tricks . sliding_window_view ( Z , ( k , k ) )
S = windows [ : : k , : : k , . . . ] . sum ( axis = ( - 2 , - 1 ) )
2022-01-31 19:14:41 +01:00
# Author: Jeff Luo (@Jeff1999)
Z = np . ones ( ( 16 , 16 ) )
k = 4
print ( sliding_window_view ( Z , window_shape = ( k , k ) ) [ : : k , : : k ] . sum ( axis = ( - 2 , - 1 ) ) )
2019-11-23 21:05:14 +01:00
` ` `
2016-07-15 15:28:59 +02:00
#### 88. How to implement the Game of Life using numpy arrays? (★★★)
` ` ` python
# Author: Nicolas Rougier
def iterate ( Z ) :
# Count neighbours
N = ( Z [ 0 : - 2 , 0 : - 2 ] + Z [ 0 : - 2 , 1 : - 1 ] + Z [ 0 : - 2 , 2 : ] +
Z [ 1 : - 1 , 0 : - 2 ] + Z [ 1 : - 1 , 2 : ] +
Z [ 2 : , 0 : - 2 ] + Z [ 2 : , 1 : - 1 ] + Z [ 2 : , 2 : ] )
# Apply rules
birth = ( N == 3 ) & ( Z [ 1 : - 1 , 1 : - 1 ] == 0 )
survive = ( ( N == 2 ) | ( N == 3 ) ) & ( Z [ 1 : - 1 , 1 : - 1 ] == 1 )
Z [ . . . ] = 0
Z [ 1 : - 1 , 1 : - 1 ] [ birth | survive ] = 1
return Z
Z = np . random . randint ( 0 , 2 , ( 50 , 50 ) )
for i in range ( 100 ) : Z = iterate ( Z )
print ( Z )
2019-11-23 21:05:14 +01:00
` ` `
2016-07-15 15:28:59 +02:00
#### 89. How to get the n largest values of an array (★★★)
` ` ` python
Z = np . arange ( 10000 )
np . random . shuffle ( Z )
n = 5
# Slow
print ( Z [ np . argsort ( Z ) [ - n : ] ] )
# Fast
print ( Z [ np . argpartition ( - Z , n ) [ : n ] ] )
2019-11-23 21:05:14 +01:00
` ` `
2016-07-15 15:28:59 +02:00
#### 90. Given an arbitrary number of vectors, build the cartesian product (every combinations of every item) (★★★)
` ` ` python
# Author: Stefan Van der Walt
def cartesian ( arrays ) :
arrays = [ np . asarray ( a ) for a in arrays ]
shape = ( len ( x ) for x in arrays )
ix = np . indices ( shape , dtype = int )
ix = ix . reshape ( len ( arrays ) , - 1 ) . T
for n , arr in enumerate ( arrays ) :
ix [ : , n ] = arrays [ n ] [ ix [ : , n ] ]
return ix
print ( cartesian ( ( [ 1 , 2 , 3 ] , [ 4 , 5 ] , [ 6 , 7 ] ) ) )
2019-11-23 21:05:14 +01:00
` ` `
2016-07-15 15:28:59 +02:00
#### 91. How to create a record array from a regular array? (★★★)
` ` ` python
Z = np . array ( [ ( " Hello " , 2.5 , 3 ) ,
( " World " , 3.6 , 2 ) ] )
2018-06-07 16:25:23 +02:00
R = np . core . records . fromarrays ( Z . T ,
2016-07-15 15:28:59 +02:00
names = ' col1, col2, col3 ' ,
formats = ' S8, f8, i8 ' )
print ( R )
2019-11-23 21:05:14 +01:00
` ` `
2016-07-15 15:28:59 +02:00
#### 92. Consider a large vector Z, compute Z to the power of 3 using 3 different methods (★★★)
` ` ` python
# Author: Ryan G.
2019-06-24 20:38:55 +02:00
x = np . random . rand ( int ( 5e7 ) )
2016-07-15 15:28:59 +02:00
% timeit np . power ( x , 3 )
% timeit x * x * x
% timeit np . einsum ( ' i,i,i->i ' , x , x , x )
2019-11-23 21:05:14 +01:00
` ` `
2016-07-15 15:28:59 +02:00
#### 93. Consider two arrays A and B of shape (8,3) and (2,2). How to find rows of A that contain elements of each row of B regardless of the order of the elements in B? (★★★)
` ` ` python
# Author: Gabe Schwartz
A = np . random . randint ( 0 , 5 , ( 8 , 3 ) )
B = np . random . randint ( 0 , 5 , ( 2 , 2 ) )
C = ( A [ . . . , np . newaxis , np . newaxis ] == B )
2016-11-28 13:44:47 +01:00
rows = np . where ( C . any ( ( 3 , 1 ) ) . all ( 1 ) ) [ 0 ]
2016-07-15 15:28:59 +02:00
print ( rows )
2019-11-23 21:05:14 +01:00
` ` `
#### 94. Considering a 10x3 matrix, extract rows with unequal values (e.g. [2,2,3]) (★★★)
2016-07-15 15:28:59 +02:00
` ` ` python
# Author: Robert Kern
Z = np . random . randint ( 0 , 5 , ( 10 , 3 ) )
print ( Z )
2016-12-01 13:42:52 +01:00
# 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
2016-11-29 13:09:51 +01:00
U = Z [ Z . max ( axis = 1 ) != Z . min ( axis = 1 ) , : ]
2016-07-15 15:28:59 +02:00
print ( U )
2019-11-23 21:05:14 +01:00
` ` `
2016-07-15 15:28:59 +02:00
#### 95. Convert a vector of ints into a matrix binary representation (★★★)
` ` ` python
# Author: Warren Weckesser
I = np . array ( [ 0 , 1 , 2 , 3 , 15 , 16 , 32 , 64 , 128 ] )
B = ( ( I . reshape ( - 1 , 1 ) & ( 2 * * np . arange ( 8 ) ) ) != 0 ) . astype ( int )
print ( B [ : , : : - 1 ] )
# Author: Daniel T. McDonald
I = np . array ( [ 0 , 1 , 2 , 3 , 15 , 16 , 32 , 64 , 128 ] , dtype = np . uint8 )
print ( np . unpackbits ( I [ : , np . newaxis ] , axis = 1 ) )
2019-11-23 21:05:14 +01:00
` ` `
2016-07-15 15:28:59 +02:00
#### 96. Given a two dimensional array, how to extract unique rows? (★★★)
` ` ` python
# Author: Jaime Fernández del Río
Z = np . random . randint ( 0 , 2 , ( 6 , 3 ) )
T = np . ascontiguousarray ( Z ) . view ( np . dtype ( ( np . void , Z . dtype . itemsize * Z . shape [ 1 ] ) ) )
_ , idx = np . unique ( T , return_index = True )
uZ = Z [ idx ]
print ( uZ )
2018-11-02 14:23:51 +01:00
# Author: Andreas Kouzelis
2018-11-02 14:56:53 +01:00
# NumPy >= 1.13
2018-11-02 14:23:51 +01:00
uZ = np . unique ( Z , axis = 0 )
print ( uZ )
2019-11-23 21:05:14 +01:00
` ` `
2016-07-15 15:28:59 +02:00
#### 97. Considering 2 vectors A & B, write the einsum equivalent of inner, outer, sum, and mul function (★★★)
` ` ` python
# Author: Alex Riley
# Make sure to read: http://ajcr.net/Basic-guide-to-einsum/
A = np . random . uniform ( 0 , 1 , 10 )
B = np . random . uniform ( 0 , 1 , 10 )
np . einsum ( ' i-> ' , A ) # np.sum(A)
np . einsum ( ' i,i->i ' , A , B ) # A * B
np . einsum ( ' i,i ' , A , B ) # np.inner(A, B)
2016-12-09 12:39:01 +01:00
np . einsum ( ' i,j->ij ' , A , B ) # np.outer(A, B)
2019-11-23 21:05:14 +01:00
` ` `
2016-07-15 15:28:59 +02:00
#### 98. Considering a path described by two vectors (X,Y), how to sample it using equidistant samples (★★★)?
` ` ` python
# Author: Bas Swinckels
phi = np . arange ( 0 , 10 * np . pi , 0.1 )
a = 1
x = a * phi * np . cos ( phi )
y = a * phi * np . sin ( phi )
dr = ( np . diff ( x ) * * 2 + np . diff ( y ) * * 2 ) * * .5 # segment lengths
r = np . zeros_like ( x )
r [ 1 : ] = np . cumsum ( dr ) # integrate path
r_int = np . linspace ( 0 , r . max ( ) , 200 ) # regular spaced path
x_int = np . interp ( r_int , r , x ) # integrate path
y_int = np . interp ( r_int , r , y )
2019-11-23 21:05:14 +01:00
` ` `
2016-07-15 15:28:59 +02:00
#### 99. Given an integer n and a 2D array X, select from X the rows which can be interpreted as draws from a multinomial distribution with n degrees, i.e., the rows which only contain integers and which sum to n. (★★★)
` ` ` python
# Author: Evgeni Burovski
X = np . asarray ( [ [ 1.0 , 0.0 , 3.0 , 8.0 ] ,
[ 2.0 , 0.0 , 1.0 , 1.0 ] ,
[ 1.5 , 2.5 , 1.0 , 0.0 ] ] )
n = 4
M = np . logical_and . reduce ( np . mod ( X , 1 ) == 0 , axis = - 1 )
M & = ( X . sum ( axis = - 1 ) == n )
print ( X [ M ] )
2019-11-23 21:05:14 +01:00
` ` `
2016-07-15 15:28:59 +02:00
#### 100. Compute bootstrapped 95% confidence intervals for the mean of a 1D array X (i.e., resample the elements of an array with replacement N times, compute the mean of each sample, and then compute percentiles over the means). (★★★)
` ` ` python
# Author: Jessica B. Hamrick
X = np . random . randn ( 100 ) # random 1D array
N = 1000 # number of bootstrap samples
idx = np . random . randint ( 0 , X . size , ( N , X . size ) )
means = X [ idx ] . mean ( axis = 1 )
confint = np . percentile ( means , [ 2.5 , 97.5 ] )
print ( confint )
2022-01-31 19:14:41 +01:00
` ` `