¿Cómo separar parte real e imaginaria en SymPy?

Andaba yo preguntándome esta mañana, a falta (¡sorprendentemente!) de dudas de los lectores:

Si tengo un número complejo en SymPy, ¿cómo puedo separar la parte real y la parte imaginaria? Y ya puestos, ¿puedo separar también el módulo y el argumento?

Si utilizamos el tipo complex de Python el resultado es correcto pero puede no ser demasiado vistoso:

$ isympy
In [1]: (1j + 1) / (5 - 2j)
Out[1]: (0.10344827586206896+0.24137931034482757j)

Queremos usar las capacidades simbólicas de SymPy. En SymPy, como se indica en el tutorial, los complejos se declaran de esta manera:

In [2]: (1 * I + 1) / (5 - 2 * I)
Out[2]:
 1 + ⅈ
───────
5 - 2⋅ⅈ

Y ya tenemos un objeto de SymPy con toda su potencia (que además se imprime bonito). Para extraer la parte real e imaginaria podemos usar las funciones re e im o el método as_real_imag.

In [3]: a = (1 * I + 1) / (5 - 2 * I)
In [4]: re(a)
Out[4]: 3/29
In [5]: im(a)
Out[5]: 7/29
In [6]: a.as_real_imag()
Out[6]: (3/29, 7/29)

Estos métodos extraen la parte real y la imaginaria pero «pierdo» el número original. Para reescribir el número separando parte real e imaginaria lo mejor es emplear el método expand(complex=True):

In [9]: a.expand(complex=True)
Out[9]:
3    7⋅ⅈ
── + ───
29    29

Esto ya es otra cosa 😉

Continue reading

¿Cómo trabajar con arrays de binarios en Python?

Esta semana vamos con una pregunta de Gonzalo, que nos dice por email:

Saludos. Últimamente he estado trabajado en python y me gusta mucho. En estos momentos estoy haciendo un algoritmo genético con codificación en numeros binarios utilizando bitset de C++. ¿Tendran información acerca de como trabajar con cadenas de binarios en python? Gracias y Felicidades por el blog.

He investigado un poco acerca de bitset en la referencia de C++, y leo que se trata básicamente de un array de valores booleanos, optimizados para su almacenamiento en memoria.

Continue reading

¿Cómo borrar por encima de una línea en matplotlib?

Inauguramos sección nueva en el 2014 con las preguntas que nos llegan de nuestros lectores por las redes sociales o el correo electrónico 🙂 Nos llegan unas cuantas, ¡así que tenemos material para al menos una pregunta semanal! Estas serán entradas breves que publicaremos cada martes y que tratarán de responder vuestras dudas sin rodeos. ¡Si queréis mandar las vuestras no dudéis en contactar con nosotros!

Empezamos con Alberto, que me comenta:

¿Cómo puedo «borrar» lo que tengo por encima de una línea en matplotlib? He intentado con fill_between entre la línea de estabilidad funcional (línea roja) pero solo rellena con color, no sobreescribe que es lo que pretendo. ¿Se te ocurre alguna forma?

Mapa compresor - Primera versión

Alberto está escribiendo un programa para dibujar mapas de actuaciones de turbomáquinas en Python, similares a los que producen programas privativos como GSP (ejemplos) o GasTurb (ejemplos). En esos mapas aparece la línea de estabilidad funcional (surge line o stall line) por encima de la cual la turbomáquina no puede funcionar. Es preciso, por tanto, borrar todo lo que quede por encima de ella para suprimir información innecesaria del gráfico. El código es un poco complicado, así que voy a comentar solo los conceptos fundamentales.

Lo primero que hice (después de admitir que no tenía ni idea) fue intentar trabajar sobre lo que ya había intentado. Efectivamente, si usas la función fill_between el relleno se queda «por debajo» de las líneas que ya había, en lugar de taparlas. Consultando la documentación de fill_between vi que admitía un parámetro zorder, que controla la visibilidad de los elementos de la gráfica: por defecto vale 0, y cuanto mayor es más arriba aparece el elemento. Usando un valor lo suficientemente alto se llega a este resultado:

Mapa compresor - Segunda versión

Que es más o menos lo que se pretendía... pero en mi ordenador se vio el detalle fatal: el color de fondo y la rejilla quedan tapados. Esta solución no es suficiente.

Continue reading