2012-09-10 12 views
8

Actualmente tengo el siguiente fragmento:¿Cómo puedo producir un buen resultado de una matriz numpy?

#!/usr/bin/python 
# -*- coding: utf-8 -*- 

import numpy 
from numpy import linalg 

A = [[1,2,47,11],[3,2,8,15],[0,0,3,1],[0,0,8,1]] 
S = [[113,49,2,283],[-113,0,3,359],[0,5,0,6],[0,20,0,12]] 

A = numpy.matrix(A) 
S = numpy.matrix(S) 

numpy.set_printoptions(precision=2, suppress=True, linewidth=120) 
print("S^{-1} * A * S") 
print(linalg.inv(S) * A * S) 

que produce esta salida:

python output

¿Hay una manera estándar para producir una salida similar a la siguiente? ¿Cómo puedo obtener esta salida?

[[ -1 -0.33 0 0] 
[ 0  1  0 0] 
[ 0 -648  4 0] 
[ 0  6.67 0 5]] 

¿Qué es diferente?

  • Al menos dos espacios entre el último carácter de la columna i y el primer carácter de la columna i+1, pero podría ser más si se necesita más (salida NumPy hace dos espacios)
  • los puntos están alineados (La están alineadas, pero la configuración de la fuente de BetterPythonConsole líos para arriba)
  • Sin -0 pero 0
  • Sin 0. pero 0

edición: Parece como si la consola de Python, que se inicia con gEdits BetterPythonConsole plug-in hace algo diferente de Python, cuando lo comienzo de la terminal.

Ésta es la salida como texto del script anterior

[email protected]:~/Desktop$ python matrixScript.py 
S^{-1} * A * S 
[[ -1.  -0.33 0.  -0. ] 
[ 0.  -1.  -0.  0. ] 
[ 0. -648.  4.  -0. ] 
[ 0.  6.67 0.  5. ]] 

Con prettyprint:

S^{-1} * A * S 
matrix([[ -1. , -0.33, 0. , -0. ], 
     [ 0. , -1. , -0. , 0. ], 
     [ 0. , -648. , 4. , -0. ], 
     [ 0. , 6.67, 0. , 5. ]]) 

Ésta es defenitely peor, pero valía la pena intentarlo.

+0

posible duplicado de [Impresión bonita de numpy.array] (http://stackoverflow.com/questions/2891790/pretty-printing-of-numpy-array) – Chris

+2

Esto no es un duplicado. He leído esta pregunta (y la respuesta), pero no proporciona el formato suficiente. –

+0

¿Has probado 'pprint'? http://stackoverflow.com/questions/1523660/how-to-print-a-list-in-python-nicely –

Respuesta

4

Si usa numpy 1.8.x, puede personalizar el formateo con el parámetro formatter. Por ejemplo, establecer:

numpy.set_printoptions(formatter={'float': lambda x: 'float: ' + str(x)}) 

Todos los flotadores saldría impreso como float: 3.0, o float: 12.6666666666.

Desafortunadamente todavía tengo Numpy 1.6.1 instalado y esta opción no se proporciona, por lo que no puedo usarlo para obtener el resultado deseado.

+0

Tengo Numpy 1.6.1, también. –

+0

Supongo que actualizar mi sistema sería la mejor opción ya que todos los demás problemas en el formateo parecen estar relacionados con 'BetterPythonConsole'. –

+0

Sí, probablemente la otra opción sería escribir una función 'format' personalizada para ser utilizada con matrices numpy. Lo cual puede no ser muy difícil de escribir, pero si desea que sea un poco general para posibles usos futuros, no es algo que escriba en 2 minutos. Esperemos que la actualización le brinde otros beneficios además de este. – Bakuriu

Cuestiones relacionadas