logo

Funció Numpy Meshgrid

Elnumpy.meshgrid>La funció s'utilitza per crear una graella rectangular a partir de dues matrius unidimensionals donades que representen la indexació cartesiana o la indexació matricial. La funció Meshgrid està una mica inspirada en MATLAB. Considereu la figura següent amb l'eix X que va de -4 a 4 i l'eix Y que va de -5 a 5. Per tant, hi ha un total de (9 * 11) = 99 punts marcats a la figura cadascun amb una coordenada X i una coordenada Y. Per a qualsevol recta paral·lela a l'eix X, les coordenades X dels punts marcats són respectivament -4, -3, -2, -1, 0, 1, 2, 3, 4. D'altra banda, per a qualsevol recta paral·leles a l'eix Y, les coordenades Y dels punts marcats de baix a dalt són -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5.numpy.meshgrid>La funció retorna dues matrius bidimensionals que representen les coordenades X i Y de tots els punts. Exemples:

Entrada: x = [-4, -3, -2, -1, 0, 1, 2, 3, 4] y = [-5, -4, -3, -2, -1, 0, 1, 2, 3 , 4, 5] Sortida: x_1 = array([[-4., -3., -2., -1., 0., 1., 2., 3., 4.], [-4., -3., -2. , -1., 0., 1., 2., 3., 4.], [-4., -3., -2., -1., 0., 1., 2., 3., 4.], [-4., -3., -2., -1., 0., 1., 2., 3., 4.], [-4., -3., -2., -1., 0., 1., 2., 3., 4.], [-4., -3., -2., -1., 0., 1., 2., 3., 4.] .], [-4., -3., -2., -1., 0., 1., 2., 3., 4.], [-4., -3., -2., - 1., 0., 1., 2., 3., 4.], [-4., -3., -2., -1., 0., 1., 2., 3., 4. ], [-4., -3., -2., -1., 0., 1., 2., 3., 4.], [-4., -3., -2., -1 ., 0., 1., 2., 3., 4.]]) i_1 = array([[-5., -5., -5., -5., -5., -5., - 5., -5., -5.], [-4., -4., -4., -4., -4., -4., -4., -4., -4.], [-3., -3., -3., -3., -3., -3., -3., -3., -3.], [-2., -2., -2. , -2., -2., -2., -2., -2., -2.], [-1., -1., -1., -1., -1., -1. , -1., -1., -1.], [ 0., 0., 0., 0., 0., 0., 0., 0., 0.], [ 1., 1., 1., 1., 1., 1., 1., 1., 1.], [ 2., 2., 2., 2., 2., 2., 2., 2., 2.] , [ 3., 3., 3., 3., 3., 3., 3., 3., 3.], [ 4., 4., 4., 4., 4., 4., 4 ., 4., 4.], [ 5., 5., 5., 5., 5., 5., 5., 5., 5.]]) Entrada: x = [0, 1, 2, 3, 4, 5] y = [2, 3, 4, 5, 6, 7, 8] Sortida: x_1 = array([[0., 1., 2., 3., 4., 5.], [0., 1., 2., 3., 4., 5.], [0., 1 ., 2., 3., 4., 5.], [0., 1., 2., 3., 4., 5.], [0., 1., 2., 3., 4. , 5.], [0., 1., 2., 3., 4., 5.], [0., 1., 2., 3., 4., 5.]]) i_1 = array( [[2., 2., 2., 2., 2., 2.], [3., 3., 3., 3., 3., 3.], [4., 4., 4. , 4., 4., 4.], [5., 5., 5., 5., 5., 5.], [6., 6., 6., 6., 6., 6.] , [7., 7., 7., 7., 7., 7.], [8., 8., 8., 8., 8., 8.]]

A continuació es mostra el codi:
# Sample code for generation of first example> import> numpy as np> # from matplotlib import pyplot as plt> # pyplot imported for plotting graphs> > x>=> np.linspace(>->4>,>4>,>9>)> > # numpy.linspace creates an array of> # 9 linearly placed elements between> # -4 and 4, both inclusive> y>=> np.linspace(>->5>,>5>,>11>)> > # The meshgrid function returns> # two 2-dimensional arrays> x_1, y_1>=> np.meshgrid(x, y)> > print>(>'x_1 = '>)> print>(x_1)> print>(>'y_1 = '>)> print>(y_1)>
   Output:  x_1 = [[-4. -3. -2. -1. 0. 1. 2. 3. 4.] [-4. -3. -2. -1. 0. 1. 2. 3. 4.] [-4. -3. -2. -1. 0. 1. 2. 3. 4.] [-4. -3. -2. -1. 0. 1. 2. 3. 4.] [-4. -3. -2. -1. 0. 1. 2. 3. 4.] [-4. -3. -2. -1. 0. 1. 2. 3. 4.] [-4. -3. -2. -1. 0. 1. 2. 3. 4.] [-4. -3. -2. -1. 0. 1. 2. 3. 4.] [-4. -3. -2. -1. 0. 1. 2. 3. 4.] [-4. -3. -2. -1. 0. 1. 2. 3. 4.] [-4. -3. -2. -1. 0. 1. 2. 3. 4.]] y_1 = [[-5. -5. -5. -5. -5. -5. -5. -5. -5.] [-4. -4. -4. -4. -4. -4. -4. -4. -4.] [-3. -3. -3. -3. -3. -3. -3. -3. -3.] [-2. -2. -2. -2. -2. -2. -2. -2. -2.] [-1. -1. -1. -1. -1. -1. -1. -1. -1.] [ 0. 0. 0. 0. 0. 0. 0. 0. 0.] [ 1. 1. 1. 1. 1. 1. 1. 1. 1.] [ 2. 2. 2. 2. 2. 2. 2. 2. 2.] [ 3. 3. 3. 3. 3. 3. 3. 3. 3.] [ 4. 4. 4. 4. 4. 4. 4. 4. 4.] [ 5. 5. 5. 5. 5. 5. 5. 5. 5.]]  The output of coordinates by meshgrid can also be used for plotting functions within the given coordinate range.  An Ellipse:          ellipse = xx * 2 + 4 * yy**2 plt.contourf(x_1, y_1, ellipse, cmap = 'jet')    plt.colorbar()  plt.show()       Output:  Random Data:         random_data = np.random.random((11, 9))  plt.contourf(x_1, y_1, random_data, cmap = 'jet')    plt.colorbar()  plt.show()       Output:  A Sine function:          sine = (np.sin(x_1**2 + y_1**2))/(x_1**2 + y_1**2)  plt.contourf(x_1, y_1, sine, cmap = 'jet')    plt.colorbar()  plt.show()       Output:   We observe that x_1 is a row repeated matrix whereas y_1 is a column repeated matrix. One row of x_1 and one column of y_1 is enough to determine the positions of all the points as the other values will get repeated over and over. So we can edit above code as follows: x_1, y_1 = np.meshgrid(x, y, sparse = True) This will produce the following output:  x_1 = [[-4. -3. -2. -1. 0. 1. 2. 3. 4.]] y_1 = [[-5.] [-4.] [-3.] [-2.] [-1.] [ 0.] [ 1.] [ 2.] [ 3.] [ 4.] [ 5.]] The shape of x_1 changed from (11, 9) to (1, 9) and that of y_1 changed from (11, 9) to (11, 1) The indexing of Matrix is however different. Actually, it is the exact opposite of Cartesian indexing.  For the matrix shown above, for a given row Y-coordinate increases as 0, 1, 2, 3 from left to right whereas for a given column X-coordinate increases from top to bottom as 0, 1, 2. The two 2-dimensional arrays returned from Matrix indexing will be the transpose of the arrays generated by the previous program. The following code can be used for obtaining Matrix indexing:         # Sample code for generation of Matrix indexing  import numpy as np      x = np.linspace(-4, 4, 9)  # numpy.linspace creates an array  # of 9 linearly placed elements between  # -4 and 4, both inclusive  y = np.linspace(-5, 5, 11)    # The meshgrid function returns  # two 2-dimensional arrays  x_1, y_1 = np.meshgrid(x, y)      x_2, y_2 = np.meshgrid(x, y, indexing = 'ij')    # The following 2 lines check if x_2 and y_2 are the  # transposes of x_1 and y_1 respectively  print('x_2 = ')  print(x_2)  print('y_2 = ')  print(y_2)    # np.all is Boolean and operator;  # returns true if all holds true.  print(np.all(x_2 == x_1.T))  print(np.all(y_2 == y_1.T))       Output:  x_2 = [[-4. -4. -4. -4. -4. -4. -4. -4. -4. -4. -4.] [-3. -3. -3. -3. -3. -3. -3. -3. -3. -3. -3.] [-2. -2. -2. -2. -2. -2. -2. -2. -2. -2. -2.] [-1. -1. -1. -1. -1. -1. -1. -1. -1. -1. -1.] [ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] [ 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.] [ 2. 2. 2. 2. 2. 2. 2. 2. 2. 2. 2.] [ 3. 3. 3. 3. 3. 3. 3. 3. 3. 3. 3.] [ 4. 4. 4. 4. 4. 4. 4. 4. 4. 4. 4.]] y_2 = [[-5. -4. -3. -2. -1. 0. 1. 2. 3. 4. 5.] [-5. -4. -3. -2. -1. 0. 1. 2. 3. 4. 5.] [-5. -4. -3. -2. -1. 0. 1. 2. 3. 4. 5.] [-5. -4. -3. -2. -1. 0. 1. 2. 3. 4. 5.] [-5. -4. -3. -2. -1. 0. 1. 2. 3. 4. 5.] [-5. -4. -3. -2. -1. 0. 1. 2. 3. 4. 5.] [-5. -4. -3. -2. -1. 0. 1. 2. 3. 4. 5.] [-5. -4. -3. -2. -1. 0. 1. 2. 3. 4. 5.] [-5. -4. -3. -2. -1. 0. 1. 2. 3. 4. 5.]] True True  The sparse = True can also be added in the meshgrid function of Matrix indexing. In this case, the shape of x_2 will change from (9, 11) to (9, 1) and that of y_2 will change from (9, 11) to (1, 11).>