/ / Diagrama de contorno, error de tipo: La longitud de y debe ser el número de filas en z - python, arrays, numpy, plot

Diagrama de contorno, TypeError: La longitud de y debe ser el número de filas en z - python, arrays, numpy, plot

He creado una función con dos argumentos, func(x,y). Ahora me gustaría trazar esto como un gráfico de contorno 2D, primero como func(x,y) vs. x, y entonces func(x,y) vs. y.

Configuré mi matriz numpy para valores de x como 20 valores de 5e4 a 8e4, y los valores de y como 20 valores de 1e10 a 1e12. Mi funcion func(x,y) luego toma estas dos matrices como argumentos.

Así, configuro mi trama de la siguiente manera:

import matplotlib
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.cm as cm
import matplotlib.mlab as mlab

matplotlib.rcParams["xtick.direction"] = "out"
matplotlib.rcParams["ytick.direction"] = "out"

x = np.logspace( 5e4, 8e4, num=20)
y = np.logspace(1e10, 1e12, num=20)
z = np.asarray([ func(x, y), x ])
plt.figure()
CS = plt.contour(x, y, z)
plt.clabel(CS, inline=1, fontsize=10)

Las formas para mis matrices numpy son:

print x.shape
print y.shape
print z.shape

que salidas

(20,)
(20,)
(2, 20)

Mi error es

TypeError: Length of y must be number of rows in z.

¿Por qué sería eso? Las dimensiones parecen correctas.

Respuestas

1 para la respuesta № 1

De los documentos para contour: "X y Y ambos deben ser 2-D con la misma forma que Z, o ambos deben ser 1-D, de modo que len (X) es el número de columnas en Z y len (Y) es el número de filas en Z."(Esta es la versión para 1D X e Y.)

Tu problema básico aquí es que Z Necesita ser rectangular, así que probablemente 20x20 en tu caso. Es decir, piense en un diagrama de contorno como poner niveles en algo como una imagen.

Lo mejor que puedo entender, aquí está una versión de trabajo que está en la línea de lo que quieres:

enter image description here

import pylab as pb
import numpy as np
import matplotlib.pyplot as plt

def f(x, y):
return np.log(x**2 + y**2)

x = np.logspace( np.log10(5e4), np.log10(8e4), num=20)
y = np.logspace(np.log10(5e4), np.log10(9e4), num=20)
X, Y = np.meshgrid(x, y)

z = f(X, Y)
print x
print y
print min(z.flat), max(z.flat), min(x), max(x), min(y), max(y)

plt.figure()
CS = plt.contour(x, y, z)
plt.clabel(CS, inline=1, fontsize=10)

pb.show()

Creo que la clave que no estás usando. meshgrid (aunque hay otros medios para conseguir esto también).