commit 86a42b05b128fce0f52245ea9f7eac7ae47b579b Author: Nicolas Rougier Date: Tue May 27 06:10:33 2014 +0200 Initial commit diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..f5e9b4c --- /dev/null +++ b/Makefile @@ -0,0 +1,35 @@ +MAKE = /usr/bin/make +RST2HTML = rst2html.py +RST2LATEX = rst2latex.py +STYLESHEET = numpy.css +RST2HTML_OPTIONS = --strip-comments \ + --report=3 \ + --stylesheet=$(STYLESHEET) \ + --link-stylesheet +RST2LATEX_OPTIONS = --strip-comments \ + --report=3 \ + --use-latex-toc + +SOURCES = $(wildcard *.rst) +HTML_OBJECTS = $(subst .rst,.html, $(SOURCES)) +LATEX_OBJECTS = $(subst .rst,.tex, $(SOURCES)) + +html: $(HTML_OBJECTS) + +latex: $(LATEX_OBJECTS) + +%.html: %.rst Makefile + @echo " - $@" + @$(RST2HTML) $(RST2HTML_OPTIONS) $< $@ + +%.tex: %.rst Makefile + @echo " - $@" + @$(RST2LATEX) $(RST2LATEX_OPTIONS) $< $@ + +clean: + @-rm -f $(LATEX_OBJECTS) $(HTML_OBJECTS) + +distclean: clean + @-rm -f `find . -name "*~"` + + diff --git a/README.txt b/README.txt new file mode 100644 index 0000000..a75a8e8 --- /dev/null +++ b/README.txt @@ -0,0 +1,27 @@ + +100 Numpy exercices +=================== + +The goal is both to offer a quick reference for new and old users and to +provide also a set of exercices for those who teach. + +If you remember having asked or answered a (short) problem, you can send a pull +request. The format is: + + +#. Find indices of non-zero elements from [1,2,0,0,4,0] + + .. code:: python + + # Author: Somebody + + print np.nonzero([1,2,0,0,4,0]) + + +If you can provide the assumed level of the answer, that would be even better. + +Here is what the page looks like so far: + +http://www.loria.fr/~rougier/teaching/numpy.100/index.html + +(The level names came from an old-game: Dungeon Master) diff --git a/index.html b/index.html new file mode 100644 index 0000000..7865a2c --- /dev/null +++ b/index.html @@ -0,0 +1,435 @@ + + + + + + +100 numpy exercises + + + +
+

100 numpy exercises

+

A joint effort of the numpy community

+ + +
+

Neophyte

+
    +
  1. Import the numpy package under the name np

    +
    +import numpy as np
    +
    +
  2. +
  3. Print the numpy version and the configuration.

    +
    +print np.__version__
    +np.__config__.show()
    +
    +
  4. +
  5. Create a null vector of size 10

    +
    +Z = np.zeros(10)
    +
    +
  6. +
  7. Create a null vector of size 10 but the fifth value which is 1

    +
    +Z = np.zeros(10)
    +Z[4] = 1
    +
    +
  8. +
  9. Create a vector with values ranging from 10 to 99

    +
    +Z = np.arange(10,100)
    +
    +
  10. +
  11. Create a 3x3 matrix with values ranging from 0 to 8

    +
    +Z = np.arange(9).reshape(3,3)
    +
    +
  12. +
  13. Find indices of non-zero elements from [1,2,0,0,4,0]

    +
    +nz = np.nonzero([1,2,0,0,4,0])
    +
    +
  14. +
  15. Declare a 3x3 identity matrix

    +
    +Z = np.eye(3)
    +
    +
  16. +
  17. Declare a 5x5 matrix with values 1,2,3,4 just below the diagonal

    +
    +Z = np.diag(1+np.arange(4),k=-1)
    +
    +
  18. +
  19. Declare a 10x10x10 array with random values

    +
    +Z = np.random.random((10,10,10))
    +
    +
  20. +
+
+
+

Novice

+
    +
  1. Declare a 8x8 matrix and fill it with a checkerboard pattern

    +
    +Z = np.zeros((8,8))
    +Z[1::2,::2] = 1
    +Z[::2,1::2] = 1
    +
    +
  2. +
  3. Declare a 10x10 array with random values and find the minimum and maximum values

    +
    +Z = np.random.random((10,10))
    +Zmin, Zmax = Z.min(), Z.max()
    +
    +
  4. +
  5. Create a checkerboard 8x8 matrix using the tile function

    +
    +Z = np.tile( np.array([[0,1],[1,0]]), (4,4))
    +
    +
  6. +
  7. Normalize a 5x5 random matrix (between 0 and 1)

    +
    +Z = np.random.random((5,5))
    +Zmax,Zmin = Z.max(), Z.min()
    +Z = (Z - Zmin)/(Zmax - Zmin)
    +
    +
  8. +
  9. Multiply a 5x3 matrix by a 3x2 matrix (real matrix product)

    +
    +Z = np.dot(np.ones((5,3)), np.ones((3,2)))
    +
    +
  10. +
  11. Create a 10x10 matrix with row values ranging from 0 to 9

    +
    +Z = np.zeros((10,10))
    +Z += np.arange(10)
    +
    +
  12. +
  13. Create a vector of size 1000 with values ranging from 0 to 1, both excluded

    +
    +Z = np.random.linspace(0,1,1002,endpoint=True)[1:-1]
    +
    +
  14. +
  15. Create a random vector of size 100 and sort it

    +
    +Z = np.random.random(100)
    +Z.sort()
    +
    +
  16. +
  17. Consider two random matrices A anb B, check if they are equal.

    +
    +A = np.random.randint(0,2,(2,2))
    +B = np.random.randint(0,2,(2,2))
    +equal = np.allclose(A,B)
    +
    +
  18. +
  19. Create a random vector of size 1000 and find the mean value

    +
    +Z = np.random.random(1000)
    +m = Z.mean()
    +
    +
  20. +
+
+
+

Apprentice

+
    +
  1. Make an array immutable

    +
    +Z = np.zeros(10)
    +Z.flags.writeable = False
    +
    +
  2. +
  3. Consider a random 100x2 matrix representing cartesian coordinates, convert +them to polar coordinates

    +
    +Z = np.random.random((100,2))
    +X,Y = Z[:,0], Z[:,1]
    +R = np.sqrt(X**2+Y**2)
    +T = np.arctan2(Y,X)
    +
    +
  4. +
  5. Create random vector of size 100 and replace the maximum value by 0

    +
    +Z = np.random.random(100)
    +Z[Z.argmax()] = 0
    +
    +
  6. +
  7. Declare a structured array with x and y coordinates covering the +[0,1]x[0,1] area.

    +
    +Z = np.zeros((10,10), [('x',float),('y',float)])
    +Z['x'], Z['y'] = np.meshgrid(np.linspace(0,1,10),
    +                             np.linspace(0,1,10))
    +
    +
  8. +
  9. Print the minimum and maximum representable value for each numpy scalar type

    +
    +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
    +
    +
  10. +
  11. Create a structured array representing a position (x,y) and a color (r,g,b)

    +
    +Z = np.zeros(10, [ ('position', [ ('x', float, 1),
    +                                  ('y', float, 1)]),
    +                   ('color',    [ ('r', float, 1),
    +                                  ('g', float, 1),
    +                                  ('b', float, 1)])])
    +
    +
  12. +
  13. Consider a random vector with shape (100,2) representing coordinates, find +point by point distances

    +
    +Z = np.random.random((10,2))
    +X,Y = np.atleast_2d(Z[:,0]), np.atleast_2d(Z[:,1])
    +D = np.sqrt( (X-X.T)**2 + (Y-Y.T)**2)
    +
    +# Much faster with scipy
    +Z = np.random.random((10,2))
    +D = scipy.spatial.distance.cdist(Z,Z)
    +
    +
  14. +
  15. Generate a generic 2D Gaussian-like array

    +
    +X, Y = np.meshgrid(np.linspace(-1,1,100), np.linspace(-1,1,100))
    +D = np.sqrt(X*X+Y*Y)
    +sigma, mu = 1.0, 0.0
    +G = np.exp(-( (D-mu)**2 / ( 2.0 * sigma**2 ) ) )
    +
    +
  16. +
  17. Consider the vector [1, 2, 3, 4, 5], how to build a new vector with 3 +consecutive zeros interleaved between each value ?

    +
    +# 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
    +
    +
  18. +
  19. Find the nearest value from a given value in an array

    +
    +Z.flat[np.abs(Z - z).argmin()]
    +
    +
  20. +
+
+
+

Journeyman

+
    +
  1. Consider the following file:

    +
    +1,2,3,4,5
    +6,,,7,8
    +,,9,10,11
    +
    +

    How to read it ?

    +
    +Z = genfromtxt("missing.dat", delimiter=",")
    +
    +
  2. +
  3. Consider a generator function that generates 10 integers and use it to build an +array

    +
    +def generate():
    +    for x in xrange(10):
    +        yield x
    +Z = np.fromiter(generate(),dtype=float,count=-1)
    +
    +
  4. +
  5. Consider a given vector, how to add 1 to each element indexed by a second +vector (be careful with repeated indices) ?

    +
    +# Author: Brett Olsen
    +
    +Z = np.ones(10)
    +I = np.random.randint(0,len(Z),20)
    +Z += np.bincount(I, minlength=len(Z))
    +
    +
  6. +
  7. How to accumulate elements of a vector (X) to an array (F) based on an index +list (I) ?

    +
    +# Author: Alan G Isaac
    +
    +X = [1,2,3,4,5,6]
    +I = [1,3,9,3,4,1]
    +F = np.bincount(I,X)
    +
    +
  8. +
  9. Considering a (w,h,3) image of (dtype=ubyte), compute the number of unique +colors

    +
    +# 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))
    +
    +
  10. +
  11. Considering a four dimensions array, how to get sum over the last two axis at once ?

    +
    +A = np.random.randint(0,10,(3,4,3,4))
    +sum = A.reshape(A.shape[:-2] + (-1,)).sum(axis=-1)
    +
    +
  12. +
+
+
+

Craftsman

+
    +
  1. 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])

    +
    +# Author: Joe Kington / Erik Rigtorp
    +
    +def rolling(a, window):
    +    shape = (a.size - window + 1, window)
    +    strides = (a.itemsize, a.itemsize)
    +    return np.lib.stride_tricks.as_strided(a, shape=shape, strides=strides)
    +
    +Z = rolling(np.arange(100), 3)
    +
    +
  2. +
  3. Consider a set of 100 triplets describing 100 triangles (with shared +vertices), find the set of unique line segments composing all the triangles.

    +
    +# Author: Nicolas Rougier
    +
    +faces = np.random.randint(0,100,(100,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)
    +
    +
  4. +
+
+
+

Artisan

+
    +
  1. Considering a 100x3 matrix, extract rows with unequal values (e.g. [2,2,3])

    +
    +# Author: Robert Kern
    +
    +Z = np.random.randint(0,5,(100,3))
    +E = np.logical_and.reduce(Z[:,1:] == Z[:,:-1], axis=1)
    +U = Z[~E]
    +
    +
  2. +
  3. Convert a vector of ints into a matrix binary representation.

    +
    +# 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)
    +B = B[:,::-1]
    +
    +# Author: Daniel T. McDonald
    +
    +I = np.array([0, 1, 2, 3, 15, 16, 32, 64, 128], dtype=np.uint8)
    +np.unpackbits(I[:, np.newaxis], axis=1)
    +
    +
  4. +
+
+
+

Adept

+
    +
  1. 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)

    +
    +# Author: Nicolas Rougier
    +
    +Z = np.random.random((25,25))
    +shape = (3,3)
    +fill  = 0
    +position = (0,0)
    +
    +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]
    +
    +
  2. +
+
+
+

Expert

+
    +
  1. 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 ?

    +
    +# 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 = (C.sum(axis=(1,2,3)) >= B.shape[1]).nonzero()[0]
    +
    +
  2. +
  3. 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.strides + Z.strides)
    +
    +
  4. +
+
+
+

Master

+
+ +
+ + diff --git a/index.rst b/index.rst new file mode 100644 index 0000000..0d7ad53 --- /dev/null +++ b/index.rst @@ -0,0 +1,481 @@ +=================== +100 numpy exercises +=================== + +------------------------------------- +A joint effort of the numpy community +------------------------------------- + +.. contents:: + :local: + :depth: 1 + + +Neophyte +======== + +1. Import the numpy package under the name ``np`` + + .. code:: python + + import numpy as np + + +#. Print the numpy version and the configuration. + + .. code:: python + + print np.__version__ + np.__config__.show() + + +#. Create a null vector of size 10 + + .. code:: python + + Z = np.zeros(10) + +#. Create a null vector of size 10 but the fifth value which is 1 + + .. code:: python + + Z = np.zeros(10) + Z[4] = 1 + +#. Create a vector with values ranging from 10 to 99 + + .. code:: python + + Z = np.arange(10,100) + +#. Create a 3x3 matrix with values ranging from 0 to 8 + + .. code:: python + + Z = np.arange(9).reshape(3,3) + +#. Find indices of non-zero elements from [1,2,0,0,4,0] + + .. code:: python + + nz = np.nonzero([1,2,0,0,4,0]) + + +#. Declare a 3x3 identity matrix + + .. code:: python + + Z = np.eye(3) + +#. Declare a 5x5 matrix with values 1,2,3,4 just below the diagonal + + .. code:: python + + Z = np.diag(1+np.arange(4),k=-1) + + +#. Declare a 10x10x10 array with random values + + .. code:: python + + Z = np.random.random((10,10,10)) + +Novice +====== + +#. Declare a 8x8 matrix and fill it with a checkerboard pattern + + .. code:: python + + Z = np.zeros((8,8)) + Z[1::2,::2] = 1 + Z[::2,1::2] = 1 + +#. Declare a 10x10 array with random values and find the minimum and maximum values + + .. code:: python + + Z = np.random.random((10,10)) + Zmin, Zmax = Z.min(), Z.max() + +#. Create a checkerboard 8x8 matrix using the tile function + + .. code:: python + + Z = np.tile( np.array([[0,1],[1,0]]), (4,4)) + +#. Normalize a 5x5 random matrix (between 0 and 1) + + .. code:: python + + Z = np.random.random((5,5)) + Zmax,Zmin = Z.max(), Z.min() + Z = (Z - Zmin)/(Zmax - Zmin) + + +#. Multiply a 5x3 matrix by a 3x2 matrix (real matrix product) + + .. code:: python + + Z = np.dot(np.ones((5,3)), np.ones((3,2))) + + +#. Create a 10x10 matrix with row values ranging from 0 to 9 + + .. code:: python + + Z = np.zeros((10,10)) + Z += np.arange(10) + +#. Create a vector of size 1000 with values ranging from 0 to 1, both excluded + + .. code:: python + + Z = np.random.linspace(0,1,1002,endpoint=True)[1:-1] + +#. Create a random vector of size 100 and sort it + + .. code:: python + + Z = np.random.random(100) + Z.sort() + +#. Consider two random matrices A anb B, check if they are equal. + + .. code:: python + + A = np.random.randint(0,2,(2,2)) + B = np.random.randint(0,2,(2,2)) + equal = np.allclose(A,B) + +#. Create a random vector of size 1000 and find the mean value + + .. code:: python + + Z = np.random.random(1000) + m = Z.mean() + + + +Apprentice +========== + + +#. Make an array immutable + + .. code:: python + + Z = np.zeros(10) + Z.flags.writeable = False + + +#. Consider a random 100x2 matrix representing cartesian coordinates, convert + them to polar coordinates + + .. code:: python + + Z = np.random.random((100,2)) + X,Y = Z[:,0], Z[:,1] + R = np.sqrt(X**2+Y**2) + T = np.arctan2(Y,X) + + +#. Create random vector of size 100 and replace the maximum value by 0 + + .. code:: python + + Z = np.random.random(100) + Z[Z.argmax()] = 0 + + +#. Declare a structured array with ``x`` and ``y`` coordinates covering the + [0,1]x[0,1] area. + + .. code:: python + + Z = np.zeros((10,10), [('x',float),('y',float)]) + Z['x'], Z['y'] = np.meshgrid(np.linspace(0,1,10), + np.linspace(0,1,10)) + +#. Print the minimum and maximum representable value for each numpy scalar type + + .. code:: 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 + + +#. Create a structured array representing a position (x,y) and a color (r,g,b) + + .. code:: python + + Z = np.zeros(10, [ ('position', [ ('x', float, 1), + ('y', float, 1)]), + ('color', [ ('r', float, 1), + ('g', float, 1), + ('b', float, 1)])]) + + +#. Consider a random vector with shape (100,2) representing coordinates, find + point by point distances + + .. code:: python + + Z = np.random.random((10,2)) + X,Y = np.atleast_2d(Z[:,0]), np.atleast_2d(Z[:,1]) + D = np.sqrt( (X-X.T)**2 + (Y-Y.T)**2) + + # Much faster with scipy + Z = np.random.random((10,2)) + D = scipy.spatial.distance.cdist(Z,Z) + + + +#. Generate a generic 2D Gaussian-like array + + .. code:: python + + X, Y = np.meshgrid(np.linspace(-1,1,100), np.linspace(-1,1,100)) + D = np.sqrt(X*X+Y*Y) + sigma, mu = 1.0, 0.0 + G = np.exp(-( (D-mu)**2 / ( 2.0 * sigma**2 ) ) ) + +#. Consider the vector [1, 2, 3, 4, 5], how to build a new vector with 3 + consecutive zeros interleaved between each value ? + + .. code:: 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 + + +#. Find the nearest value from a given value in an array + + .. code:: python + + Z.flat[np.abs(Z - z).argmin()] + + + +Journeyman +========== + +#. Consider the following file:: + + 1,2,3,4,5 + 6,,,7,8 + ,,9,10,11 + + How to read it ? + + .. code:: python + + Z = genfromtxt("missing.dat", delimiter=",") + + +#. Consider a generator function that generates 10 integers and use it to build an + array + + .. code:: python + + def generate(): + for x in xrange(10): + yield x + Z = np.fromiter(generate(),dtype=float,count=-1) + + +#. Consider a given vector, how to add 1 to each element indexed by a second + vector (be careful with repeated indices) ? + + .. code:: python + + # Author: Brett Olsen + + Z = np.ones(10) + I = np.random.randint(0,len(Z),20) + Z += np.bincount(I, minlength=len(Z)) + + +#. How to accumulate elements of a vector (X) to an array (F) based on an index + list (I) ? + + .. code:: python + + # Author: Alan G Isaac + + X = [1,2,3,4,5,6] + I = [1,3,9,3,4,1] + F = np.bincount(I,X) + +#. Considering a (w,h,3) image of (dtype=ubyte), compute the number of unique + colors + + .. code:: 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)) + + np.unique(I) + +#. Considering a four dimensions array, how to get sum over the last two axis at once ? + + + .. code:: python + + A = np.random.randint(0,10,(3,4,3,4)) + sum = A.reshape(A.shape[:-2] + (-1,)).sum(axis=-1) + + + +Craftsman +========= + +#. 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]) + + .. code:: python + + # Author: Joe Kington / Erik Rigtorp + + def rolling(a, window): + shape = (a.size - window + 1, window) + strides = (a.itemsize, a.itemsize) + return np.lib.stride_tricks.as_strided(a, shape=shape, strides=strides) + + Z = rolling(np.arange(100), 3) + +#. Consider a set of 100 triplets describing 100 triangles (with shared + vertices), find the set of unique line segments composing all the triangles. + + .. code:: python + + # Author: Nicolas Rougier + + faces = np.random.randint(0,100,(100,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) + + + +Artisan +======= + +#. Considering a 100x3 matrix, extract rows with unequal values (e.g. [2,2,3]) + + .. code:: python + + # Author: Robert Kern + + Z = np.random.randint(0,5,(100,3)) + E = np.logical_and.reduce(Z[:,1:] == Z[:,:-1], axis=1) + U = Z[~E] + +#. Convert a vector of ints into a matrix binary representation. + + .. code:: 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) + B = B[:,::-1] + + # Author: Daniel T. McDonald + + I = np.array([0, 1, 2, 3, 15, 16, 32, 64, 128], dtype=np.uint8) + np.unpackbits(I[:, np.newaxis], axis=1) + + + +Adept +===== + +#. 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) + + .. code :: python + + # Author: Nicolas Rougier + + Z = np.random.random((25,25)) + shape = (3,3) + fill = 0 + position = (0,0) + + 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] + + + + + + +Expert +====== + +#. 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 ? + + .. code:: 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 = (C.sum(axis=(1,2,3)) >= B.shape[1]).nonzero()[0] + + +#. Extract all the contiguous 3x3 blocks from a random 10x10 matrix. + + .. code:: python + + 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) + + +Master +====== + +Archmaster +========== diff --git a/numpy.css b/numpy.css new file mode 100644 index 0000000..b27202a --- /dev/null +++ b/numpy.css @@ -0,0 +1,356 @@ +@import url("reset.css"); + +/* ========================================================================= + * Body + * ========================================================================= */ +body { + color: #333333; + font-family: "optima", "lucida grande", "lucida sans unicode", + verdana, arial, helvetica, sans-serif; + font-size: 1.1em; + line-height: 1.5em; + margin-top: 0em; +} + + +/* ========================================================================= + * Document + * ========================================================================= */ +div.document { + margin-top: 50px; + margin-bottom: 5em; + margin-left: 250px; + margin-right: 10%; +} + +h1, h2, h3, h4, h5, h6 { + font-family: "futura", "lucida grande", "lucida sans unicode", + verdana, arial, helvetica, sans-serif; + font-weight: normal; + clear: both; +} + +h1 { + font-size: 2em; + margin-top: 2em; + padding-top: 2em; + margin-bottom: 1em; +} + +h2 { + font-size: 1.25em; + margin-top: 3em; + margin-bottom: 1em; + color: #326598; + padding-left: 2em; + margin-left: -2em; + margin-right: 25%; + padding-bottom: .5em; + padding-top: 2em; + border-bottom: 2px solid #326598; +} + +h3 { + font-size: 1em; + margin-top: 3em; + margin-bottom: 1em; + border-bottom: 1px solid #efefef; + color: #326598; +} + +h1.title { + margin-bottom: 0.0em; + padding-bottom: 0.0em; +} +h2.subtitle { + font-size: 1.0em; + padding-top: 0.5em; + margin-top: 0.0em; + color: #999; + border-bottom: none; +} + +p { + margin-bottom: 1em; +} + +strong { + font-weight: bold; +} + +em { + font-style: italic; +} + +a { + color: #326598; + text-decoration: none; +} + +a:hover { + color: #326598; + text-decoration: underline; +} + +hr { + margin-top: 1em; + border: 0; +} + +.contents ul { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; + list-style: none; +} + +/* ========================================================================= + * Image + * ========================================================================= */ +img { + text-align : left; +} + + +.align-right { + float: right; +} + +.aling-left { + float: left; +} + + +/* ========================================================================= + * Figure + * ========================================================================= */ +.figure +{ + margin-top: 1em; + margin-bottom: 1em; +} + + + +/* ========================================================================= + * Math + * ========================================================================= */ +img.math { + vertical-align: middle; +} +div.body div.math p { + text-align: left; +} +span.eqno { + float: right; +} + +/* ========================================================================= + * Table + * ========================================================================= */ +table +{ + margin-bottom: 2em; +} +th.head +{ + font-weight: bold; + text-align: left; + border-bottom: 1px solid black; + padding-right: .5em; +} + +th.field-name +{ + font-weight: bold; + text-align: left; + padding-right: 1em; +} +td { + vertical-align:middle; + padding-bottom: 1em; +} + +.compact-table td { + vertical-align:middle; + padding-bottom: .1em; +} + +.compact-table { + width:100%; +} + +/* ========================================================================= + * Code + * ========================================================================= */ +tt { + font-family: monospace; +} +pre { + background: #eeeeee; + border: 1px solid #cccccc; + padding: .5em; + line-height: 1.25em; + font-family: monospace; + margin-bottom: 1em; + width: 75%; +} + + +dl.docutils > dd { + margin-left: 2em; +/* font-size: 90%;*/ +} + +dl.docutils > dt { + font-style: italic; + color: #000099; +} +.classifier { + font-style: normal; + color: #000000; +} +.classifier-delimiter { + font-style: normal; + color: #000000; +} + +dl > dt { + font-family: monospace; +} +dl.method, dl.attribute, dl.function, dl.class { + margin-bottom: 1em; +} +dl.class > dt, dl.function > dt, dl.method > dt, dl.attribute > dt { + padding: .25em; + margin-top: 2em; + background: #eeeeee; +} +.descname { + font-weight: bold; +} + + +/* ========================================================================= + * Table of Contents + * ========================================================================= */ +/* Global */ +.toctree-wrapper { + padding-bottom: 3em; +} +.toctree-wrapper ul { + list-style-type:none; + padding-bottom: 0; +} +/* +.toctree-l1 { + margin-bottom: 1em; +} +*/ +.toctree-l2 { + padding-left: 2em; +} + +/* Local */ +li > ul > li { + padding-left: 2em; +} + +div.document .contents { + margin-bottom: 5em; +} +div.document .topic-title { + margin-top: 2em; + font-weight: bold; +} +.contents ul { + list-style-type:none; + padding-bottom: 0; +} + + + +/* ------------------------------------------------------------------------- + Admonition + ------------------------------------------------------------------------- */ +div.admonition, div.note { + float: left; + line-height: 1.5em; + font-size: 80%; + margin: 0; + padding: 3px 5px; + margin-left: -220px; + width: 200px; + border-left: 1px solid #cccccc; +} +div.admonition p, div.note p { + text-align: left; + margin: 0; + padding: 0; +} + +div.admonition .first, div.note .first { + font-weight: bold; +} + + + +/* ------------------------------------------------------------------------- + Header + ------------------------------------------------------------------------- */ +div.header { + padding-top: 25px; + padding-left:15px; +} + +/* ------------------------------------------------------------------------- + Footer + ------------------------------------------------------------------------- */ +div.footer { + font-family: "futura", "lucida grande", "lucida sans unicode", + verdana, arial, helvetica, sans-serif; + font-size: 75%; + line-height: 1.5em; + position: fixed; + left: 0; + bottom: 0; + background-color: #EEE; + width: 100%; + border-top: 1px solid; +} +div.footer table { + width: 98%; + margin: auto; +} +div.footer table td a { + color: #777; + text-decoration: none; +} +div.footer td.left { + text-align: left; + width: 25%; +} +div.footer td.center { + text-align: center; + width: 50%; +} +div.footer .current { + background: black; + color:white; + margin: 0; + padding-right: .25em; + padding-left: .25em; +} + +div.footer td.center a { + padding-right: .25em; + padding-left: .25em; +} + +div.footer td.right { + text-align: right; + width: 25%; +} diff --git a/reset.css b/reset.css new file mode 100644 index 0000000..8589ebd --- /dev/null +++ b/reset.css @@ -0,0 +1,35 @@ +/* http://meyerweb.com/eric/tools/css/reset/ + v2.0 | 20110126 + License: none (public domain) +*/ +html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video, ul, ol { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; +} +/* HTML5 display-role reset for older browsers */ +article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section { + display: block; +} +body { + line-height: 1; +} +ul { + list-style: none; +} + + +blockquote, q { + quotes: none; +} +blockquote:before, blockquote:after, q:before, q:after { + content: ''; + content: none; +} +table { + border-collapse: collapse; + border-spacing: 0; +}