Numpy 100 Solutions
Numpy 100 Solutions
Dismiss
Join GitHub today
GitHub is home to over 40 million developers
working together to host and review code, manage
projects, and build software together.
Sign up
numpy-100 / 100_Numpy_exercises.ipynb
73ff926 on Jun 25
5 contributors
https://github.com/rougier/numpy-100/blob/master/100_Numpy_exercises.ipynb 1/18
8/13/2019 numpy-100/100_Numpy_exercises.ipynb at master · rougier/numpy-100 · GitHub
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 (https://github.com/rougier/numpy-100)
In [ ]: import numpy as np
In [ ]: print(np.__version__)
np.show_config()
In [ ]: Z = np.zeros(10)
print(Z)
In [ ]: 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?
(★☆☆)
6. Create a null vector of size 10 but the fifth value which is 1 (★☆☆)
In [ ]: Z = np.zeros(10)
Z[4] = 1
print(Z)
In [ ]: Z = np.arange(10,50)
print(Z)
https://github.com/rougier/numpy-100/blob/master/100_Numpy_exercises.ipynb 2/18
8/13/2019 numpy-100/100_Numpy_exercises.ipynb at master · rougier/numpy-100 · GitHub
In [ ]: Z = np.arange(50)
Z = Z[::-1]
print(Z)
In [ ]: Z = np.arange(9).reshape(3,3)
print(Z)
In [ ]: nz = np.nonzero([1,2,0,0,4,0])
print(nz)
In [ ]: Z = np.eye(3)
print(Z)
In [ ]: Z = np.random.random((3,3,3))
print(Z)
13. Create a 10x10 array with random values and find the minimum and maximum values
(★☆☆)
In [ ]: 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 (★☆☆)
In [ ]: Z = np.random.random(30)
m = Z.mean()
print(m)
In [ ]: 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? (★☆☆)
(( ))
https://github.com/rougier/numpy-100/blob/master/100_Numpy_exercises.ipynb 3/18
8/13/2019 numpy-100/100_Numpy_exercises.ipynb at master · rougier/numpy-100 · GitHub
In [ ]: Z = np.ones((5,5))
Z = np.pad(Z, pad_width=1, mode='constant', constant_values=0)
print(Z)
In [ ]: 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 (★☆☆)
In [ ]: Z = np.diag(1+np.arange(4),k=-1)
print(Z)
19. Create a 8x8 matrix and fill it with a checkerboard pattern (★☆☆)
In [ ]: 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?
In [ ]: print(np.unravel_index(99,(6,7,8)))
21. Create a checkerboard 8x8 matrix using the tile function (★☆☆)
In [ ]: 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)
(★☆☆)
https://github.com/rougier/numpy-100/blob/master/100_Numpy_exercises.ipynb 4/18
8/13/2019 numpy-100/100_Numpy_exercises.ipynb at master · rougier/numpy-100 · GitHub
24. Multiply a 5x3 matrix by a 3x2 matrix (real matrix product) (★☆☆)
In [ ]: Z = np.dot(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.
(★☆☆)
Z = np.arange(11)
Z[(3 < Z) & (Z <= 8)] *= -1
print(Z)
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? (★☆☆)
In [ ]: Z**Z
2 << Z >> 2
Z <- Z
1j*Z
Z/1/1
Z<Z>Z
In [ ]: print(np.array(0) / np.array(0))
print(np.array(0) // np.array(0))
print(np.array([np.nan]).astype(int).astype(float))
Z = np.random.uniform(-10,+10,10)
print (np.copysign(np.ceil(np.abs(Z)), Z))
In [ ]: Z1 = np.random.randint(0,10,10)
Z2 = np random randint(0 10 10)
https://github.com/rougier/numpy-100/blob/master/100_Numpy_exercises.ipynb 5/18
8/13/2019 numpy-100/100_Numpy_exercises.ipynb at master · rougier/numpy-100 · GitHub
Z2 = np.random.randint(0,10,10)
print(np.intersect1d(Z1,Z2))
In [ ]: # Suicide mode on
defaults = np.seterr(all="ignore")
Z = np.ones(1) / 0
# Back to sanity
_ = np.seterr(**defaults)
with np.errstate(divide='ignore'):
Z = np.ones(1) / 0
In [ ]: 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? (★★☆)
In [ ]: 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 (★★☆)
In [ ]: 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))
https://github.com/rougier/numpy-100/blob/master/100_Numpy_exercises.ipynb 6/18
8/13/2019 numpy-100/100_Numpy_exercises.ipynb at master · rougier/numpy-100 · GitHub
37. Create a 5x5 matrix with row values ranging from 0 to 4 (★★☆)
In [ ]: 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
(★☆☆)
In [ ]: 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
(★★☆)
In [ ]: Z = np.linspace(0,1,11,endpoint=False)[1:]
print(Z)
In [ ]: Z = np.random.random(10)
Z.sort()
print(Z)
Z = np.arange(10)
np.add.reduce(Z)
42. Consider two random array A and B, check if they are equal (★★☆)
In [ ]: 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 com
parison of values
equal = np.allclose(A,B)
print(equal)
# Checking both the shape and the element values, no tolerance (valu
es have to be exactly equal)
equal = np.array_equal(A,B)
print(equal)
https://github.com/rougier/numpy-100/blob/master/100_Numpy_exercises.ipynb 7/18
8/13/2019 numpy-100/100_Numpy_exercises.ipynb at master · rougier/numpy-100 · GitHub
In [ ]: 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 (★★☆)
In [ ]: 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 (★★☆)
In [ ]: 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
(★★☆)
In [ ]: 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))
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
(★★☆)
In [ ]: 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? (★★☆)
In [ ]: 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)
(★★☆)
52. Consider a random vector with shape (100,2) representing coordinates, find point by
point distances (★★☆)
In [ ]: 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)
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?
In [ ]: Z = np.arange(10, dtype=np.float32)
Z = Z.astype(np.int32, copy=False)
print(Z)
# Fake file
s = StringIO("""1, 2, 3, 4, 5\n
6, , , 7, 8\n
, , 9,10,11\n""")
https://github.com/rougier/numpy-100/blob/master/100_Numpy_exercises.ipynb 9/18
8/13/2019 numpy-100/100_Numpy_exercises.ipynb at master · rougier/numpy-100 · GitHub
In [ ]: 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])
In [ ]: 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)
In [ ]: # 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)
X = np.random.rand(5, 10)
print(Y)
Z = np.random.randint(0,10,(3,3))
print(Z)
print(Z[Z[:,1].argsort()])
https://github.com/rougier/numpy-100/blob/master/100_Numpy_exercises.ipynb 10/18
8/13/2019 numpy-100/100_Numpy_exercises.ipynb at master · rougier/numpy-100 · GitHub
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 (★★☆)
In [ ]: 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? (★★☆)
In [ ]: 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])
In [ ]: 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)? (★★★)
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)?
https://github.com/rougier/numpy-100/blob/master/100_Numpy_exercises.ipynb 11/18
8/13/2019 numpy-100/100_Numpy_exercises.ipynb at master · rougier/numpy-100 · GitHub
( ) y( ) ()
(★★★)
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
(★★★)
w,h = 16,16
I = np.random.randint(0,2,(h,w,3)).astype(np.ubyte)
#Note that we should compute 256*256 first.
#Otherwise numpy will only promote F.dtype to 'uint16' and overfolw
will occur
F = I[...,0]*(256*256) + I[...,1]*256 +I[...,2]
n = len(np.unique(F))
print(n)
67. Considering a four dimensions array, how to get sum over the last two axis at once?
(★★★)
In [ ]: 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)
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)
https://github.com/rougier/numpy-100/blob/master/100_Numpy_exercises.ipynb 12/18
8/13/2019 numpy-100/100_Numpy_exercises.ipynb at master · rougier/numpy-100 · GitHub
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? (★★★)
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)? (★★★)
In [ ]: A = np.ones((5,5,3))
B = 2*np.ones((5,5))
print(A * B[:,:,None])
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 (★★★)
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? (★★★)
https://github.com/rougier/numpy-100/blob/master/100_Numpy_exercises.ipynb 13/18
8/13/2019 numpy-100/100_Numpy_exercises.ipynb at master · rougier/numpy-100 · GitHub
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? (★★★)
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? (★★★)
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])? (★★★)
P0 = np.random.uniform(-10,10,(10,2))
P1 = np.random.uniform(-10,10,(10,2))
https://github.com/rougier/numpy-100/blob/master/100_Numpy_exercises.ipynb 14/18
8/13/2019 numpy-100/100_Numpy_exercises.ipynb at master · rougier/numpy-100 · GitHub
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])? (★★★)
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) (★★★)
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
Z = np.arange(1,15,dtype=np.uint32)
R = stride_tricks.as_strided(Z,(11,4),(4,4))
print(R)
https://github.com/rougier/numpy-100/blob/master/100_Numpy_exercises.ipynb 15/18
8/13/2019 numpy-100/100_Numpy_exercises.ipynb at master · rougier/numpy-100 · GitHub
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)
In [ ]: Z = np.random.randint(0,10,50)
print(np.bincount(Z).argmax())
84. Extract all the contiguous 3x3 blocks from a random 10x10 matrix (★★★)
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.stride
s + Z.strides)
print(C)
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))
(★★★)
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]])
https://github.com/rougier/numpy-100/blob/master/100_Numpy_exercises.ipynb 16/18
8/13/2019 numpy-100/100_Numpy_exercises.ipynb at master · rougier/numpy-100 · GitHub
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 independent
ly),
# 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)? (★★★)
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? (★★★)
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)
In [ ]: 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]])
https://github.com/rougier/numpy-100/blob/master/100_Numpy_exercises.ipynb 17/18
8/13/2019 numpy-100/100_Numpy_exercises.ipynb at master · rougier/numpy-100 · GitHub
90. Given an arbitrary number of vectors, build the cartesian product (every combinations of
every item) (★★★)
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
return ix
92. Consider a large vector Z, compute Z to the power of 3 using 3 different methods
(★★★)
In [ ]: # 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? (★★★)
A = np.random.randint(0,5,(8,3))
B = np.random.randint(0,5,(2,2))
https://github.com/rougier/numpy-100/blob/master/100_Numpy_exercises.ipynb 18/18